集群模式和单机模式的主要区别在于配置文件 conf/zoo.cfg。
准备阶段:三台linux服务器,zookeeper压缩包。
1、搭建zookeeper集群
- 分别在三台机器上安装号zookeeper,并更改配置文件conf/zoo.cfg的dataDir属性
- 在每个机器的配置文件zoo.cfg末尾添加信息,如果是云服务器,ip应填内网ip
#server是关键字,后面的数字是选举id,在zookeeper集群选举中会用到。选举id是自定义的,但不能重复
#2888是原子广播端口,自定义端口号
#3888是选举端口,自定义端口号
server.1=192.168.11.10:2888:3888
server.2=192.168.11.10:2888:3888
server.3=192.168.11.10:2888:3888
- 找到配置文件中dataDir对应的目录,在该目录下创建文件myid,并以选举id作为文件内容。因为选举的时候会去该目录下的myid文件里找选举id
- 关闭各自机器的防火墙:service iptables stop
- 启动各自的服务,并查看各自zookeeper服务的状态
- 启动日志:若启动失败,则在启动目录里会生成一个zookeeper.out日志文件,注意自己在哪个目录启动的zookeeper
2、选举机制
选举分两个阶段:
- 数据恢复阶段,每台zookeeper启动时,都会从dataDir目录找到最大的事务id(Zxid)
- 选举阶段,每台zk服务都会推荐自己当leader,并提交自己的选举协议,然后进行pk。
协议内容如下:
pk原则:
3、举例说明选举机制原理
如图,有A,B,C三台zookeeper服务组成的集群,以及各自的选举id,最大事务id,启动服务的顺序。
过程详解:
- 启动A,由于没有竞争对手,则A处于Looing(选举中)状态
- 启动B,此时A和B开始pk
- A和B的Zxid相等,B的myid更大,所以B胜利,那么A肯定就是Follwer
- 由于整个集群只有三个zookeeper服务会参与选举,只要有两个支持者,则leader就会被选举出来。此时A和B都支持B当leader,所以已经满足了过半性。
- 启动C,由于Leader已经选举出来,所以C为Follower
此时若把B停掉,那么A和C又会按照规则重新pk,结果显而易见,C为Leader,A为Follower。
此时若再A和C中停掉任意一台,集群就会挂掉。因为只有一台zookeeper服务,无法满足过半性。