golang通过zookeeper实现master选举
应用程序中有一个定时任务模块,之前是单机部署的,在实现多实例部署之后就对应用程序有了如下要求:
- 一个定时任务只能在一个实例上运行
- 一个应用实例故障后,原本由该实例执行的定时任务需要在其它实例上继续运行
Zookeeper 能够很容易实现这样的集群管理功能,它能够维护当前的集群中机器的服务状态,而且能够选出一个“总管”,让这个总管来管理集群,在这里即是让这个“总管”去执行定时任务。
完整的代码示例见:https://github.com/brotherbin/elec-master-demo
1. go zk client准备
从网上找到 golang 的 zookeeper 客户端 go-zookeeper:https://github.com/samuel/go-zookeeper ,网上反响很不错,而且还有比较详细的文档 zk-GoDoc: https://godoc.org/github.com/samuel/go-zookeeper/zk 。
2. 选举
实现方式是在 zookeeper 上创建一个 EPHEMERAL 类型的目录节点,当有一个实例创建成功后,该目录节点便已经存在,其它实例再去创建该节点就会提示该节点已存在。这也是我们想要的结果,将在 zookeeper 上创建目录节点成功的实例选举为 master 。
连接到zookeeper:
conn, connChan, err := zk.Connect(electionManager.ZKConfig.Servers, time.Second)
if err != nil {
return err
}
// 等待连接成功
for {
isConnected := false
select {
ca