zookeeper锁保持锁定

Mil*_*cic 8 python locking celery kazoo apache-zookeeper

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

所以我的问题是:杀死进程释放锁定在该进程中还是在zookeeper中有一些错误?

sbr*_*ges 9

Zookeeper 使用临时节点.短暂节点是一个节点,只要创建它的会话处于活动状态,该节点就会存在.创建会话的过程会定期向zookeeper发送心跳消息,从而使会话保持活动状态.

因此,如果您终止了创建锁定的进程,则最终会释放锁定,因为会话将因zookeeper不再接收心跳而死亡.

因此,在释放锁之前杀死一名工人最终应该释放锁.

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

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

这不是一个动物园管理员的错误.

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


fge*_*fge 1

使用终止信号终止进程对于清除“软件锁”(例如 ZooKeeper 锁)没有任何作用。

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

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

  • Kill -9 应该会导致zookeeper会话终止,这会导致临时节点终止,这会导致zookeeper锁被释放 (3认同)