写点什么

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

  • 2021 年 12 月 17 日
  • 本文字数:1814 字

    阅读完需:约 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表示将获得的连接给选举管理器的连接。

发布于: 21 分钟前阅读数: 3
用户头像

还未添加个人签名 2018.11.07 加入

还未添加个人简介

评论

发布
暂无评论
超细!细说Zookeeper选举的一个案例(上)