ZooKeeper是分布式一致性存储系统。ZooKeeper客户端可以利用ZooKeeepr的特性实现自身的选主。本文介绍一种可行的方法(主要思路):
系统环境:ZooKeeper集群,若干ZooKeeper客户端(这些客户端需要利用ZooKeepr选出一个主节点)
- 在ZooKeeper上创建出选主所需要的目录,例如/election,我们称之为选主目录。
- 客户端在选主目录下,创建一个临时顺序节点(EPHEMERAL_SEQUENTIAL),节点的内容可以为客户端本身的一些标识(这样其它客户端可以得知集群中其它的客户端节点)。
- 收集选主目录下的所有子节点(getChildren),排序,如果本客户端是第一个子节点,那么自身为主。否则,为从。作为从节点,可以监听选主目录,这样当主节点与ZooKeeper断开连接时(临时节点被删除)会得到通知,然后从节点就可以再次尝试选主。
双主问题的避免:
以上的算法,有一定的缺点:假设客户端1选主成功,然后因为某些原因和ZooKeeper断开连接,临时节点被删除,客户端2选主成功,但此时客户端1还认为自己是主(客户端1反映可能不那么及时)。
可以引入租约的机制来解决这个问题。具体地:
- 每次选主后成功后,有一定的租约,租约过期前,客户端必须确保续约。(检查一下临时节点是否还存在,并且是排序后最小的那一个。)
- 选主成功后,等待一个租约的时间(确保其它的客户端可以退出),然后再次检查是否为主,如果是,那么选主成功,否则继续选主。
具体的实现请读者自行设计。
网友评论