我的超细!细说Zookeeper选举的一个案例(一)

824 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

今天我们来带着大家实现用Zookeeper实现选举的案例,帮助大家更好的学习Zookeeper。

一、安装所需第三方库

使用Go来对Zookeeper进行操作需要使用go get github.com/samuel/go-zookeeper/zk。根据GitHub上有关它的描述它是一个Zookeeper客户端~

当然现在它的最新仓库地址是https://github.com/go-zookeeper/zk

你也可以下载这个仓库的第三方库。

二、定义配置信息和选举管理信息的结构体

type ZookeeperConfig struct {
    Servers    []string
    RootPath   string
    MasterPath string
}
​
type ElectionManager struct {
    ZKClinet *zk.Conn
    ZkConfig *ZookeeperConfig
    IsMaster chan bool
}

配置信息就是包含zookeeper集群服务器地址,根路径以及它的Master节点路径。

选举管理信息包括zookeeper的连接信息、zookeeper的配置信息、以及传递选举信息的管道。

三、程序主逻辑

func main() {
    zkconfig := &ZookeeperConfig{
        Servers:    []string{"node01:2181", "node02:2181", "node03:2181"},
        RootPath:   "/test04",
        MasterPath: "/master",
    }
​
    isMasterChan := make(chan bool)
    electionManager := NewElectionManager(zkconfig, isMasterChan)
​
    go electionManager.Run()
​
    var isMaster bool
    for {
        select {
        case isMaster = <-isMasterChan:
            if isMaster {
                fmt.Println("实现具体的业务逻辑")
            }
        }
    }
​
}

这个zkconfig是填入咱们要使用的zookeeper集群配置信息,isMasterChan建立用于返回选取结果的信道,然后创建选举管理器,正如我们平时的选举有选举委员会一样,zookeeper的选举也需要选举管理器。然后开辟协程来进行选举:go electionManager.Run(),除了每次启动集群时会选举主节点之外,还需要监视主节点,如果主节点出问题了,需要立刻选举出一个新的主节点。下面的isMaster是判断是否是主节点,是通过信道的返回值来判断的。然后下面的for循环,就是不断从管道中读取选举结果,是否成功,如果成功表示集群可以正常运作了,就可以实现具体的业务逻辑了,如果没选举成功就只能一直等待了。