zookeeper锁保持锁定

时间:2012-12-21 21:14:25

标签: python locking celery apache-zookeeper kazoo

我正在使用芹菜和动物园管理员(kazoo锁)来锁定我的工人。当我在释放锁之前杀死(-9)其中一个工人然后锁永远锁定时,我遇到了问题。

所以我的问题是:杀死进程释放是否锁定了该进程,或者这是zookeeper中的一些错误?

2 个答案:

答案 0 :(得分:9)

Zookeeper locks使用ephemeral nodes。短暂节点是一个生存的节点,只要创建它的会话是活动的。创建会话的过程会定期向zookeeper发送心跳消息,从而使会话保持活动状态。

因此,如果你杀死了创建锁的进程,那么最终会释放锁,因为当zookeeper不再接收到心跳时,会话将会死亡。

因此,在释放锁定之前杀死一名工作人员最终应该释放锁定。

如果永远不会释放锁定,可能会发生一些事情,

  1. 其他人注意到锁被释放并获得了它。大概你是锁定因为存在争用,而其他一些进程会在释放时尝试获取锁。
  2. 你没有等待足够长的时间。当您连接到zookeeper时,应该设置一个会话超时参数,即服务器在没有听到任何心跳的情况下保持会话活动的时间,您必须等待很长时间才能看到释放的锁
  3. kazoo中有一个错误。这是可能的,但看起来kazoo lock recipe使用短暂的节点,你描述的用例是一个非常基本的用例。
  4. 这不是一个动物园管理员的错误。

    你怎么知道锁没有被释放?

答案 1 :(得分:0)

使用kill信号杀死进程无法清除ZooKeeper锁等“软件锁”。

KILL信号杀死的唯一一种锁是OS级锁,因为所有文件描述符都被杀死,因此文件描述符锁被杀死。但就ZooKeeper而言,那些不是操作系统级锁定(只是因为ZooKeeper进程,即使在同一台机器上,也不是你的python进程)。

因此,它不是ZooKeeper中的错误,也不是kill -9的预期行为。