关于golang:超细细说Zookeeper选举的一个案例上

作者: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示意将取得的连贯给选举管理器的连贯。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理