Weaviateの内部構造 ― ノード/シャーディング/レプリケーション
1. ノード(Node)の役割と構成
-
プロセス単位のデータベースサーバ
Weaviate クラスターは複数のノード(コンテナまたは VM 上の Weaviate プロセス)で構成されます。各ノードは データ平面(実データの保持・検索)と メタデータ平面(スキーマやクラスタ状態)の双方を担当します。メタデータは Raft により厳密に複製され、データは後述のリーダーレス方式で複製されます。weaviate.io -
ノード間通信
ノード検出・存活監視には Hashicorp Memberlist を使った ゴシップ・プロトコルを採用し、Kubernetes では StatefulSet+Headless Service で自動的に名前解決が行われます。weaviate.io -
1 ノード内のストレージ階層
ノードが保持する シャード (Shard) は下記 3 コンポーネントで構成されます。-
オブジェクトストア ― LSM-Tree ベースの KV ストア
-
インバーテッドインデックス ― 構造化検索・フィルタ用
-
ベクトルインデックス ― HNSW など ANN 検索用(プラガブル)weaviate.ioweaviate.io
-
2. シャーディング(Sharding)
-
クラス単位で分割可能
スキーマ上の 1 クラス ≒ 1 インデックス であり、その内部を任意個数のシャードに分割できます。シャードは自己完結型のストレージ単位で、ノード間に自動分散されます。weaviate.ioweaviate.io -
スケールアウトの主目的
-
最大データセット容量の拡大:HNSW グラフのメモリフットプリントを複数ノードに分散。
-
マルチテナンシー:各テナントを専用シャードに隔離。
-
柔軟な負荷分散:大規模データでもインポート・クエリを並列化。weaviate.io
-
-
実装メモ
-
シャーディング機能は v1.8.0 で正式追加。
-
シャードマッピングはオブジェクト挿入時にハッシュで決定し、クエリ時はブロードキャスト or ルーティングで統合。
-
3. レプリケーション(Replication)
-
二層構造の複製モデル
レイヤ 方式 一貫性 用途 クラスタメタデータ Raft 強い スキーマ, テナント状態 オブジェクト/ベクトルデータ リーダーレス (Dynamo 型) チューナブル (ONE/QUORUM/ALL 等) 検索・保存データ -
レプリケーション・ファクタ (RF)
RF > 1を設定すると、同一シャードのレプリカが複数ノードに作成されます。これにより:-
高可用性 (HA) ― ノード障害時もサービス継続
-
リードスループット向上 ― 読み取り負荷の水平分散
-
ローリングアップグレード ― 無停止でバージョン更新
-
リージョン分散 ― マルチデータセンタ配置で待ち時間短縮 weaviate.io
-
-
書き込み/読み取りフロー
-
書き込み:クライアントは任意のノードへ送信 → ノードがすべてのレプリカに非同期ファンアウト → RF に応じて確認応答。
-
読み取り:要求された整合性レベルに達するまで複数レプリカからデータを取得。
-
4. シャーディングとレプリケーションの組み合わせ
-
例: 3 シャード × RF=2 × 6 ノードの場合
-
各シャードは 2 レプリカを持ち、計 6 インスタンスが 6 ノードにバランスよく配置。
-
失われたノードがあれば残存レプリカから自動リペア。
-
シャード増加でデータ容量を、RF 調整で可用性・読み取り性能を独立にチューニング可能。
-
5. フォルトトレランスと運用ポイント
-
メタデータの強整合性:Raft がリーダ選出・ログ複製を行うため、スキーマ不整合は起こりにくい。
-
データ層は可用性優先:CAP 定理上、Weaviate は A/P 寄りに設計。必要に応じて整合性レベルを引き上げて運用する。weaviate.io
-
オートリバランス:ノード追加・削除時、シャード移動とレプリカ再配置が自動実行される。
-
Kubernetes 連携:StatefulSet がノード ID を固定し、ディスクを再利用して素早く復旧可能。weaviate.io
これらの仕組みにより Weaviate は スケールアウト性能 と 高可用性 を両立しつつ、検索性能を犠牲にしないアーキテクチャを実現しています。
ChatGPT4o 生成日:2025/06/20