Y
e.
embeddings.socialpgvectorから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で変わらず。インフラの複雑度が上がったのは事実だが、それだけの価値はあった。