分散システム調整カーネル - Zookeeper

分散システム調整カーネル - Zookeeper

[[402864]]

この記事はWeChatの公開アカウント「Mu Niao Za Ji」から転載したもので、著者はMu Niao Za Jiです。この記事を転載する場合は、Mu Niao Za Ji の公開アカウントにご連絡ください。

この記事では、Patrick Hunt らが発表した論文を紹介します。 2010 年に開発され、現在でも広く使用されており、分散システムの調整コンポーネントに重点を置いた ZooKeeper: インターネット規模のシステム向けの待機なしの調整。複数のスレッドまたは複数のプロセスでプログラミングする場合、同期と排他制御は避けられません。一般的な手段としては、共有メモリ、メッセージ キュー、ロック、セマフォなどがあります。分散システムでは、異なるコンポーネント間で同様の調整方法が必然的に必要になるため、Zookeeper が誕生しました。 Zookeeper は、クライアント ライブラリと組み合わせて、動的パラメータ構成 (構成メタデータ)、分散ロック、共有レジスタ、サービス検出、グループ メンバーシップ、マルチノード リーダー選出などの一連の分散システム調整サービスを提供できます。

一般的に、Zookeeper には次のような特徴があります。

  1. Zookeeper は、API をシンプルかつ効率的に保つために比較的まとまりのある機能を備えた分散調整カーネルです。
  2. Zookeeper は、高性能、FIFO 保証、イベント駆動型、非ブロッキング API のセットを提供します。
  3. Zookeeper は、ファイル システムに似たディレクトリ ツリーを使用してデータを整理します。強力な表現力を備えており、クライアントがより複雑な調整ソース言語を簡単に構築できるようになります。
  4. Zookeeper は、Zab アトミック ブロードキャスト プロトコルを使用して高可用性と一貫性を確保する、自己一貫性のあるフォールト トレラント システムです。

この記事では、論文の順序に従って、Zookeeper のモジュールのサービス インターフェース設計と大まかな実装について簡単に紹介します。詳細については、論文およびオープンソース プロジェクトのホームページを参照してください。

サービスデザイン

サービス インターフェイスを設計するときは、まずサービスの構成と相互作用に関係する基本概念を抽象化し、次にこれらの基本概念を取り巻く一連のアクションを明確にする必要があります。 Zookeeper の場合、これらの基本概念は用語と呼ばれ、アクションのセットはサービス インターフェイス (API) と呼ばれます。

用語集

  1. クライアント: クライアント、Zookeeper サービスを使用するユーザー。
  2. サーバー: サーバー、Zookeeper サービスを提供するプロセス。
  3. データ ツリー: データ ツリー。Zookeeper 内のすべてのデータはツリー構造で編成されます。
  4. z-node: znode、Zookeeper ノード、データ ツリー内のノードは、基本的なデータ ユニットです。
  5. セッション: セッションでは、クライアントとサーバーは接続を識別するために新しいセッションを作成し、クライアントからの後続の各要求はセッション ハンドルを通じて行われます。 Watch イベントのライフ サイクルもセッションにバインドされます。

以下のテキストでは、対応する用語の中国語版と英語版が同じ意味で使用されている場合があります。

データの構成

Zookeeper は、保存されたデータをファイル システムに似たツリー状の階層に整理し、ユーザーに高い柔軟性を提供します。たとえば、同じ親ノードのすべての子を使用してメンバーシップを表すなど、名前空間を自然に表現することが可能です。パスは一意のデータ ノードを見つけられるため、基本データ ユニットを一意に識別できます。

Zookeeper 階層型名前空間構成

ツリーでは 2 種類の znode がサポートされています。

  1. 通常ノード: 通常、ライフサイクルは無限です。クライアントは、このタイプのノードを明示的に追加または削除するためにインターフェイスを呼び出す必要があります。
  2. 一時ノード: ライフサイクルがセッションにバインドされた一時的なノードです。セッションが破棄されると、ノードは削除されます。

さらに、Zookeeper では、クライアントが znode を作成するときにシーケンシャル フラグを添付できます。 Zookeeper は、ノード名の接尾辞としてグローバル増分カウントを自動的に追加します。

Zookeeper は、プッシュ ツー サブスクライブ アプローチを使用してサブスクリプション メカニズムを実装します。つまり、ユーザーがノードをサブスクライブ (監視) した後、ノードが変更されると、クライアントは通知 (エッジ トリガー) を受信します。サブスクリプションはセッションにバインドされているため、セッションが破棄されると、サブスクライブされたイベントも消えます。

セッションメカニズム(セッション)。ご覧のとおり、Zookeeper はセッション メカニズムを使用してクライアント接続のライフサイクルを管理します。実装されると、セッションはタイムアウト間隔に関連付けられます。クライアントが停止したり、Zookeeper から切断されたりして、タイムアウト期間内にクライアントがハートビートを実行しない場合、Zookeeper はサーバー側でセッションを破棄します。

データ モデル。 Zookeeper は基本的にツリー構造の KV モデルを提供します。 Zookeeper は、キー値データを保存するだけでなく、空間構造とライフサイクル管理を表現機能として通じて調整セマンティクスを提供します。もちろん、Zookeeper では、クライアントがノードにメタデータや構成情報を添付したり、バージョンやタイムスタンプのサポートを提供したりすることで、より強力な表現機能も提供します。

APIの詳細

以下は、Zookeeper がクライアントに提供する API の詳細とコメントをリストした疑似コードです。すべての操作オブジェクトは、パスに対応するデータ ノード (znode) です。

  1. // パス path に znode を作成し、データ data を保存します
  2. // 通常、一時、順次などのフラグを設定します。
  3. // 戻り値: znode 名
  4. 作成(パス、データ、フラグ)
  5.  
  6. // パスのznodeが期待されるバージョンと同じ場合、
  7. // 次に znode を削除します。
  8. // バージョンの指定は、通常、同時実行の安全性のためです。
  9. 削除(パス、バージョン)
  10.  
  11. // watch はクライアントがこのパスにリスナーを追加できるようにします
  12. // 戻り値: パスに対応する znode。存在する場合はtrueを返します。  
  13. // 存在しない場合はfalseを返す 
  14. 存在する(パス、ウォッチ)
  15.  
  16. // パス path に対応する znode のデータとメタ情報を取得します
  17. // znodeが存在する場合、監視するためのウォッチを設定できます
  18. // znode データの変更
  19. getData(パス、ウォッチ)
  20.  
  21. // バージョンが一致したら、データをデータに書き込む
  22. // パスに対応するznode
  23. setData(パス、データ、バージョン)
  24.  
  25. // パス path に対応する znode のすべての子を取得します
  26. getChildren(パス、ウォッチ)
  27.  
  28. // 通常は getData の前に置かれる最新のデータを同期します
  29. 同期(パス)

上記の API には次の機能があります。

非同期サポート。すべてのインターフェースには同期バージョンと非同期バージョンがあります。非同期バージョンはコールバック関数として実行されます。クライアントは、ビジネス ニーズに基づいて、重要な更新を取得するためにブロックして待機するか、非同期呼び出しを行ってパフォーマンスを向上させるかを選択できます。

ハンドルではなくパス。インターフェイス設計を簡素化し、サーバーによって維持される状態を削減するために、Zookeeper は znode ハンドルではなくパスを使用して znode の操作インターフェイスを提供します。結局のところ、ハンドルはセッションに似ており、ステートフルであり、分散システムの実装の複雑さを増します。パスを使用し、それをバージョン情報と組み合わせることで、複数のクライアントを同時に処理する場合に実装が容易になるべき等インターフェースを作成できます。

バージョン情報。すべての更新操作 (設定/削除) では、対応するデータのバージョン番号を指定する必要があります。バージョン番号が一致しない場合は、更新が終了し、例外が返されます。ただし、特別なバージョン番号 -1 を指定することで、バージョン番号のチェックをスキップできます。

セマンティック保証

複数のクライアントから Zookeeper への同時リクエストを処理する場合、API には 2 つの基本的な順序保証があります。

線形化可能な書き込み。すべての Zookeeper 状態更新要求はシリアル化されます。

クライアント内の FIFO クライアント順序。特定のクライアントに対するリクエストは、送信された順序で実行されます。

しかし、ここでの線形化は非同期線形化、つまり A-線形化可能性です。つまり、単一のクライアントで複数の未処理の操作を同時に実行できますが、これらの要求は発行された順序で実行されます。読み取り要求の場合、マスターを経由せずに各サーバー上でローカルに実行できます。したがって、サーバー (オブザーバー) を追加することで、読み取り要求のスループットを向上させることができます。

さらに、Zookeeper は可用性と耐久性の保証も提供します。

可用性 (生存性): Zookeeper クラスター内のノードの半分以上が利用可能な場合、システムは外部に正常にサービスを提供できます。

耐久性: クライアントに正常に返された変更要求はすべて、Zookeeper ステート マシンに適用されます。ノード障害や再起動が継続的に発生した場合でも、Zookeeper が正常にサービスを提供できる限り、この機能は影響を受けません。

動物園の建築

高い信頼性を提供するために、Zookeeper は複数のサーバーを使用して冗長的にデータにアクセスします。すべての更新要求は、Zab コンセンサス プロトコルを使用して処理され、WAL に書き込まれ、ローカル メモリ ステート マシン (データ ツリー) に適用されます。

Zab プロトコルでは、すべてのノードがリーダーとフォロワーの 2 つの役割に分かれています。リーダーは 1 人のみで、残りはフォロワーです。しかし、実際には、オブザーバーが存在する可能性があります。

Zookeeper のコンポーネントとリクエストフロー

上図に示すように、サーバーはリクエストを受信すると、まず前処理(リクエストプロセッサ)を実行します。書き込み要求の場合は、Zab プロトコル (Atomic Broadcast) を通じて合意に達し、それをローカル データベース (Replicated Database) に送信します。読み取り要求の場合、ローカル データベースのステータスが直接読み取られて返されます。

リクエストプロセッサ

すべての更新リクエストは、べき等トランザクション (txn) に変換されます。具体的な方法は、現在の状態を取得し、ターゲットの状態を計算し、それをトランザクションにカプセル化することです。次に、CAS のような方法を使用して同時リクエストを処理できます。したがって、すべてのトランザクションが固定された順序で実行される限り、異なるサーバー上のデータ コピーの分割を回避できます。

アトミックブロードキャスト

すべての更新リクエストは Zookeeper リーダーに転送されます。リーダーはまずトランザクションをローカル WAL に追加し、次に Zab プロトコルを使用して各ノードに変更をブロードキャストします。成功した応答の半分以上を受信すると、リーダーは変更をローカルのインメモリ データベースにコミットし、コミットをフォロワーにブロードキャストします。

Zab は多数決原理を採用しているため、2k+1 ノードのクラスターは最大 k ノードの障害を許容できます。

システムのスループットを向上させるために、Zookeeper はパイプライン アプローチを使用して複数のリクエストの処理を最適化します。

複製されたデータベース

各サーバーは、Zookeeper 内のすべての状態のレプリカをローカル メモリに保持します。ダウンタイムと再起動に対処するために、ZooKeeper は定期的に状態のスナップショットを取得します。通常のスナップショットとは異なり、Zookeeper はスナップショットをファジー スナップショットと呼びます。つまり、スナップショットを作成するときにロックせず、DFS を介してファイル ツリーをトラバースしてスナップショットをローカル コンピューターにダンプします。異常なダウンタイムによりシステムが再起動された場合は、最新のスナップショットを追加し、最新のスナップショットの後に WAL を再実行するだけで済みます。 WAL に記録されたトランザクションの冪等性により、スナップショットと WAL の時点が完全に一致していなくても、レプリカ間の一貫性には影響しません。

クライアントとサーバーの相互作用

シリアル書き込み。すべての更新操作は、サーバー上でグローバルまたはローカルにシリアル化されます。パス データの更新を実行すると、サーバーは、接続されているすべてのクライアントによってサブスクライブされている Watch イベントをトリガーします。これらのイベントはセッションに関連付けられているため、サーバー上でローカルにのみ保存されることに注意してください。クライアントがサーバーから切断されると、セッションは破棄され、これらのイベントも消えます。

ローカルで読み取ります。最高のパフォーマンスを実現するために、Zookeeper のサーバーは読み取り要求をローカルで直接処理します。ただし、これにより、クライアントが古いデータを取得する可能性があります (たとえば、他のクライアントが別のサーバー上の同じパスを更新する場合)。そのため、Zookeeper は、Sync を呼び出した時点で送信された最新のデータをクライアントに接続されたサーバーに同期し、最新のデータをクライアントに返す Sync 操作を設計しました。つまり、Zookeeper は、Sync を呼び出すかどうかを決定することで、ユーザーにパフォーマンスと適時性の選択肢を提供します。

一貫した見解。 Zookeeper は、トランザクション自動増分識別子 zxid をグローバルに管理します。これは本質的に、Zookeeper のデータ ビューをその時点で識別できる論理クロックです。障害による再起動後にクライアントが新しいサーバーに再接続する場合、サーバーがクライアントに保存されている zxid を実行していない場合、サーバーは zxid を実行してからクライアントに応答するか、クライアントは新しいサーバーに接続します。これにより、クライアントにはロールバックされたビューが表示されなくなります。

セッションの有効期限が切れました。セッションは基本的に、Zookeeper 内のクライアントからサーバーへの接続を識別します。セッションにはタイムアウト期間があります。クライアントが長時間(タイムアウト間隔より長い時間)リクエストまたはハートビートを送信しない場合、サーバーはセッションを削除します。

まとめ

Zookeeper は、ディレクトリ ツリーを使用してデータを整理し、Zab プロトコルを使用してデータを同期し、非ブロッキング メソッドを使用してインターフェイスを提供することで、強力な表現力を備えた分散調整カーネルを構築します。分散システムのコントロール プレーンで調整、スケジュール、制御に使用できます。近年では、Raft をベースにした Etcd も同様の立場に立っています。

<<:  並列および分散コンピューティングの原理

>>:  JVM に固執する | Arthas を使用して JVM メモリをチェックするのは素晴らしいことです。

推薦する

沈国軍: 電子商取引以前の時代の「見えざる主人」

【中国企業家ネットワーク】「見えざる達人」として、中国銀泰投資有限公司の沈国軍会長は、投資に対する深...

討論: SEO ブログは、実践者がオンライン ブランドを構築するための強力なツールになり得るでしょうか?

最近はSEOブログが非常に蔓延しています。都市名とSEO(例えば、福州SEO)を検索すると、関連する...

ウェブサイト外部リンクの新たな方向性:外部リンクの多様化

Baidu の度重なる革新の波により、ウェブサイト上の外部リンクの数は減少しています。ウェブサイトの...

2019 年にクラウド コンピューティング サービスを比較する際に尋ねるべき 6 つの質問

今日では、企業は基本的にクラウド コンピューティングを通じてあらゆるビジネス目標を達成できると言って...

Baiduの検索マーケティングコンセプトに関する考察

有料ランキングに触れたのが、百度検索に注目し始めたきっかけです。百度検索は開発以来、アカウント管理を...

外部リンクを多すぎる数投稿するとランクが下がりますか?

多くのウェブマスターの友人は、「外部リンクが多すぎると、ウェブサイトのランクが下がるのでしょうか?」...

dedipath: 1Gbps 帯域幅、無制限トラフィック サーバー、月額 79 ドル、ロサンゼルス データ センター

Dedipath のロサンゼルス データ センターでは、1Gbps の帯域幅と無制限のトラフィックを...

1つの投稿で年間数百万ドルを稼ぐ方法

中国で最も人気のあるフォーラムである Tianya Forum には、数え切れないほどの人気と、お金...

SharkTechは、2つのVPSブランドRectifiedとChangeIPの買収を正式に発表しました。

今朝の最新メールでは、Sharktech(Shark Data Center)がrectified....

1日1スキル: 分散システム向けの低コストの権限検証メカニズム

Weiwen Codeをよくフォローしている人は、私がニュースWebページのテキストを自動的に抽出で...

SEO

言うのは難しくありませんが、簡単と言うのはさらに難しいです。Junhao は SEO に携わり、2、...

DIY SEOの4つのステップは一度きりの作業ではありません

簡単に言えば、SEO は 4 つのステップに分かれています。1 つ目は基本的な基準を確立すること、2...

SEOウェブサイトを再設計する際にSEO担当者が知っておくべきこと

最近、自分のウェブサイトの見栄えが悪く、改修が必要だと感じる学生もいます。Wangqi SEO は、...