HN 日本語サマリー

← 一覧へ戻る
プログラミング

Slater – 読み込み負荷の高いグラフ向けに設計された低メモリグラフデータベース

Slater – Low-memory graphdb designed for read-heavy graphs (github.com)

34 pointsby rickkjp9 コメント

要約

Slaterは、メモリに収まらない大規模グラフ(数百ミリオンノード、数十億エッジ)を、わずか数百MBのRAMで提供するグラフデータベースです。標準Boltプロトコルに対応しているため、既存のNeo4jドライバーがそのまま利用可能です。ディスクネイティブなベクトル検索も統合されており、耐久性のあるライブ書き込みにも対応しています。メモリ使用量はグラフサイズではなく、ユーザーが設定したキャッシュ予算によって決まります。

全文翻訳

Slater 現在のバージョン:v0.24.1 — 全リリース 一言で言うと:Slaterは、メモリに収まらないグラフ(数百ミリオンノード、数十億エッジ)を、わずか数百MBのRAMで標準Bolt経由で提供するため、任意のneo4jドライバーがそのまま動作します。ディスクネイティブなベクトル検索がグラフの隣にあり、読み込み性能を損なうことなくライブで耐久性のある書き込みが可能です。常駐メモリは、グラフのサイズではなく、選択したキャッシュ予算によって設定されます。 ショートカット Slaterが存在する理由 読み込みと書き込み 得られるもの 機能 仕組み 書き込み可能なレイヤー ストレージバックエンド マウント ACL ヘルスチェック 実例 開発 パフォーマンス ライセンス 📖 完全マニュアル Slaterが存在する理由 グラフデータベースは、ノード(エンティティ)とそれらの間の関係(エッジ)としてデータを格納し、関係をファーストクラス市民として扱います。これは、行ではなく接続に関する質問をする場合に役立ちます。「このアカウントから3ホップ以内の人は?」「このビルドの背後にある完全な依存関係チェーンは?」「アカウント、住所、カードを共有しているアカウントは?」といったクエリは、SQLでは再帰的な結合の泥沼になりますが、グラフでは自然に解決できます。 グラフデータベースに関する最も一般的な不満は、RAMに収まるサイズを超えるとスケーリングしないことです。多くのグラフデータベース(例:neo4j、Memgraph、FalkorDBなど)は、グラフ全体を常駐させます。40 GBのグラフには、インスタンスあたり40 GBのメモリが必要です。リージョンごと、テナントごと、またはポッドごとにレプリカが必要ですか?請求額は倍増します。そして、あるサイズを超えるとロードできなくなります。例えば、9000万ノード/15億エッジのWikidataグラフは約64〜128 GiBの常駐メモリを必要とするため、インメモリエンジンではまったく開けません。 Slaterはこの状況への反論です。オンディスクイメージからオンデマンドでグラフをページングするため、グラフ全体を常駐させるのではなく、数百MBのRAMから同じ9000万ノードのグラフを提供します。これにより、グラフサイズとメモリ費用が切り離されます。 Slaterは逆のアプローチを取ります。グラフはオフラインでslater-buildを使用してコンテンツアドレス指定可能なオンディスクイメージに一度コンパイルされます。その後、多数のSlaterサーバーがBolt経由(既存のneo4jドライバーがそのまま動作する)でそれをサービスし、メモリ内には固定のキャッシュ予算のみを保持します。4 GBのグラフと400 GBのグラフは、同じRAMコストでサービスされます。安価でステートレスな読み込みレプリカをファンアウトし、グラフをストアに保持させます。これにより、RAGのバックエンドとしてのナレッジグラフ、レコメンデーショングラフ、IDグラフ、依存関係グラフなど、大規模で接続された、安価かつ頻繁にクエリしたいあらゆるものに自然に適合します。ディスクネイティブなベクトル検索はグラフのすぐ隣に配置されるため、同じエンジンが埋め込みの検索レイヤーとしても機能します。 読み込みと書き込み Slaterは読み書き可能なグラフデータベースです。1つのプロパティを修正したり、ノードを追加したり、エッジを削除したりするためにグラフ全体を再構築する必要はありません。変更はBolt経由で直接書き込まれ、耐久性をもって保存されます。トリックは、書き込みが読み込みパスに決して負荷をかけないことです。書き込みは、不変コアの上にログ構造化マージ(LSM)レイヤーに蓄積されます。書き込みは、ライトアヘッドログとインメモリテーブルからなり、不変のデルタセグメントにスピルされ、定期的なコンソリデーションによって新しいコアに折りたたまれます。 これにより得られるもの: 書き込みのないグラフに対する読み込みは、以前とまったく同じコストです。空のデルタは、単一の予測可能なブランチであり、マージではありません。書き込み可能なレイヤーが存在するかどうかにかかわらず、読み込みパスはバイト単位で同一です。書き込みの読み込みコストは、グラフのサイズではなく、デルタのサイズに比例します。グラフ全体の回答(count(*)、ラベルおよびリレーションシップタイプの周辺統計)は、書き込みが保留中でもメタデータ読み込みのままです。デルタは独自のカウンターを保持するため、50万件の保留中の書き込みがある9160万ノードのコアに対するcount(*)も、1ブロックも触れることなく数十ミリ秒で回答されます。 承認済みは耐久性を意味します。単一のライターはキューをドレインし、書き込みをカバーするfsync後にのみSUCCESSを返します。書き込みをグループ化すると、行あたりではなくバッチあたり1回のfsyncでコミットされるため、コストが削減されます。 ビジネスキー書き込み、どちらのダイアレクトでも。MERGE / MATCH … SET / DELETE(およびCREATE / REMOVE、デタッチ削除、リレーションシップ書き込み)は、ノードのIDプロパティをキーとして使用します。または、同等のISO GQLデータ変更ステートメント(INSERT / SET / REMOVE / DELETE)も同じパスに低下します。データが既に存在する形式で、ノードとエッジに対して、挿入、更新、アップサート、および削除を行います。 書き込み可能なレイヤーはオプトイン(delta.enabled)です。無効にすると、Slaterは純粋な不変コアをサービスし、書き込みを拒否します。「書き込み可能なレイヤー」を参照して、完全なモデルを確認してください。 名前について。 Slaterは、Archer(素晴らしいショー)のCIAエージェントにちなんで名付けられました。彼は「スレーター」という単一の名前で通すことを主張します。私の好きなキャラクターの一人です。キャラクターのWikiページを参照してください。 得られるもの RAMはキャッシュ予算によって設定され、グラフサイズには依存しません。好きなだけ読み込みレプリカをファンアウトできます。グラフ全体をメモリに収める必要はありません。 グラフのドロップイン対応:Boltを話すため、標準のneo4jドライバー(JS、Python、Go…)が変更なしで動作します。Cypher(およびISO GQLの一部、読み書き)です。学習する新しいことはありません。 ライブで耐久性のある書き込み:不変コアの上にオプトインのLSMレイヤー(delta.enabled)。ビジネスキーのMERGE / SET / DELETE / CREATE / REMOVEをノードとエッジに対して、バッチ処理され、fsyncで耐久性があり、コンソリデーションによって新しいコアに折りたたまれます。読み込みはこれによるコスト増はありません。 ファイルスワップによるデプロイ:新しいコンテンツハッシュ付き世代をオフラインでビルドし、現在のポインタをアトミックに切り替え、サーバーがそれを取得します。すべてのブロックはチェックサム付きなので、部分的にコピーされたイメージは拒否され、サービスされません。 ベクトル検索内蔵:ディスクネイティブな近似最近傍(コサイン、L2、またはドットKNN)がグラフのすぐ隣にあり、RAGパイプラインの検索レイヤーとして使用する場合に便利です。埋め込みはインプレースで書き込み可能で、ベクトルを追加または変更するためのオフライン再構築は不要です。 設計によるロックダウン:読み取りと書き込みの権限は独立しており、オプションで保存時の暗号化、TLS Bolt、argon2idハッシュ化されたACL、読み取り専用コンテナルートFS(読み取りレプリカ用)があります。 機能 機能 あなたにとっての意味 制限された予測可能なメモリ 常駐メモリは、設定した3つのキャッシュ予算によって上限が定められ、グラフサイズとともに増加しません。グラフ全体のためにプロビジョニングするのではなく、パフォーマンス/RAMのトレードオフを調整します。バックグラウンドパージを備えたjemallocアロケータは、大量のクエリバーストの後で解放されたメモリをOSに返却するため、常駐サイズはバースト後のハイウォーターマークに固定されるのではなく、アイドルフロアに向かって低下します。 マルチテナント対応 1つのサーバーで、ユーザーごとの読み取り権限を持つ複数のグラフをホストできます。ほとんどのグラフDBでは有料/エンタープライズティアで提供されるマルチデータベース分離機能です。 保存時および転送時の暗号化 ブロックごとのXChaCha20-Poly1305シーリング(キーはディスクに書き込まれません)と、オプションのTLS(bolt+s://)。GDPR準拠。 軽量で依存関係の少ないインストール distroless glibcベースの小さなストリップ済みバイナリ(シェル/aptなし)。マルチアーキテクチャ(amd64/arm64)イメージは約22MB、サーバー専用のslater:latest-liteタグは約12MBです。ピュアRust TLS、OpenSSLなし。プルして実行。 定期的な公開用に構築 グラフをオフラインでビルドし、不変でサービスし、新しいバージョンをアトミックにスワップインしてダウンタイムゼロを実現します。データウェアハウス/スケジュール更新ワークロードに最適です。 負荷下での堅牢性 サーバーとオフラインビルダーは両方とも#![forbid(unsafe_code)]でコンパイルされます。エンジンの唯一のunsafeコードは、監査済みのjemallocアロケータクレートにあります。コアは不変なので、読み込みはロックを取らず、ライターを待つこともありません。単一のライターは、書き込みパスのみの背後でミューテーションをシリアル化します。GCの一時停止やデータ競合はありません。1つの悪いクエリがサーバーをダウンさせることはありません。 neo4jツールと連携 Bolt 5.4 / 4.4 / 4.1を話します。標準のneo4jドライバー(JS、Python、Go、Java…)、cypher-shell、またはグラフブラウザを変更なしで使用できます。 リッチなCypherクエリ機能 広範な読み取り機能:MATCH/WHERE/WITH/UNION、CALL {…} サブクエリ、70以上の関数と集計、時間的および地理空間値、正規表現。 ライブで耐久性のある書き込み 不変コアの上にオプトインのシングルライターLSMレイヤー(delta.enabled)。ビジネスキーのMERGE / SET / DELETE / CREATE / REMOVEをノードとリレーションシップに対して、バッチ処理されたwrite-UNWIND(バッチあたり1回のfsync