ZooKeeper【集群模式】

ZooKeeper命令基本操作

cd /opt/module/zookeeper-3.5.7/bin
#启动服务端
./zkServer.sh start
#启动客户端
./zkCli.sh
#查看zookeeper状态
./zkServer.sh status
#退出客户端
quit
#关闭zookeeper
./zkServer.sh stop
#查看当前进程的全限定名
./jps -l

配置文件说明

# 通信心跳时间,zookeeper服务器和客户端心跳时间(单位ms)
tickTime=2000
# LF初始化通信时限,Leader和Flower初始连接时最长的等待时间(10*tickTime),也就是20s还未建立连接则认为通信失败
initLimit=10
# LF同步通信时限,Leader和Flower建立连接后仍然保持心跳联系,超过(5*syncLimit)认为Flower死亡,从服务器目录删除Flower。
syncLimit=5
# 保存zookeeper数据的目录
dataDir=/opt/module/zookeeper-3.5.7/zkData
# 客户端端口号
clientPort=2181

集群配置

        在zookeeper的zkData目录(我们自己指定的存放zookeeper数据的目录)下创建一个名为"myid"的文件(必须为myid)。

        在myid中添加与服务器对应的数字编号,比如hadoop102就配置数字编号 "2" (在整个zookeeper集群中唯一,所以分发zookeeper后,必须修改自己的myid)。我们需要在zoo.cfg的末行增加配置信息:

server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
#server.2代表myid=2的服务器
#hadoop102对应我们hadoop102的地址:192.168.88.134
#2888: Leader和Flower的通信端口
#3888: 如果集群中唯一的Leader挂了,通过这个端口来重新选举Leader

        因为我们配置了三台服务器,所以根据上一节说到的要求,我们必须启动半数以上(至少两台)的服务器zookeeper才能启动成功。

ZooKeeper的选举机制

三个属性

SID

        服务器ID。用来唯一标识每一台ZooKeeper集群中的机器,和myid一致。

ZXID

        它可以用来确保ZooKeeper的数据一致性。zxid是一个单调递增的计数器,它是由ZooKeeper服务器在处理每个事务时生成。

Epoch

        每个Leader任期的代号。

第一次启动时

以我们的集群为例(三台服务器hadoop102、hadoop103、hadoop104)

  1. hadoop102启动,发起选举,hadoop102投自己一票。但是此时hadoop102只有一票,不够半数以上(1<3/2=1.5),选举无法完成,hadoop102保持LOOKING状态(观望状态);
  2. hadoop103启动,此时zookeeper集群中服务器节点数量(2)>半数(1.5),zookeeper启动成功,这时候就需要选举出一个Leader了。
  3. 于是再次发起选举,hadoop102已经投过了(投给了自己),hadoop103也投自己一票,此时hadoop102和hadoop103各自一票。为了避免僵持状态,hadoop102和hadoop103互相交换选票信息,此时hadoop102发现hadoop103的myid (3) 比自己 (2) 大,于是hadoop102将自己的选票投给hadoop103,此时hadoop103票数=2,hadoop102票数=0,hadoop103成功选为Leader,状态改为LEADING,而hadoop102自动变为Flower,状态改为LEADING。
  4. 这时候,hadoop104姗姗来迟,才刚刚启动,于是又发起一次选举,hadoop104同样投给自己,但这时候已经存在Leader了,所以自己只能做Flower了。

zookeeper的选举机制是:只要投票过半数,服务器 id(myid)大的 直接胜出

        比如这个案例,尽管hadoop104比hadoop102和hadoop103的myid和服务器id都要大,但是因为当hadoop102和hadoop103启动的时候,已经超过了半数的要求,直接就开始选举并且hadoop103胜出,所以即使hadoop104的myid比hadoop103更大也没用。

非第一次启动

除了服务器初始化启动,当服务器节点无法和Leader保持连接的时候,也会进行Leader选举。

集群中确实不存在Leader(比如 Leader挂掉了) 

选举Leader的规则:

前提:节点数达到一半以上

比较优先级

  1. Epoch大的直接胜出
  2. Epoch相同,ZXID大的胜出
  3. ZXID相同,SID大的胜出

集群中存在Leader,但是节点没有连接上

        这种情况下,某个节点自认为Leader不存在,想要试图去选举Leader,当它向其它节点交换选票的时候,会被告知Leader是存在的并告诉Leader的信息,该节点只需要与Leader建立连接即可。

安装ZooKeeper服务器的个数

基本原则是安装奇数台。

生产经验:

  • 10 台服务器:3 台 zk;
  • 20 台服务器:5 台 zk;
  • 100 台服务器:11 台 zk;
  • 200 台服务器:11 台 zk;

服务器台数多:好处:提高可靠性;坏处:提高通信延时。所以不见得越多越好。

ZooKeeper群起脚本

#!/bin/bash

case $1 in
"start"){
	for i in hadoop102 hadoop103 hadoop104
	do
		echo "========== zookeeper $i 启动 ============"
		ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh start"
	done
}
;;
"stop"){
	for i in hadoop102 hadoop103 hadoop104
	do
		echo "========== zookeeper $i 关闭 ============"
		ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh stop"
	done
}
;;
"status"){
	for i in hadoop102 hadoop103 hadoop104
	do
		echo "========== zookeeper $i 状态 ============"
		ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh status"
	done
}
;;
esac

注意

        不能直接从windows复制脚本文件过去,会报错文件中有windows的换行符。

        可以从windows复制脚本内容,然后粘贴到linux的vim编辑器这样是没问题的。

你可能感兴趣的:(Zookeeper,linux,大数据,zookeeper)