共计 2295 个字符,预计需要花费 6 分钟才能阅读完成。
作者:ReganYue
起源:恒生 LIGHT 云社区
超细!细说 Zookeeper 选举的一个案例
明天咱们来带着大家实现用 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 循环,就是一直从管道中读取选举后果,是否胜利,如果胜利示意集群能够失常运作了,就能够实现具体的业务逻辑了,如果没选举胜利就只能始终期待了。
四、创立选举管理器
func NewElectionManager(zkConfig *ZookeeperConfig, isMaster chan bool) *ElectionManager {
electionManager := &ElectionManager{
nil,
zkConfig,
isMaster,
}
electionManager.initConnection()
return electionManager
}
创立选举管理器比较简单,就是输出一些配置信息,来初始化连贯,而后将初始化后的选举管理器传递进来。
五、初始化 Zookeeper 连贯
在创立选举管理器中用到了初始化 Zookeeper 连贯的办法,实现如下:
func (electionManager *ElectionManager) initConnection() error {if !electionManager.isConnected() {conn, connChan, err := zk.Connect(electionManager.ZKConfig.Servers, time.Second*5)
if err != nil {return err}
for {
isConnected := false
select {
case connEvcent := <-connChan:
if connEvcent.State == zk.StateConnected {
isConnected = true
fmt.Println("zk 连贯胜利")
}
case _ = <-time.After(time.Second * 3):
return errors.New("zk 连贯超时!")
}
if isConnected {break}
}
electionManager.ZKClientConn = conn
}
return nil
}
先是判断是否曾经连贯 Zookeeper,如果连贯有问题,或者没有连贯的状况下就进行连贯 zookeeper。
上面来介绍这个 zk.Connect,Connect 用于建设到 Zookeeper 服务器池的新连贯。第一个参数是服务器集群地址,第二个参数是在失去与服务器的连贯后以后会话仍被视为无效的工夫量。在会话超时之前,能够从新建设到不同服务器的连贯并放弃雷同的会话。这样能够保护和监控任何长期节点。
而后就是进入循环,一直去 connChan 取货色,当 connChan 是 zk.StateConnected 时,示意连贯胜利,就给 isConnected 赋值为 true,如果 3 秒都未胜利,则报错连贯超时。当连贯胜利时跳出这个 for 循环,electionManager.ZKClientConn = conn
示意将取得的连贯给选举管理器的连贯。