BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース ZippyDB:Facebookの強力な一貫性のあるKey-Valueストアのアーキテクチャ

ZippyDB:Facebookの強力な一貫性のあるKey-Valueストアのアーキテクチャ

原文(投稿日:2021/09/16)へのリンク

Facebook Engineeringは最近、ZippyDBとして知られる汎用のKey-Valueストアをどのように構築したかを公開した。ZippyDBは、Facebookで最大のKey-Valueストアであり、6年以上本番稼働している。チューニング可能な耐久性、一貫性、可用性、遅延の保証という点で、アプリケーションに柔軟性を提供する。ZippyDBのユースケースには、分散ファイルシステムのメタデータ、内部向けと外部向けのイベントのカウント、さまざまなアプリ機能に使用される本番データなどがある。

FacebookのソフトウェアエンジニアのSarang Masti氏は、ZippyDB開発の動機についての考察を説明している。

ZippyDBは、基盤となるストレージエンジンとしてRocksDBを使っています。ZippyDBの前は、FacebookのさまざまなチームがRocksDBを直接使ってデータを管理していました。しかし、このため、各チームが一貫性、フォールトトレランス、障害回復、レプリケーション、容量管理などの同じ課題を解決するという点で、作業が重複していました。これらのさまざまなチームのニーズに対応するために、ZippyDBを構築して、耐久性が高く一貫性のあるKey-Valueデータストアを提供しました。すべてのデータと、このデータの大規模な管理に関する課題をZippyDBにオフロードすることで、製品をより速く変えていくことができます。

ZippyDBデプロイメント(「層」と呼ばれる)は、世界中の複数リージョンに分散しているコンピューティングリソースとストレージリソースで構成される。各デプロイメントは、マルチテナント方式で複数のユースケースをホストする。ZippyDBは、ユースケースに紐づくデータをシャードに分割する。構成に応じて、Paxosか非同期レプリケーションかを使って、フォールトトレランスのために各シャードを複数のリージョンにレプリケートする。


出典: https://engineering.fb.com/2021/08/06/core-data/zippydb/

シャードごとの複製のうち、一部はクォーラムグループの一部となる。データが同期的に複製され、障害が発生した場合に高い耐久性と可用性を提供する。他の複製は、いずれも非同期レプリケーションを使ってフォロワーとして構成される。フォロワーを使用すると、アプリケーションはリージョン内に多くの複製を使って、一貫性を緩和した低レイテンシの読み取りをサポートすると共に、クォーラムサイズを小さく保って書き込みレイテンシを低くできる。シャード内の複製ロールの構成に関するこの柔軟性により、アプリケーションは、ニーズに応じて、耐久性、書き込みパフォーマンス、読み取りパフォーマンスのバランスをとることができる。

ZippyDBにより、アプリケーションで、一貫性と耐久性のレベルが構成可能となる。読み取りおよび書き込みAPIのオプションとして指定する。書き込みの場合、ZippyDBはデフォルトで大部分の複製についてデータを永続化する。その結果、プライマリでの読み取りには常に最新の書き込みが表示される。さらに、整合性の低くした高速認識モードをサポートする。このモードでは、書き込みが複製のためにプライマリでキューに入れられるとすぐに認識できる。

読み取りの場合、ZippyDBは、結果整合性のあるread-your-writesモードとストロングreadモードをサポートする。「read-your-writesの場合、クライアントは書き込み用にサーバから返された最新のシーケンス番号をキャッシュし、そのバージョンを使用して読み取り中に以降のクエリを実行します。」ZippyDBは、クォーラムと通信する必要性を回避するために、読み取りをプライマリにルーティングすることで、ストロングreadを実装している。「プライマリーがリース更新について聞いていない特定の外れた値の場合には、プライマリーでのストロングreadがクォーラムチェックと読み取りに変わります。」


出典: https://engineering.fb.com/2021/08/06/core-data/zippydb/

ZippyDBは、トランザクションと条件付き書き込みをサポートする。一連のキーに対してアトミックなread-modify-write操作を必要とするユースケースが対象だ。Masti氏は、ZippyDBの実装について詳しく説明している。

すべてのトランザクションはデフォルトでシャード上でシリアル化可能です。より低い分離レベルはサポートしていません。これにより、サーバ側の実装と、クライアント側で同時に実行されるトランザクションの正確性に関する推論が簡単にできるようになります。トランザクションは、楽観的同時実行制御を使って競合を検出および解決します。これは、上の図に示すように機能します。

ZippyDBのシャードは、物理シャードあるいはpシャードと呼ばれることが多く、サーバ側のデータ管理の単位だ。アプリケーションは、キースペースをμshards(マイクロシャード)に分割する。各pシャードは通常、数万のμシャードをホストする。 Masti氏によると「この追加の抽象化レイヤにより、ZippyDBは、クライアントで変更を加えることなく、データを透過的に再シャーディングできます。」

ZippyDBは、p-shardsとμshards間でAkkioマッピングを使用して、さらなる最適化を実現する。Akkioにより、情報が通常アクセスされる地理的リージョンにμshardが配置される。そうすることで、Akkioはデータセットの重複を減らし、すべてのリージョンにデータを配置するよりも低遅延アクセスのためのより効率的なソリューションを提供できる。

この記事に星をつける

おすすめ度
スタイル

BT