Zookeeper锁一直锁着

jtjikinw  于 2022-12-09  发布在  Apache
关注(0)|答案(2)|浏览(146)

我正在使用celery 和Zookeeper(卡祖笛锁)来锁定我的工人。我有一个问题,当我杀死(-9)一个工人之前释放锁,然后锁永远锁定。
所以我的问题是:杀死进程会释放该进程中的锁吗?还是这是zookeeper中的某个bug?

rjzwgtxy

rjzwgtxy1#

Zookeeper锁使用临时节点。临时节点是指只要创建它的会话处于活动状态,它就一直处于活动状态的节点。通过创建会话的进程定期向Zookeeper发送心跳消息,会话就一直处于活动状态。
因此,如果您终止创建锁的进程,锁最终将被释放,因为会话将因zookeeper不再接收心跳而死亡。
因此,在释放锁之前杀死一个工作线程应该最终释放锁。
如果锁一直没有打开,可能会发生一些事情,
1.其他人注意到锁被释放并获得了它。可能您锁定锁是因为存在争用,并且其他进程将尝试在锁被释放时获得它。
1.您等待的时间不够长。当您连接到zookeeper时,应该设置一个会话超时参数,即服务器在没有听到任何心跳的情况下保持会话活动的时间,您必须等待这么长时间才能看到锁被释放

  1. kazoo中有一个bug。这是可能的,但看起来kazoo lock recipe使用了短暂的节点,而你描述的用例是非常基本的。
    这不太可能是Zookeeper的错误。
    你怎么知道锁没有被打开?
n6lpvg4x

n6lpvg4x2#

使用终止信号终止进程不会清除“软件锁”(如ZooKeeper锁)。
唯一被KILL信号杀死的锁是操作系统级别的锁,因为所有的文件描述符都被杀死了,文件描述符锁也被杀死了。但是就ZooKeeper而言,这些锁不是操作系统级别的锁(仅仅是因为ZooKeeper进程,即使在同一台机器上,也不是你的python进程)。
因此,这不是ZooKeeper中的bug,而是kill -9的预期行为。

相关问题