この記事はWeChatの公開アカウント「Mu Xiaonong」から転載したもので、著者はMu Xiaonongです。この記事を転載する場合は、穆小農の公式アカウントまでご連絡ください。 ZooKeeperの起源追記:これは重要ではありません。興味がない場合は、以下をご覧ください。 出典: Paxos から ZooKeeper へ ZooKeeper は Yahoo Research の研究チームから生まれました。当時、研究者たちは、Yahoo 内の多くの大規模システムは基本的に分散調整のために同様のシステムに依存する必要があるが、これらのシステムには分散単一ポイントの問題が頻繁にあることを発見しました。そこで Yahoo の開発者は、開発者がビジネス ロジックの処理に集中できるように、単一点の問題のない汎用的な分散調整フレームワークの開発に取り組みました。プロジェクト名「ZooKeeper」について。物語もあります。プロジェクトの開始当初、多くの社内プロジェクトが動物にちなんで命名されていたこと (たとえば、Pig プロジェクト) を考慮して、Yahoo のエンジニアはこのプロジェクトにも動物にちなんで名前を付けたいと考えていました。当時、研究所の主任科学者であるラグ・ラマクリシュナン氏は「この状態が続けば、この場所は動物園になってしまうだろう」と冗談を言った。こう言うとすぐに、みんながそれを Zookeeper と呼ぶべきだと言いました。動物にちなんで名付けられた分散コンポーネントを組み合わせると、分散システムは大きな動物園のように見え、分散環境を調整するために ZooKeeper が使用されるため、ZooKeeper という名前が生まれました。 分散構成センター前回は、ZooKeeper クラスターの構成とインストールについて説明しました。 ZooKeeper クラスターは主に分散調整に役立ちます。現在、分散構成を実装するために ZK を使用しています。 ZooKeeper クラスターの構成については、前回の記事「ZooKeeper クラスターの展開について」を参照してください。 分散構成センターがなぜ必要なのでしょうか?当初、多くの企業のサーバーは単一のノードで構成されていましたが、ビジネスの発展に伴い、単一ノードのサービスではビジネスの急速な発展に対応できなくなります。その後、分散とクラスタリングの概念が登場しました。現在ではマイクロサービスが形成され、技術的な改善によりビジネスのニーズをより適切に満たすことができます。 さまざまなサーバーに分散された多数のオンライン マイクロサービスがあるとします。マイクロサービスの 1 つは、goods-service と呼ばれます。 goods-service の IP アドレスを変更する必要があるが、goods-service は他の多くのプログラムにサービスを提供しているため、統一された構成がない場合、goods-service に適用されている各アプリケーションで対応する IP アドレスの変更を行う必要があり、非常に面倒です。 この問題は、分散構成に ZooKeeper を使用すると解決できます。 レジストリの比較サービスガバナンスだけを考慮すると、Eureka の方が適しています。 Eureka はより純粋な登録センターです。 Eureka とは異なり、Apache ZooKeeper は設計時に CP 原則に従います。いつでも ZooKeeper へのアクセス要求により一貫したデータ結果が得られます。同時に、システムはネットワークのセグメンテーションに対して耐障害性を備えています。今日は、ZooKeeper 登録検出についてお話します。 構成センターの中核低レイテンシ: 構成変更(作成/更新/削除)後、最新の構成をできるだけ早く他のノードに同期できます。 高可用性: 構成センターは外部に安定したサービスを提供できる ZooKeeper の Watcher メカニズムを通じて低レイテンシを実現できます (Watcher メカニズムについては後で説明します)。ノードは構成情報を保存することに同意します。各クライアントは、このノードの NodeDataChanged イベントをリッスンします。構成が変更されると、最新の構成がこのノードに更新されます。誰が更新するかは関係なく、どのノードでも更新できます。このノードが NodeDataChanged イベントをトリガーすると、このノードをリッスンしているすべてのクライアントに通知して、このノードの最新情報を取得します。ウォッチャーは 1 回限りなので、最新情報を取得するときにリスニング イベントを設定する必要があります。ほとんどのクエリ情報はアトミックであるため、ZooKeeper の getData もアトミック操作であり、取得する情報が最新のものであることを保証できます。 高可用性を実現するには、まず ZooKeeper を導入するためにマルチクラスター操作を確保する必要があり、コード レベルで行う作業はそれほど多くありません。 時計のメカニズムWatch は、ノードに対する ZooKeeper の 1 回限りのオブザーバー メカニズムです。上記の「低レイテンシ」で述べたように、一度トリガーされると無効になり、手動で再作成する必要があります。 Watch によって監視されるデータが変更されると、Watch を設定したクライアント (API の Watcher) に通知されます。 Watcher メカニズムは Znode ノードの変更を監視するため、対応するイベント タイプとステータス タイプが存在します。コード内のスイッチは監視に使用されます。クライアントは複数のノードに接続でき、Znode ノードが変更される限り、プロセス (WatchedEventevent) が実行されます。 次の図に示すように: 上の図から、ZooKeeper では、Watch がクライアント ポーリングではなくプッシュ メカニズムを使用していることがわかります。一部のミドルウェアでは、KafKa などプル モードが使用されます。 ウォッチには、イベント タイプとステータス タイプの 2 つの監視モードがあります。 イベントタイプ: Znode ノードの関連付け (主にノード操作用)
ステータスタイプ: クライアントの関連付け。主にZooKeeperクラスタとアプリケーションサービス間のステータス変更用
時計の特徴ワンタイム トリガー: ZooKeeper の Watcher イベントの場合、これはワンタイム トリガーです。ウォッチによって監視されているデータが変更されると、現在のウォッチを設定したクライアント (対応するウォッチャー) に通知されます。 ZooKeeper の監視は 1 回限りなので、トリガーごとに監視を設定する必要があります。 クライアントのシリアル実行: クライアント Watcher コールバック プロセスはシリアル同期プロセスであり、順次実行を保証できます。 軽量: WatchedEvent は、ZooKeeper の Watcher 通知メカニズム全体の最小の通知単位であり、3 つの部分 (通知ステータス、イベント タイプ、ノード パス) で構成されます。ウォッチャー通知は、イベントが発生したことをクライアントに伝えるだけで、具体的な内容は伝えません。それを取得するには、クライアントが率先して行動する必要があります。たとえば、WatchedEvent.NodeDataChanged 情報の変更をリッスンすると、このノードのデータが変更されたことのみが通知され、最新の値がすぐに取得されるはずです。 クライアントによって設定された各ウォッチポイントはセッションに関連付けられており、セッションの有効期限が切れると、保留中のウォッチポイントは削除されます。ただし、異なるサーバーへの接続間で監視を維持することは可能です。たとえば、ZooKeeper クライアントが ZooKeeper サーバーから切断し、セット内の別のサーバーに接続すると、クライアントはトリガーされていないウォッチのリストを送信します。ウォッチを登録すると、サーバーはウォッチが以前に登録されてから監視対象の znode が変更されたかどうかを確認します。 znode が変更された場合は、監視イベントがクライアントに送信され、それ以外の場合は監視が新しいサーバーに登録されます。このメカニズムにより、基礎となる接続自体ではなく、論理層のセッションを考慮できるようになります。 クライアント登録ZooKeeper に登録する場合、ZooKeeper サーバーに登録を要求します。サーバーはリクエストに対する応答を返します。成功か失敗かに関係なく、応答結果が返されます。応答が成功すると、ZooKeeper サーバーは Watcher オブジェクトをクライアントの WatchManager 管理に配置し、クライアントに応答を返します。 サーバー登録FinalRequestProcessor.ProcessRequest() は、現在のリクエストがウォッチャーを登録する必要があるかどうかを判断します。 ZooKeeper は、現在のクライアントが Watcher に登録する必要があると判断した場合、現在の ServerCnxn オブジェクトとデータ パスを getData メソッドに渡します。 ServerCnxn は、ZooKeeper クライアントとサーバー間の接続インターフェースであり、クライアントとサーバー間の接続を表します。 ServerCnxn は Watcher プロセス インターフェイスを実装しているため、Watcher オブジェクトと見なすことができます。 ウォッチャーマネージャー WatcherManager は、ZK サーバー Watcher のマネージャーであり、WatchTable と Watch2Paths の 2 つのストレージ構造に分かれています。これら 2 つは異なるストレージ構造です。 1) WatchTable: データノードパスの粒度からWatcherを管理します 2) Watch2Paths: Watcherの粒度から時間からデータノードを制御します サーバー側では、dataWatches (データ変更監視) と childWatches (子ノード変更監視) という 2 つの WatchManager が DataTree でホストされます。 ウォッチャートリガーロジック 1) WatchedEvent をカプセル化: (KeeperState (通知状態)、EventType (イベント種別)、Path (ノードパス)) を WatchedEvent オブジェクトにカプセル化します。 2) Watcher をクエリ: パスに応じて対応する Watcher を取得します。存在する場合は、データを取得してWatcherManager(WatchTable/Watch2Paths)から削除します。3)Processメソッドを呼び出してWatcherをトリガーします。 4. クライアントコールバックウォッチャー 1) 逆シリアル化: バイト ストリームを WatcherEvent オブジェクトに変換します。2) chrootPath を処理します。クライアントが chrootPath 属性を設定する場合、サーバーから送信された完全なノード パスを chrootPath で処理して、クライアントの相対ノード パスを生成する必要があります。たとえば、(/mxn/app/love は、chrootPath 処理後、/love になります) 3) WatchedEvent を復元: WatcherEvent を WatchedEvent に変換します 4) ウォッチャーをコールバック: WatcherEvent オブジェクトを EventThread スレッドに渡し、次のポーリング サイクルでウォッチャー コールバックを実行します EventThreadはイベント通知を処理します 1) SendThread はサーバーから通知イベントを受信すると、EventThread.queueEvent メソッドを呼び出してイベントを EventThread スレッドに渡します。 2) queueEvent メソッドは、まず通知イベントに基づいて ZKWatchManager から関連するすべてのウォッチャーを取得します。クライアントはイベント タイプ EventType を識別した後、対応する Watcher を対応する Watcher ストレージ (つまり、3 つの登録方法 (dataWatches、existWatcher、または childWatcher)) から削除します。 3) 関連するすべてのウォッチャーを取得すると、それらは waitingEvents キューに配置されます。 コードの実装次に、コードを使用してZooKeeper構成を実装する方法を説明します。 まずZK jarをインポートする必要があります
構成クラス分散構成を行うので、まずサービスのアドレスを同期するために使用される構成をシミュレートする必要があります。
ウォッチャーZooKeeper を作成するときは、監視するための Watcher が必要です。後で Znode ノードを操作するときには Watcher も使用する必要がありますが、これら 2 つのクラスの機能は異なるため、次に示すように独自のウォッチャー クラスを定義する必要があります。
操作は非同期で実行されるため、ZooKeeper オブジェクトを作成した後、ブロッキング操作を実行しないと、接続が完了する前に後続の操作が実行される可能性があります。したがって、ここではブロック操作に CountDownLatch を使用します。監視接続が成功すると、countDown が解放され、後続の ZK アクションが実行されます。 ZooKeeper に正常に接続したら、ノードが存在するかどうかを判断するために exists を使用する必要があります。存在する場合は、getData 操作を実行します。ここでは、exists と getData の両方にコールバックが必要なため、WatchCallBack を作成します。そのため、Watcher の実装に加えて、ノード ステータス (AsyncCallback.StatCallback) とデータ監視 (AsyncCallback.DataCallback) も実装する必要があります。
すべての準備が整ったら、テストケースを記述できます。 ZKユーティリティ
テストクラス:
テストの実行まず、IP に接続するときに /mxn ディレクトリ構造を追加したので、サーバーの初期状態でこのノードが存在する必要があることを知っておく必要があります。 クラスターの初期状態:
プログラムを開始して見てみましょう 接続に成功しました ZooKeeper /mxnも空になりました
それでは、/mxn/myZNodeノードデータを作成しましょう
ご覧のとおり、作成が完了すると、プログラムはすぐに応答し、私が設定した値、muxiaonong666を出力します。 このとき、/mxn/myZNodeの値をmuxiaonong6969に設定します。 スナップ!本当に早いですね!!!値が瞬時に変化することがわかります このとき、/mxn/myZNode ノードを削除するとどうなるでしょうか?以前にも時計について書いたことがあります。 Znode が削除されると、ウォッチとコールバックが実行されます。
/mxn/myZNodeノードを削除します
最初はデータがまだ印刷されていることがわかりますが、後でデータが失われるというメッセージが表示されます。 ただし、現時点ではクライアントは閉鎖されておらず、データの更新を待機中です。この時点で /mxn/myZNode ノードを再作成すると、プログラムは異常な出力を続けます。
プログラムは正常に実行され、zk 構成の最新データを正常に取得します。この時点で、ZooKeeper の分散構成センター機能は基本的に実現されます。 ここではgetDataでテストしましたが、実際のプロジェクトでは、より多くの子ノード操作getChildrenを使用する可能性があります。 要約するこれで、ZooKeeper の分散構成、登録、検出に関する記事は終了です。ご質問がございましたら、お気軽にご相談ください。 ZooKeeper は分散構成センターとして使用でき、マイクロサービスの登録にも使用できます。ただし、マイクロサービスには現在、独自のサービス検出セットがあります。 ZooKeeper を理解することで、テクノロジーを選択する際に適切な判断を下すことができます。 ZooKeeper の高可用性と最終的な一貫性も比較的安定しています。 この記事のコードアドレス: https://github.com/muxiaonong/ZooKeeper/tree/master/mxnzookeeper |
<<: エッジ データ ファブリックとは何ですか? また、なぜ重要ですか?
ソフトウェアは、SEO 作業の負担を軽減する強力な武器です。記事の更新、外部リンクの公開、ランキング...
kvmla は、建国記念日に 20% オフのプロモーションを開始しました。具体的には、日本の東京デー...
インターネットが世界中で急速に発展している現代では、雨後の筍のようにオンラインメディアが次々と登場し...
周知のとおり、SEO はウェブサイトの運用と保守の手段であり、その費用対効果の高さから多くの運用保守...
王世凡は、一人で働いていた頃から、今では小さなチームで働くようになり、自分が熟知しているいくつかの ...
ターゲット トラフィックを獲得することは、ウェブサイトのプロモーション、特に販売ウェブサイトにとって...
一部の企業ウェブサイトは、業界の特殊性により、多くの事業があり、その中には非常に人気のないものもあり...
Baiduアルゴリズムの継続的な更新により、一部の企業ウェブサイトは降格、Kステーション、摘発を経験...
[[343467]]いわゆる「ビッグデータが古い顧客を殺す」とは、主にインターネット商人がビッグデー...
vultr.com は 12 月に人気の割引コード、SSDVPS を提供しています。このコードを使用...
今年のダブル11がやってきました。毎年恒例の電子商取引の戦いの主な「戦闘員」となったライブストリーミ...
2012 年 3 月 5 日月曜日、著者は医療業界のウェブサイトの最適化方法を分析し、共通の特徴を発...
クラウド コンピューティングに対する連邦政府の支出は、サービスとしてのインフラストラクチャ (Iaa...
クラウドコンピューティングは急速な発展段階に入りました。パブリック クラウド テクノロジーとビジネス...
どの祝日も人気スポットですが、母の日も例外ではありません。需要があるかどうかに関係なく、まずは参加し...