zookeeper集群

前提是你 提交于 2019-12-10 23:10:50

集群搭建事项

  1. zk集群,只要大多数(超过半数)的机器准备好了,就可以提供服务了。
  2. 容错集群至少三台,建议采用奇数台来搭建集群。
  3. 每台服务运行在独立的机器上。

集群搭建

1.集群配置基本参数介绍

在第二章说到zoo.cfg中有两个配置参数和集群有关:initLimit和syncLimit,除此之外还有一些其他的配置。

  • initLimit:表示集群同步初始化允许容忍的最长时间,是tickTime的倍数,比如initLimit = 10,tickTime = 1000,则表示集群同步初始化最长能容忍10秒钟,如果zk集群确实很大,机器很多,可以适当调高这个参数。
  • syncLimit:表示客户端和zk集群请求应答的超时时间,同样是tickTime的倍数。
  • server.id=host:port:port:这个配置也是放在zoo.cfg文件中,集群中有几台机器,就需要配置几个,比如集群中有三台机器需要配置,eg:

server.1=localhost:2182:2183
server.2=localhost:2282:2283
server.3=localhost:2382:2383

其中id表示集群中每一台机器的编号,localhost表示机器的ip地址,第一个port用来和Leader进行交互,第二个port用来选举Leader。(zk的leader和选举后面再细讲)

  • myid配置文件:这个配置文件放置在zoo.cfg中的dataDir配置项所配置的目录中,文件里在只需要一个id数字即可,表示当前机器在集群中的id是多少。

2.集群搭建步骤

    这里以单机搭建三个服务的集群为例,多机搭建要比单机简单。

  1. 我们将第一章中下载解压的zookeeper文件夹复制成三分:

在这里插入图片描述

  1. 点开每一个文件夹下的conf目录下的zoo.cfg文件,第一个服务配置如下

initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper1
clientPort=2181
server.1=localhost:2182:2183
server.2=localhost:2282:2283
server.3=localhost:2382:2383

第二个服务配置如下:

initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper2
clientPort=2281
server.1=localhost:2182:2183
server.2=localhost:2282:2283
server.3=localhost:2382:2383

第三个服务配置如下:

initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper2
clientPort=2381
server.1=localhost:2182:2183
server.2=localhost:2282:2283
server.3=localhost:2382:2383

  1. 打开各自dataDir配置的目录:/tmp/zookeeper1、/tmp/zookeeper2、/tmp/zookeeper3,在里面放上myid文件,文件内容分别为1、2、3。

    这样集群的配置就完成了,由于是单机配集群,所以zoo.cfg文件中,clientPort都不一致,以及其他的端口都不一样,否则会出现端口冲突。dataDir也不一致,否则所有的日志和文件都会放到同一个目录下甚至发生问题。

zk集群的Leader选举

    zk集群中存在一个leader,而每次leader宕掉之后,集群需要自主的重新进行leader选举。其中存在一些概念:

  • 服务器id:上文搭建集群时,每个节点都有的myid。
  • 事务id:当前服务器中最大的Zxid。
  • 逻辑时钟:发起投票轮数的计数器,记录本次投票为第几轮
  • 选举状态:LOOKING(竞选状态)、FOLLOWING(随从状态,同步Leader数据,参与投票)、OBSERVING(观察者状态,同步Leader数据,不参与投票)、LEADING(领导状态)。
    而服务器之间进行选举时需要互相传递参数为(服务器id,事务id,逻辑时钟,选举状态)。

选举算法

  1. 每一个服务器都向其他服务器发起选举,并且把票投给自己。
  2. 每个服务器也就会收到来自其他服务器的投票,如果其他服务器的事务id比自己的大,那就投给他一票,如果比自己小就不投,如果事务id和自己一样,那就再比较服务器id,如果服务器id比自己的大,投给他,比自己小不投。
  3. 发起者收到大家的反馈后,看投票数(包括自己给自己投)是否大于集群的的半数,大于则胜出,担任领导者,如果没有超过半数,则再此发起投票。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!