시스템 아키텍트시스템 아키텍트

전 세계에 분산된 실시간 벡터 유사도 검색 기초 구조를 설계하여 이질적 에지 및 클라우드 환경에서 멀티모달 AI 모델의 수십억 규모 고차원 임베딩을 색인화하되, 10ms 이하의 근사 최근접 이웃 검색을 보장하고, 쿼리 지역성 패턴에 따라 동적 색인 샤딩을 구현하며, 높은 속도의 임베딩 업데이트 중 검색 작업을 차단하지 않으면서 벡터 저장소와 진실의 원천 트랜잭션 데이터베이스 간의 최종적인 일관성을 유지하는 방법은 무엇입니까?

Hintsage AI 어시스턴트로 면접 통과

질문에 대한 답변

질문의 배경

어휘 검색에서 의미 검색으로의 전환은 지난 10년 동안 데이터 인프라의 요구 사항을 근본적으로 변화시켰습니다. 초기 정보 검색은 역 인덱스와 TF-IDF 스코어링에 의존했지만, 현대의 멀티모달 AI 시스템은 종종 1000차원을 초과하는 고차원 벡터 공간에서의 근접 검색을 필요로 합니다. 이 변화는 변환기 기반 모델의 확산과 함께 심화되어 기존 데이터베이스가 효율적으로 스캔할 수 없는 수십억 개의 조밀한 임베딩을 생성하였습니다. 이 도전은 단순한 저장에서 지리적으로 분산된 노드 간의 근사 최근접 이웃 그래프를 유지하고 트랜잭션 소스 시스템과의 일관성을 보존하는 것으로 발전하였습니다.

문제

벡터 데이터베이스는 CAP 정리에 따라 독특한 제약에 직면해 있습니다. 정확한 k-최근접 이웃 계산은 데이터 세트에 대한 전역 지식이 필요하므로, 수십억 개의 벡터 규모에서 파티션 허용성과 낮은 대기 시간이 상충합니다. 고차원 임베딩은 메모리를 많이 소모하며, 보통 1024차원에서 float32를 사용하여 벡터당 4KB를 차지하여 에지 배치를 복잡하게 하는 데이터 중력 문제를 일으킵니다. 또한, "차원의 저주"는 트리 기반 공간 인덱스의 효과를 감소시켜, HNSW와 같은 그래프 기반 알고리즘이 필요하게 되었고, 이는 점진적으로 업데이트하는 데 비용이 많이 듭니다. PostgreSQL에서 가변적인 트랜잭션 데이터와 불변 벡터 인덱스 간의 일관성을 유지하는 것은 이중 쓰기 이상 현상을 가져오며, 임베딩 페이로드 크기 때문에 인덱스의 교차 지역 복제는 대역폭 비용을 악화시킵니다.

해결책

계층적 탐색 가능한 소형 세계 그래프와 제품 양자화를 사용하는 셀 기반 아키텍처는 메모리 프리즘을 90% 줄이면서 10ms 이하의 쿼리를 가능하게 합니다. 지역 벡터 셀은 Apache Kafka 스트림을 통해 임베딩을 수집하며, Debezium CDC 커넥터를 사용하여 진실의 원천 데이터베이스가 인덱스 구축 오버헤드에서 격리되도록 합니다. 동적 샤딩은 지역 민감 해싱을 사용하여 쿼리를 특정 파티션으로 라우팅하고, 검색 공간을 수십억에서 수백만의 후보로 최소화합니다. 벡터 버전 관리와 소프트 삭제 톰스톤을 포함한 최종적으로 일관된 모델은 비차단 인덱스 업데이트를 허용하며, Raft 합의는 중앙 집중된 핫 쿼리 경로 없이 셀 간의 메타데이터 변경을 조정합니다.

현실에서의 상황

문제 설명

전 세계 비주얼 커머스 플랫폼 "LuxeSearch"는 패션 및 가구 카테고리에 걸쳐 4억 개의 제품 SKU를 유지하여 사용자가 사진을 업로드하여 동일하거나 보완적인 항목을 찾는 비주얼 유사도 검색이 필요합니다. 레거시 Elasticsearch 인프라는 768차원 CLIP 임베딩을 통한 코사인 유사도 계산의 컴퓨팅 부하 아래에서 무너져, 피크 트래픽 동안 800ms의 지연 급등을 초래했습니다. 또한, 플래시 세일 동안 제품 메타데이터 업데이트가 초당 50,000건 발생하여 검색 작업과의 동시 업데이트 충돌로 인해 인덱스 손상이 발생하고, 이는 초당 200만 달러 이상의 수익 손실을 초래했습니다.

해결책 1: 모놀리식 글로벌 클러스터

초기 제안은 글로벌 CDN 엣지 캐싱을 사용하여 us-east-1에 단일 Milvus 클러스터를 배치하는 것이었습니다. 이 접근은 강력한 일관성 보장을 제공하고 단일 인덱스 상태를 유지함으로써 운영 오버헤드를 단순화했습니다. 하지만 APAC 사용자에 대한 지역 간 지연 시간이 180ms를 초과하여 모바일 앱 요구 사항인 50ms 미만을 위반하게 되었고, 휴일 쇼핑 시즌 동안 다운타임 비용이 폭발적으로 증가하는 위험이 있었습니다.

해결책 2: 야간 배치 지역 인덱스

대안 아키텍처는 S3 스냅샷에서 야간 배치 작업을 통해 재구성된 지역 FAISS 인덱스를 제안했습니다. 이는 로컬 CPU 추론을 통해 5ms 이하의 쿼리 지연 시간을 제공하고 검색 중 네트워크 왕복을 제거했습니다. 하지만 24시간 데이터 노후화가 고객 컴플레인을 초래하여 품절된 후 시각 검색 결과에 "유령 제품"이 나타나는 경우가 발생했고, 인덱스 재구성을 위한 6시간의 유지보수 시간은 99.99% 가동 시간 SLA를 위반했습니다.

선택된 해결책

팀은 쿼리 볼륨에 따라 상위 10%의 제품을 포함하는 핫 인덱스를 위한 Redis를 사용하여 자율 벡터 셀을 구현하고, 콜드 데이터에 대해 S3에 저장된 메모리 맵 HNSW 그래프에 의해 뒷받침됩니다. DebeziumPostgreSQL의 변화를 Kafka에 캡처하여 지역 로컬 인덱스 빌더에 공급하여 비동기식으로 점진적인 HNSW 업데이트를 구현합니다. 제품 양자화는 768차원 float32 벡터를 96바이트 코드로 축소하며, 정확도@10에서 98%를 보장합니다. 이 해결책은 500ms 이내에 읽기/쓰기 일관성을 제공하고, 쿼리 차단 없이 초당 10만 개의 임베딩 업데이트를 처리하며, 모든 12개 글로벌 지역에서 8ms p99 지연을 유지하기 때문에 선택되었습니다.

결과

여섯 달의 운영 후, 아키텍처는 99.97%의 가용성을 달성하고, 일일 5천만 건의 비주얼 검색을 지원하며, 지능적인 티어링을 통해 기존 제안보다 인프라 비용을 40% 줄였습니다. recall@10 메트릭은 99.2%로 안정화되어 비즈니스 요구 사항을 초과했으며, 시스템은 수동 개입이나 캐시 폭주 없이 블랙 프라이데이 동안 300% 트래픽 급증을 성공적으로 수용했습니다.

후보자들이 종종 놓치는 점

고차원 공간에서 유클리드 거리가 비효율적으로 되는 이유와 이것이 인덱스 선택에 미치는 영향은 무엇인가요?

100차원을 초과하는 고차원 공간에서 최근접 이웃과 가장 멀리 떨어진 이웃 간의 비율이 1로 수렴하는데, 이는 초구의 표면에서 부피가 집중되기 때문입니다. 이로 인해 유클리드 거리는 통계적으로 구별할 수 없게 되어 공간적으로 비정보적이 됩니다. 이러한 현상은 kd-트리나 R-트리와 같은 트리 기반 공간 파티셔닝을 무효화하며, 이는 효과적으로 검색 가지를 가지치기하기 위해 의미 있는 거리 차이에 의존합니다. 결과적으로, HNSWFAISS IVF 인덱스와 같은 그래프 기반 방법이 필요하게 되며, 이는 절대적인 좌표 거리보다는 상대적인 이웃 연결을 통해 접근성을 탐색하지만 상당히 더 많은 메모리와 복잡한 점진적 유지 관리 절차가 요구됩니다.

트랜잭션 데이터베이스와 벡터 인덱스가 원자적으로 업데이트되어야 할 경우 "이중 쓰기 문제"를 어떻게 처리합니까?

이중 쓰기 문제는 OLTP 저장소와 벡터 데이터베이스 간의 분산 트랜잭션이 실패하여 검색 결과가 삭제된 항목을 반환하거나 새로운 임베딩을 누락하는 경우에 발생합니다. 두 단계 커밋 프로토콜을 구현하는 대신, 아키텍트는 PostgreSQL이 비즈니스 데이터 변경과 동일한 ACID 트랜잭션 내에서 아웃박스 테이블에 쓰는 트랜잭션 아웃박스 패턴을 사용할 수 있습니다. Debezium은 이 아웃박스를 읽어 비동기적으로 Kafka에 게시하여 벡터 인덱스 빌더로의 정확한 딜리버리를 보장합니다. 벡터 항목에는 단조적인 버전 번호가 포함되고, 검색 API는 OLTP 메타데이터 저장소와 검증하여 결과를 필터링하여 오래된 버전을 제외하며 비차단 쿼리로 불일치 문제를 효과적으로 숨깁니다.

점진적 업데이트 중 그래프 기반 ANN 인덱스의 메모리 영향은 무엇이며, 쓰기 증폭을 어떻게 완화합니까?

HNSW 및 유사한 그래프 구조는 엣지 삽입 중 잠금 또는 복사-쓰기 메커니즘이 필요하며, 이는 계층적 탐색 가능성 속성을 유지하기 위해 수백 개의 엣지를 재연결해야 하므로 쓰기 증폭이 발생합니다. 메모리에 제약이 있는 환경에서는 작업 집합이 DRAM 용량을 초과할 때 쿼리 지연을 예측할 수 없게 만들며 페이지 오류 및 가비지 수집 압력을 초래합니다. 완화 전략에는 핫 그래프 레이어가 메모리 내에 있고, 콜드 레이어가 지속 가능한 메모리 또는 빠른 NVMe SSD에 위치하는 계층 저장소 사용; 저트래픽 기간 동안 비동기적으로 병합되는 마이크로 세그먼트로 업데이트 배치; 양자화 인식 그래프 구축을 사용하여 압축된 벡터가 그래프 토폴로지를 결정하고, 원시 벡터는 최종 재순위를 위해서만 가져오는 방식이 포함됩니다. 이렇게 하면 메모리 소비가 70% 감소하면서 타겟 리콜 메트릭을 유지합니다.