8

我正在使用 celery 和 zookeeper (kazoo lock) 来锁定我的工人。当我在释放锁之前杀死(-9)一名工作人员时,我遇到了一个问题,然后该锁将永远保持锁定状态。

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

4

2 回答 2

10

Zookeeper使用临时节点。临时节点是一个节点,只要创建它的会话还活着,它就会一直存在。会话通过创建会话的进程定期向 Zookeeper 发送心跳消息来保持活动状态。

因此,如果您杀死创建锁的进程,锁最终将被释放,因为会话将随着 Zookeeper 不再接收心跳而终止。

所以在释放锁之前杀死一个工人应该最终释放锁。

如果锁从未被释放,可能会发生一些事情,

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

这不太可能是 zookeeper 错误。

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

于 2012-12-22T14:45:59.460 回答
0

使用终止信号终止进程不会清除“软件锁”,例如 ZooKeeper 锁。

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

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

于 2012-12-21T21:17:52.240 回答