Milvus로 만들기: Trend Micro를 위한 Android 바이러스 실시간 탐지
사이버 보안은 개인과 기업 모두에게 지속적인 위협으로 남아 있으며, 2020년에 기업의 86%가 데이터 개인정보 보호에 대한 우려가 증가했다고 답했고, 소비자의 23%만이 자신의 개인 데이터가 매우 안전하다고 믿었습니다. 악성코드가 점점 더 널리 퍼지고 정교해짐에 따라, 위협 탐지에 대한 사전 예방적 접근 방식이 필수적이 되었습니다. Trend Micro는 하이브리드 클라우드 보안, 네트워크 방어, 중소기업 보안 및 엔드포인트 보안 분야의 글로벌 리더입니다. Android 기기를 바이러스로부터 보호하기 위해, 이 회사는 Google Play Store의 APK(Android Application Package)를 알려진 악성코드 데이터베이스와 비교하는 모바일 앱인 Trend Micro Mobile Security를 구축했습니다. 바이러스 탐지 시스템은 다음과 같이 작동합니다:
- Google Play Store의 외부 APK(Android application package)를 크롤링합니다.
- 알려진 악성코드는 벡터로 변환되어 Milvus에 저장됩니다.
- 새로운 APK도 벡터로 변환된 다음, 유사도 검색을 사용해 악성코드 데이터베이스와 비교됩니다.
- APK 벡터가 악성코드 벡터 중 하나와 유사하면, 앱은 사용자에게 바이러스와 그 위협 수준에 대한 상세 정보를 제공합니다.
시스템이 작동하려면 방대한 벡터 데이터셋에서 실시간으로 매우 효율적인 유사도 검색을 수행해야 합니다. 처음에 Trend Micro는 MySQL을 사용했습니다. 그러나 사업이 확장됨에 따라 데이터베이스에 저장된 악성 코드가 포함된 APK의 수도 증가했습니다. 회사의 알고리즘 팀은 MySQL의 한계를 빠르게 넘어서자 대체 벡터 유사도 검색 솔루션을 찾기 시작했습니다.
벡터 유사도 검색 솔루션 비교
사용 가능한 벡터 유사도 검색 솔루션은 여러 가지가 있으며, 그중 많은 것이 오픈 소스입니다. 상황은 프로젝트마다 다르지만, 대부분의 사용자는 광범위한 구성이 필요한 단순 라이브러리보다 비정형 데이터 처리 및 분석을 위해 구축된 벡터 데이터베이스를 활용함으로써 이점을 얻습니다. 아래에서는 몇 가지 인기 있는 벡터 유사도 검색 솔루션을 비교하고 Trend Micro가 Milvus를 선택한 이유를 설명합니다.
Faiss
Faiss는 Facebook AI Research가 개발한 라이브러리로, 밀집 벡터의 효율적인 유사도 검색 및 클러스터링을 가능하게 합니다. 이 라이브러리에 포함된 알고리즘은 집합 내 임의 크기의 벡터를 검색합니다. Faiss는 Python/numpy용 래퍼와 함께 C++로 작성되었으며, IndexFlatL2, IndexFlatIP, HNSW, IVF를 포함한 여러 인덱스를 지원합니다.
Faiss는 매우 유용한 도구이지만 한계가 있습니다. 벡터 데이터셋을 관리하기 위한 데이터베이스가 아니라 기본 알고리즘 라이브러리로만 작동합니다. 또한 대부분의 클라우드 기반 서비스의 핵심 기능인 분산 버전, 모니터링 서비스, SDK 또는 고가용성을 제공하지 않습니다.
Faiss 및 기타 ANN 검색 라이브러리 기반 플러그인
Faiss, NMSLIB 및 기타 ANN 검색 라이브러리 위에 구축된 여러 플러그인이 있으며, 이는 기반이 되는 도구의 기본 기능을 향상하도록 설계되었습니다. Elasticsearch (ES)는 Lucene 라이브러리를 기반으로 하는 검색 엔진으로, 이러한 플러그인을 다수 보유하고 있습니다. 아래는 ES 플러그인의 아키텍처 다이어그램입니다:
Elasticsearch 플러그인의 아키텍처 다이어그램.
분산 시스템에 대한 내장 지원은 ES 솔루션의 주요 장점입니다. 작성할 필요가 없는 코드 덕분에 개발자의 시간을 절약하고 기업의 비용을 줄여줍니다. ES 플러그인은 기술적으로 진보되어 있으며 널리 사용됩니다. Elasticsearch는 JSON 기반으로 쿼리를 정의하고 이해하기 쉬운 QueryDSL(domain-specific language)을 제공합니다. 전체 ES 서비스 세트를 통해 벡터/텍스트 검색을 수행하고 스칼라 데이터를 동시에 필터링할 수 있습니다.
Amazon, Alibaba, Netease는 현재 벡터 유사도 검색을 위해 Elasticsearch 플러그인에 의존하는 몇몇 대형 기술 기업입니다. 이 솔루션의 주요 단점은 높은 메모리 소비와 성능 튜닝 지원 부재입니다. 반면 JD.com은 Faiss를 기반으로 한 자체 분산 솔루션인 Vearch를 개발했습니다. 하지만 Vearch는 아직 인큐베이션 단계의 프로젝트이며 오픈 소스 커뮤니티도 비교적 비활성 상태입니다.
Milvus
Milvus는 Zilliz가 만든 오픈 소스 벡터 데이터베이스입니다. 매우 유연하고 안정적이며 놀라울 정도로 빠릅니다. Faiss, NMSLIB, Annoy와 같이 널리 채택된 여러 인덱스 라이브러리를 캡슐화함으로써 Milvus는 직관적인 API의 포괄적인 세트를 제공하여 개발자가 자신의 시나리오에 이상적인 인덱스 유형을 선택할 수 있게 합니다. 또한 분산 솔루션과 모니터링 서비스도 제공합니다. Milvus는 매우 활발한 오픈 소스 커뮤니티를 보유하고 있으며 Github에서 5.5K개 이상의 스타를 받았습니다.
Milvus가 경쟁에서 앞서다
위에서 언급한 다양한 벡터 유사도 검색 솔루션의 여러 테스트 결과를 취합했습니다. 다음 비교 표에서 볼 수 있듯이, Milvus는 10억 개의 128차원 벡터 데이터셋에서 테스트되었음에도 경쟁 솔루션보다 훨씬 빨랐습니다.
| 엔진 | 성능 (ms) | 데이터셋 크기 (백만) |
|---|---|---|
| ES | 600 | 1 |
| ES + Alibaba Cloud | 900 | 20 |
| Milvus | 27 | 1000+ |
| SPTAG | 좋지 않음 | |
| ES + nmslib, faiss | 90 | 150 |
벡터 유사도 검색 솔루션 비교.
각 솔루션의 장단점을 저울질한 후, Trend Micro는 벡터 검색 모델로 Milvus를 선택했습니다. 대규모 10억 단위 데이터셋에서 탁월한 성능을 보이는 만큼, 실시간 벡터 유사도 검색이 필요한 모바일 보안 서비스를 위해 이 회사가 Milvus를 선택한 이유는 분명합니다.
실시간 바이러스 탐지를 위한 시스템 설계
Trend Micro는 MySQL 데이터베이스에 1,000만 개 이상의 악성 APK를 저장하고 있으며, 매일 10만 개의 새 APK가 추가됩니다. 이 시스템은 APK 파일의 다양한 구성 요소에서 Thash 값을 추출하고 계산한 다음, Sha256 알고리즘을 사용해 이를 바이너리 파일로 변환하고 해당 APK를 다른 APK와 구별하는 256비트 Sha256 값을 생성하는 방식으로 작동합니다. Sha256 값은 APK 파일에 따라 달라지므로, 하나의 APK는 하나의 결합된 Thash 값과 하나의 고유한 Sha256 값을 가질 수 있습니다.
Sha256 값은 APK를 구별하는 데만 사용되며, Thash 값은 벡터 유사도 검색에 사용됩니다. 유사한 APK는 동일한 Thash 값을 가질 수 있지만 서로 다른 Sha256 값을 가질 수 있습니다.
악성 코드가 포함된 APK를 탐지하기 위해 Trend Micro는 유사한 Thash 값과 그에 해당하는 Sha256 값을 검색하는 자체 시스템을 개발했습니다. Trend Micro는 Thash 값에서 변환된 대규모 벡터 데이터셋에 대해 즉각적인 벡터 유사도 검색을 수행하기 위해 Milvus를 선택했습니다. 유사도 검색이 실행된 후, 해당 Sha256 값은 MySQL에서 쿼리됩니다. 또한 Thash 값을 Sha256 값에 매핑하기 위해 Redis 캐싱 계층이 아키텍처에 추가되어 쿼리 시간이 크게 단축됩니다.
아래는 Trend Micro의 모바일 보안 시스템 아키텍처 다이어그램입니다.
Trend Micro Mobile Security의 아키텍처 다이어그램.
적절한 거리 메트릭을 선택하면 벡터 분류 및 클러스터링 성능을 향상하는 데 도움이 됩니다. 다음 표는 바이너리 벡터와 함께 작동하는 거리 메트릭과 해당 인덱스를 보여줍니다.
| 거리 메트릭 | 인덱스 유형 |
|---|---|
| - Jaccard - Tanimoto - Hamming | - FLAT - IVF_FLAT |
| - Superstructure - Substructure | FLAT |
바이너리 벡터용 거리 메트릭 및 인덱스.
Trend Micro는 Thash 값을 이진 벡터로 변환하여 Milvus에 저장합니다. 이 시나리오에서 Trend Micro는 Hamming distance를 사용하여 벡터를 비교합니다.
Milvus는 곧 문자열 벡터 ID를 지원할 예정이며, 정수 ID를 문자열 형식의 해당 이름에 매핑할 필요가 없어집니다. 이를 통해 Redis 캐싱 계층이 불필요해지고 시스템 아키텍처가 덜 복잡해집니다.
Trend Micro는 클라우드 기반 솔루션을 채택하고 많은 작업을 Kubernetes에 배포합니다. 고가용성을 달성하기 위해 Trend Micro는 Python으로 개발된 Milvus 클러스터 샤딩 미들웨어인 Mishards를 사용합니다.
Milvus의 Mishards 아키텍처.
Trend Micro는 AWS에서 제공하는 EFS (Elastic File System)에 모든 벡터를 저장하여 스토리지와 거리 계산을 분리합니다. 이러한 방식은 업계에서 인기 있는 추세입니다. Kubernetes는 여러 읽기 노드를 시작하는 데 사용되며, 이러한 읽기 노드에 LoadBalancer 서비스를 개발하여 고가용성을 보장합니다.
데이터 일관성을 유지하기 위해 Mishards는 단 하나의 쓰기 노드만 지원합니다. 그러나 여러 쓰기 노드를 지원하는 Milvus의 분산 버전이 향후 몇 달 내에 제공될 예정입니다.
모니터링 및 알림 기능
Milvus는 Prometheus 기반으로 구축된 모니터링 시스템과 호환되며, 시계열 분석을 위한 오픈 소스 플랫폼인 Grafana를 사용하여 다양한 성능 지표를 시각화합니다.
Prometheus는 다음 지표를 모니터링하고 저장합니다:
- 삽입 속도, 쿼리 속도, Milvus 가동 시간을 포함한 Milvus 성능 지표.
- CPU/GPU 사용량, 네트워크 트래픽, 디스크 액세스 속도를 포함한 시스템 성능 지표.
- 데이터 크기와 총 파일 수를 포함한 하드웨어 스토리지 지표.
모니터링 및 알림 시스템은 다음과 같이 작동합니다:
- Milvus 클라이언트가 사용자 지정 지표 데이터를 Pushgateway로 푸시합니다.
- Pushgateway는 수명이 짧고 일시적인 지표 데이터가 Prometheus로 안전하게 전송되도록 보장합니다.
- Prometheus는 Pushgateway에서 데이터를 계속 가져옵니다.
- Alertmanager는 다양한 지표에 대한 알림 임계값을 설정하고 이메일 또는 메시지를 통해 경보를 발생시킵니다.
시스템 성능
Milvus 기반으로 구축된 ThashSearch 서비스가 처음 출시된 지 몇 달이 지났습니다. 아래 그래프는 엔드 투 엔드 쿼리 지연 시간이 95밀리초 미만임을 보여줍니다.
Milvus 기반으로 구축된 Thash 검색 서비스의 쿼리 지연 시간.
삽입도 빠릅니다. 300만 개의 192차원 벡터를 삽입하는 데 약 10초가 걸립니다. Milvus의 도움으로 시스템 성능은 Trend Micro가 설정한 성능 기준을 충족할 수 있었습니다.
언제든지 찾아주세요
계속 읽기

Why We Built Vector Lakebase: Rethinking Unstructured Data Architecture for AI
Vector Lakebase: a unified, lake-native data foundation for AI workloads — and an answer to what happens after vector databases succeed.
Milvus/Zilliz + Surveillance: How Vector Databases Transform Multi-Camera Tracking
See how Milvus vector database enhances multi-camera tracking with similarity-based matching for better surveillance in retail, warehouses and transport hubs.

OpenAI o1: What Developers Need to Know
In this article, we will talk about the o1 series from a developer's perspective, exploring how these models can be implemented for sophisticated use cases.



