8

セロリと動物園の飼育係(カズーロック)を使って労働者をロックしています。ロックを解除する前にワーカーの1人を殺す(-9)と、そのロックが永久にロックされたままになるという問題があります。

だから私の質問は:プロセスを殺すとそのプロセスのロックが解除されますか、それともこれはzookeeperのバグですか?

4

2 に答える 2

10

Zookeeperロックは、一時的なノードを使用します。エフェメラルノードは、それを作成したセッションが存続している限り存続するノードです。セッションは、定期的にハートビートメッセージを動物園の飼育係に送信するセッションを作成するプロセスによって存続します。

したがって、ロックを作成したプロセスを強制終了すると、動物園の飼育係がハートビートを受信しなくなるとセッションが終了するため、ロックは最終的に解放されます。

したがって、ロックが解除される前にワーカーを強制終了すると、最終的にはロックが解除されます。

ロックが解除されない場合は、いくつかのことが発生している可能性があります。

  1. 他の誰かがロックが解除されたことに気づき、それを取得しました。おそらく、競合があるためにロックしていると思われます。他のプロセスは、ロックが解放されたときにロックを取得しようとします。
  2. あなたは十分長く待っていません。zookeeperに接続するときは、セッションタイムアウトパラメータを設定する必要があります。これは、サーバーがハートビートを聞かずにセッションを存続させる時間です。ロックが解除されるまで、この時間待つ必要があります。
  3. カズーにバグがあります。これは可能ですが、kazooロックレシピはエフェメラルノードを使用しているように見えます。説明するユースケースは非常に基本的なものです。

これが飼育係のバグである可能性はほとんどありません。

ロックが解除されていないことをどうやって知ることができますか?

于 2012-12-22T14:45:59.460 に答える
0

強制終了シグナルを使用してプロセスを強制終了しても、ZooKeeperロックなどの「ソフトウェアロック」はクリアされません。

KILLシグナルによって強制終了される唯一の種類のロックは、OSレベルのロックです。これは、すべてのファイル記述子が強制終了されるため、ファイル記述子のロックも強制終了されるためです。ただし、ZooKeeperに関する限り、これらはOSレベルのロックではありません(同じマシン上であっても、ZooKeeperプロセスがPythonプロセスの1つではないためです)。

したがって、これはZooKeeperのバグではなく、kill-9の予想される動作です。

于 2012-12-21T21:17:52.240 に答える