Y
e.
embeddings.social
pgvectorからQdrantへ:100万ベクターのマイグレーション実戦記14 min read

pgvectorからQdrantへ:100万ベクターのマイグレーション実戦記

박준혁
@junhyuk_infra
KO
この記事はEmbeddingsで翻訳されました · KO

10万ベクターまではpgvectorで十分だった。しかしサービスが成長してベクター数が100万を超えると、p99レイテンシが80msまで跳ね上がった。

マイグレーション戦略

無停止切り替えのためにdual-write方式を採用した。

pythonoriginal preserved
def insert_embedding(id, vector, payload):
    pgvector_client.insert(id, vector)
    qdrant_client.upsert(id, vector, payload)

既存データのマイグレーション

pythonoriginal preserved
BATCH_SIZE = 1000
offset = 0
while True:
    rows = db.execute(
        "SELECT id, embedding FROM posts LIMIT %s OFFSET %s",
        (BATCH_SIZE, offset)
    )
    if not rows: break
    qdrant_client.upsert_batch(rows)
    offset += BATCH_SIZE

結果

マイグレーション後のp99レイテンシ:80ms → 9ms。recall@10は0.97で変わらず。インフラの複雑度が上がったのは事実だが、それだけの価値はあった。