ZooKeeperの分散構成については、この記事を読んでください

ZooKeeperの分散構成については、この記事を読んでください

[[430218]]

この記事は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 ノードの関連付け (主にノード操作用)

  • ノードを作成する: EventType.NodeCreated
  • ノードデータの変更: EventType.NodeDataChanged
  • 現在のノードの子ノードが変更されました: EventType.NodeChildrenChanged
  • ノードの削除: EventType.NodeDeleted

ステータスタイプ: クライアントの関連付け。主にZooKeeperクラスタとアプリケーションサービス間のステータス変更用

  • 接続されていません: KeeperState.Disconnected
  • 接続済み: KeeperState.SyncConnected
  • 認証に失敗しました: KeeperState.AuthFailed
  • 有効期限: KeeperState.Expired
  • クライアントは読み取り専用サーバーに接続されています: KeeperState.ConnectedReadOnly

時計の特徴

ワンタイム トリガー: 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をインポートする必要があります

  1. <依存関係>
  2. <グループ ID>org.apache.zookeeper</グループ ID>
  3. <artifactId>動物園の飼育係</artifactId>
  4. <バージョン>3.6.3</バージョン>
  5. </依存関係>

構成クラス

分散構成を行うので、まずサービスのアドレスを同期するために使用される構成をシミュレートする必要があります。

  1. /**
  2. * @プログラム: mxnzookeeper
  3. * @クラス名 MyConf
  4. * @description: 構成クラス
  5. * @著者: muxiaonong
  6. * @作成日: 2021-10-19 22:18
  7. * @バージョン 1.0
  8. **/
  9. パブリッククラスMyConfig{
  10.  
  11. プライベート文字列conf;
  12.  
  13. パブリック文字列 getConf() {
  14. confを返します
  15. }
  16.  
  17. パブリックvoid setConf(String conf) {
  18. conf を次のように変更します。
  19. }
  20.  
  21. }

ウォッチャー

ZooKeeper を作成するときは、監視するための Watcher が必要です。後で Znode ノードを操作するときには Watcher も使用する必要がありますが、これら 2 つのクラスの機能は異なるため、次に示すように独自のウォッチャー クラスを定義する必要があります。

  1. org.apache.zookeeper.WatchedEvent をインポートします。
  2. org.apache.zookeeper.Watcher をインポートします。
  3.  
  4. java.util.concurrent.CountDownLatch をインポートします。
  5.  
  6. /**
  7. * @プログラム: mxnzookeeper
  8. * @ClassName デフォルトウォッチ
  9. * @説明:
  10. * @著者: muxiaonong
  11. * @作成日: 2021-10-19 22:02
  12. * @バージョン 1.0
  13. **/
  14. パブリッククラスDefaultWatchはWatcherを実装します{
  15.  
  16. カウントダウンラッチ cc;
  17.      
  18. パブリックvoid setCc(CountDownLatch cc) {
  19. this.cc = cc;
  20. }
  21.  
  22. @オーバーライド
  23. パブリックvoid プロセス(WatchedEvent イベント) {
  24. システム。出力.println(event.toString());
  25.  
  26. スイッチ(イベント.getState()){
  27. ケース不明:
  28. 壊す;
  29. 切断された場合:
  30. 壊す;
  31. NoSyncConnectedの場合:
  32. 壊す;
  33. SyncConnectedの場合:
  34. システム。 out .println( "接続に成功しました..." );
  35. //接続が成功したらcountDownを実行し、zkオブジェクトを使用できます
  36. cc.countDown();
  37. 壊す;
  38. AuthFailedの場合:
  39. 壊す;
  40. ConnectedReadOnlyの場合:
  41. 壊す;
  42. SaslAuthenticatedの場合:
  43. 壊す;
  44. 期限切れの場合:
  45. 壊す;
  46. 事件は解決しました:
  47. 壊す;
  48. }
  49.  
  50. }
  51. }

操作は非同期で実行されるため、ZooKeeper オブジェクトを作成した後、ブロッキング操作を実行しないと、接続が完了する前に後続の操作が実行される可能性があります。したがって、ここではブロック操作に CountDownLatch を使用します。監視接続が成功すると、countDown が解放され、後続の ZK アクションが実行されます。

ZooKeeper に正常に接続したら、ノードが存在するかどうかを判断するために exists を使用する必要があります。存在する場合は、getData 操作を実行します。ここでは、exists と getData の両方にコールバックが必要なため、WatchCallBack を作成します。そのため、Watcher の実装に加えて、ノード ステータス (AsyncCallback.StatCallback) とデータ監視 (AsyncCallback.DataCallback) も実装する必要があります。

  1. org.apache.zookeeper.AsyncCallback をインポートします。
  2. org.apache.zookeeper.WatchedEvent をインポートします。
  3. org.apache.zookeeper.Watcher をインポートします。
  4. org.apache.zookeeper.ZooKeeper をインポートします。
  5. org.apache.zookeeper.data.Stat をインポートします。
  6.  
  7. java.util.concurrent.CountDownLatch をインポートします。
  8.  
  9. /**
  10. * @プログラム: mxnzookeeper
  11. * @ClassName ウォッチコールバック
  12. * @説明:
  13. * @著者: muxiaonong
  14. * @作成日: 2021-10-19 22:13
  15. * @バージョン 1.0
  16. **/
  17. パブリッククラス WatchCallBack は Watcher、AsyncCallback.StatCallback、AsyncCallback.DataCallback を実装します {
  18.  
  19. ZooKeeper zk ;
  20. MyConfig conf;
  21. カウントダウンラッチcc = 新しいカウントダウンラッチ(1);
  22.  
  23. パブリックMyConfig getConf() {
  24. confを返します
  25. }
  26.  
  27. パブリックvoid setConf(MyConfig conf) {
  28. conf を次のように変更します。
  29. }
  30.  
  31. パブリックZooKeeper getZk() {
  32. zkを返します
  33. }
  34.  
  35. パブリックvoid setZk(ZooKeeper zk) {
  36. this.zk = zk;
  37. }
  38.  
  39.  
  40. パブリックvoid aWait(){
  41. //非同期実装バージョンが存在する
  42. zk.exists(ZKConstants.ZK_NODE、this、this 、 「existsウォッチ」 );
  43. 試す {
  44. cc.await();
  45. } キャッチ (InterruptedException e) {
  46. e.printStackTrace();
  47. }
  48. }
  49.  
  50. /** @著者 mxn
  51. * @Description //TODO このコールバックはノードのステータスを取得するために使用されます
  52. * @日付2021/10/20 21:24
  53. * @param rc 呼び出しによって返されるコードまたは結果
  54. * @param path 非同期呼び出しに渡されるパス
  55. * @param ctx 非同期呼び出しに渡されるコンテキスト オブジェクト
  56. * @param statはパス上のノードのStatオブジェクトを指定します
  57. * @戻る  
  58. **/
  59. @オーバーライド
  60. パブリックvoid processResult( int rc, String path, Object ctx, Stat stat) {
  61. (統計値!= null )の場合{
  62. //getData の非同期実装バージョン
  63. zk.getData(ZKConstants.ZK_NODE、this、this、 「ステータス」 );
  64. }
  65. }
  66.  
  67.  
  68. /** @著者 mxn
  69. * @Description //TODO このコールバックはノードのデータと統計を取得するために使用されます
  70. * @日付2021/10/20 21:23
  71. * @param rc 呼び出しによって返されるコードまたは結果
  72. * @param path 非同期呼び出しに渡されるパス
  73. * @param ctx 非同期呼び出しに渡されるコンテキスト オブジェクト
  74. * @param data ノードデータ
  75. * @param statはノードのStatオブジェクトを指定します
  76. * @戻る 
  77. **/
  78. @オーバーライド
  79. パブリックvoid processResult( int rc, String path, Object ctx, byte[] data, Stat stat) {
  80. データ!= nullの場合{
  81. 文字列 s = 新しい文字列(データ);
  82. conf.setConf(s);
  83. cc.countDown();
  84. }
  85. }
  86.  
  87. /** @著者 mxn
  88. * @Description //TODO Watcher インターフェースの実装。
  89. * Watcher インターフェイスは、イベント ハンドラー クラスが実装する必要があるパブリック インターフェイスを指定します。
  90. * ZooKeeper クライアントは、接続している ZooKeeper サーバーからさまざまなイベントを取得します。
  91. * このクライアントを使用するアプリケーションは、コールバック オブジェクトをクライアントに登録することによってこれらのイベントを処理します。
  92. * コールバック オブジェクトは、Monitor インターフェイスを実装するクラスのインスタンスである必要があります。
  93. * @日付2021/10/20 21:24
  94. * @Param watchingEvent WatchedEvent は、ウォッチャーが応答できた ZooKeeper の変更を表します。
  95. * WatchedEventには何が起こったかが含まれます。
  96. * ZooKeeper の現在の状態と、イベントに関係する znode へのパス。
  97. * @戻る  
  98. **/
  99. @オーバーライド
  100. パブリックvoid プロセス(WatchedEvent イベント) {
  101. スイッチ(イベント.getType()){
  102. ケースなし:
  103. 壊す;
  104. NodeCreatedの場合:
  105. //ノードが作成されたら、ノードを取得します
  106. //getData は StatCallback のコールバック processResult をトリガーします
  107. zk.getData(ZKConstants.ZK_NODE、this、this、 "sdfs" );
  108. 壊す;
  109. NodeDeletedの場合:
  110. //ノードの削除
  111. conf.setConf( "" );
  112. //CountDownLatchを再度開く
  113. cc = 新しいCountDownLatch(1);
  114. 壊す;
  115. NodeDataChangedの場合:
  116. //ノードデータが変更されました
  117. //DataCallbackのコールバックをトリガーする
  118. zk.getData(ZKConstants.ZK_NODE、this、this、 "sdfs" );
  119. 壊す;
  120. //子ノードが変更されたとき
  121. NodeChildrenChangedの場合:
  122. 壊す;
  123. }
  124.  
  125.  
  126. }
  127. }

すべての準備が整ったら、テストケースを記述できます。

ZKユーティリティ

  1. org.apache.zookeeper.ZooKeeper をインポートします。
  2.  
  3. java.util.concurrent.CountDownLatch をインポートします。
  4.  
  5. /**
  6. * @プログラム: mxnzookeeper
  7. * @クラス名 ZKUtils
  8. * @説明:
  9. * @著者: muxiaonong
  10. * @作成日: 2021-10-19 21:59
  11. * @バージョン 1.0
  12. **/
  13. パブリッククラスZKUtils {
  14.  
  15. プライベート静的ZooKeeper zk;
  16.  
  17. //192.168.5.130:2181/mxn 末尾の/mxnは、クライアントがzkクラスタへの接続を正常に確立した場合、
  18. // クライアントのデフォルトのルート パスは /mxn になります。 /mxnが含まれていない場合、デフォルトのルートパスは/です。
  19. //もちろん、/mxnノードがZK上に存在することを確認する必要があります
  20. プライベート静的文字列アドレス = "192.18.5.129:2181,192.168.5.130:2181,192.168.5.130:2181/mxn" ;
  21.  
  22. プライベート静的DefaultWatch ウォッチ = 新しい DefaultWatch();
  23.  
  24. プライベート静的CountDownLatch init = new CountDownLatch(1);
  25.  
  26. 公共 静的ZooKeeper getZK(){
  27.  
  28. 試す {
  29. //非同期なので、後続の操作を実行する前に、zk クラスターが接続されるまで待機する必要があります。
  30. zk = 新しい ZooKeeper(アドレス、1000、ウォッチ);
  31. ウォッチ.setCc(init);
  32. init.await();
  33.  
  34. } キャッチ (例外 e) {
  35. e.printStackTrace();
  36. }
  37.  
  38. zkを返します
  39. }
  40.  
  41. }

テストクラス:

  1. org.apache.zookeeper.ZooKeeper をインポートします。
  2. org.junit.Before をインポートします。
  3. org.junit.Test をインポートします。
  4.  
  5. /**
  6. * @プログラム: mxnzookeeper
  7. * @クラス名テスト構成
  8. * @説明:
  9. * @著者: muxiaonong
  10. * @作成日: 2021-10-19 22:04
  11. * @バージョン 1.0
  12. **/
  13. パブリッククラスTestConfig{
  14.  
  15. ZooKeeper zk;
  16.  
  17. @前に
  18. パブリックvoidconn(){
  19. ZKUtils の getZK() メソッドは、次のコードで使用できます。
  20. }
  21.  
  22. /** @著者 mxn
  23. * @Description //TODO ZKを閉じる
  24. * @日付2021/10/20 21:16
  25. * @パラメータ
  26. * @戻る 
  27. **/
  28. パブリックボイドクローズ(){
  29. 試す {
  30. zk.close ();
  31. }(例外 e) をキャッチ{
  32. e.printStackTrace();
  33. }
  34. }
  35.  
  36. @テスト
  37. パブリックvoid getConf(){
  38. WatchCallBack watchCallBack = 新しい WatchCallBack();
  39. watchCallBack.setZk(zk);
  40. 新しいMyConfig()を作成します。
  41. watchCallBack.setConf(myConfig);
  42.  
  43. //ブロッキング待機
  44. watchCallBack.aWait();
  45.  
  46.  
  47. while( true ){
  48.  
  49. if(myConfig.getConf().equals( "" )){
  50. システム。 out .println( "zk ノードが失われました......" );
  51. コールバックを待機します。
  52. }それ以外{
  53. システム。出力.println(myConfig.getConf());
  54.  
  55. }
  56. //
  57. 試す {
  58. //500ミリ秒ごとに印刷
  59. スレッド.sleep(500);
  60. } キャッチ (InterruptedException e) {
  61. e.printStackTrace();
  62. }
  63. }
  64.  
  65.  
  66. }

テストの実行

まず、IP に接続するときに /mxn ディレクトリ構造を追加したので、サーバーの初期状態でこのノードが存在する必要があることを知っておく必要があります。

クラスターの初期状態:

  1. [zk: localhost:2181(接続済み) 7] ls /
  2. [mxn、動物園の飼育員]

プログラムを開始して見てみましょう

接続に成功しました

ZooKeeper /mxnも空になりました

  1. [zk: localhost:2181(接続済み) 9] ls /mxn
  2. []
  3. [zk: localhost:2181(接続済み) 10]

それでは、/mxn/myZNodeノードデータを作成しましょう

  1. [zk: localhost:2181(接続済み) 10] /mxn/myZNode "muxiaonong666"を作成します 
  2. /mxn/myZNode を作成しました

ご覧のとおり、作成が完了すると、プログラムはすぐに応答し、私が設定した値、muxiaonong666を出力します。

このとき、/mxn/myZNodeの値をmuxiaonong6969に設定します。

スナップ!本当に早いですね!!!値が瞬時に変化することがわかります

このとき、/mxn/myZNode ノードを削除するとどうなるでしょうか?以前にも時計について書いたことがあります。 Znode が削除されると、ウォッチとコールバックが実行されます。

  1. NodeDeletedの場合:
  2. //ノードの削除
  3. conf.setConf( "" );
  4. //CountDownLatchを再度開く
  5. cc = 新しいCountDownLatch(1);
  6. 壊す;
  7.  
  8.  
  9.  
  10. if(myConfig.getConf().equals( "" )){
  11. システム。 out .println( "zk ノードが失われました......" );
  12. ////この時点で、ノードが再作成されるまでブロックして待機する必要があります
  13. watchCallBack.aWait();
  14. }

/mxn/myZNodeノードを削除します

  1. /mxn/myZNodeを削除します

最初はデータがまだ印刷されていることがわかりますが、後でデータが失われるというメッセージが表示されます。

ただし、現時点ではクライアントは閉鎖されておらず、データの更新を待機中です。この時点で /mxn/myZNode ノードを再作成すると、プログラムは異常な出力を続けます。

  1. /mxn/myZNode "muxiaonong666"を作成します 

プログラムは正常に実行され、zk 構成の最新データを正常に取得します。この時点で、ZooKeeper の分散構成センター機能は基本的に実現されます。

ここではgetDataでテストしましたが、実際のプロジェクトでは、より多くの子ノード操作getChildrenを使用する可能性があります。

要約する

これで、ZooKeeper の分散構成、登録、検出に関する記事は終了です。ご質問がございましたら、お気軽にご相談ください。 ZooKeeper は分散構成センターとして使用でき、マイクロサービスの登録にも使用できます。ただし、マイクロサービスには現在、独自のサービス検出セットがあります。 ZooKeeper を理解することで、テクノロジーを選択する際に適切な判断を下すことができます。 ZooKeeper の高可用性と最終的な一貫性も比較的安定しています。

この記事のコードアドレス: https://github.com/muxiaonong/ZooKeeper/tree/master/mxnzookeeper

<<:  エッジ データ ファブリックとは何ですか? また、なぜ重要ですか?

>>:  HarmonyOSが配布するTikTok風アプリ

推薦する

Baidu アルゴリズムのアップグレード後にかつて人気だった SEO ソフトウェアを確認する方法

ソフトウェアは、SEO 作業の負担を軽減する強力な武器です。記事の更新、外部リンクの公開、ランキング...

KVMLA: 建国記念日 20% オフ プロモーション VPS、日本ソフトバンク\シンガポール CN2、Windows システム付き

kvmla は、建国記念日に 20% オフのプロモーションを開始しました。具体的には、日本の東京デー...

企業にとってのオンラインニュースの意義と解決策

インターネットが世界中で急速に発展している現代では、雨後の筍のようにオンラインメディアが次々と登場し...

ウェブサイトデータを分析してSEOをより効果的に行う

周知のとおり、SEO はウェブサイトの運用と保守の手段であり、その費用対効果の高さから多くの運用保守...

私がよく知っているSEOの収益モデルについてお話しします

王世凡は、一人で働いていた頃から、今では小さなチームで働くようになり、自分が熟知しているいくつかの ...

ターゲットを絞ったトラフィックプロモーションを無料で得るための5つの方法をご紹介します

ターゲット トラフィックを獲得することは、ウェブサイトのプロモーション、特に販売ウェブサイトにとって...

企業のウェブサイトでは、キーワード密度がゼロになる問題をどのように解決できるでしょうか?

一部の企業ウェブサイトは、業界の特殊性により、多くの事業があり、その中には非常に人気のないものもあり...

A5マーケティング:企業のウェブサイトがBaiduによってペナルティを受けた後にウェブマスターが行うべき3つの重要なポイントについて簡単に説明します。

Baiduアルゴリズムの継続的な更新により、一部の企業ウェブサイトは降格、Kステーション、摘発を経験...

クラウドコンピューティングは「クラウドコンピューティング」にはならない

[[343467]]いわゆる「ビッグデータが古い顧客を殺す」とは、主にインターネット商人がビッグデー...

おすすめ: Vultr-12月の年間20ドルクーポンコード

vultr.com は 12 月に人気の割引コード、SSDVPS を提供しています。このコードを使用...

タオバオライブ:ダブル11を利用してアンカーを締める

今年のダブル11がやってきました。毎年恒例の電子商取引の戦いの主な「戦闘員」となったライブストリーミ...

医療ウェブサイトの最適化ロングテールワードランキングルール

2012 年 3 月 5 日月曜日、著者は医療業界のウェブサイトの最適化方法を分析し、共通の特徴を発...

IaaS により Fed のクラウド支出が 25% 増加

クラウド コンピューティングに対する連邦政府の支出は、サービスとしてのインフラストラクチャ (Iaa...

インターネット企業はどのようにして安全で信頼性の高いクラウド データ ストレージを構築するのでしょうか?

クラウドコンピューティングは急速な発展段階に入りました。パブリック クラウド テクノロジーとビジネス...

5.14 母の日、ブランドポスターマーケティングの見直し

どの祝日も人気スポットですが、母の日も例外ではありません。需要があるかどうかに関係なく、まずは参加し...