4

次のように Curator クライアントを作成します。

    RetryPolicy retryPolicy = new RetryNTimes(3, 1000);
    CuratorFramework client = CuratorFrameworkFactory.newClient(zkConnectString, 
            15000, // sessionTimeoutMs
            15000, // connectionTimeoutMs
            retryPolicy);

クライアント プログラムを実行しているときに、Curator が Zookeeper との通信に使用している NIC を停止して、ネットワーク パーティションをシミュレートします。私が見ている動作に基づいて、いくつか質問があります。

  1. ConnectionStateManager - State change: SUSPENDED10 秒後にメッセージが表示されます。Curator が SUSPENDED 状態に入るまでの時間は、他のタイムアウト値のパーセンテージに基づいて設定可能ですか、それとも常に 10 秒ですか?
  2. 前回の成功したハートビートから構成された 15 秒のセッション タイムアウトが経過した後、通知を受け取りませんログにメッセージ表示ZooKeeper - Session: 0x14adf3f01ef0001 closedされますが、これはキャプチャまたはリッスンできるイベントとして細流化するようには見えません。ここで何か不足していますか?
  3. 最終的ConnectionStateManager - State change: LOSTに、接続が失われてからほぼ 2 分後にメッセージを受け取ります。なぜそんなに長いのですか?
  4. SUSPENDED私の目標が HA シナリオでスプリットブレインを防ぐ手段として InterProcessMutex を使用することである場合、最も安全なアプローチは、メッセージが受信されたときにロック所有者がロックを失ったと想定することです。ネットワーク パーティションの反対側で、Zookeeper が知らないうちにロックを解除した可能性があります。これは典型的な/健全なアプローチですか?
4

3 に答える 3

2

使用している Curator のバージョンによって異なります (注: 私は Curator の主な作成者です)...

Curator 2.x では、LOST 状態は再試行ポリシーが使い果たされたことを意味します。セッションが失われたという意味ではありません。ZooKeeper では、アンサンブルへの接続が修復された場合にのみ、セッションが失われたと判断されます。そのため、Curator が最初の「切断されました」メッセージを確認すると、SUSPENDED になります。次に、再試行ポリシーが放棄されたために操作が失敗すると、LOST が発生します。

Curator 3.x では、LOST の意味が変更されました。3.x では、「Disconnected」を受信すると Curator が内部タイマーを開始します。タイマーがネゴシエートされたセッション タイムアウトを過ぎると、Curator は getTestable().injectSessionExpiration() を呼び出し、LOST 状態の変更を送信します。

于 2017-01-03T14:00:20.627 に答える