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)
- hadoop102启动,发起选举,hadoop102投自己一票。但是此时hadoop102只有一票,不够半数以上(1<3/2=1.5),选举无法完成,hadoop102保持LOOKING状态(观望状态);
- hadoop103启动,此时zookeeper集群中服务器节点数量(2)>半数(1.5),zookeeper启动成功,这时候就需要选举出一个Leader了。
- 于是再次发起选举,hadoop102已经投过了(投给了自己),hadoop103也投自己一票,此时hadoop102和hadoop103各自一票。为了避免僵持状态,hadoop102和hadoop103互相交换选票信息,此时hadoop102发现hadoop103的myid (3) 比自己 (2) 大,于是hadoop102将自己的选票投给hadoop103,此时hadoop103票数=2,hadoop102票数=0,hadoop103成功选为Leader,状态改为LEADING,而hadoop102自动变为Flower,状态改为LEADING。
- 这时候,hadoop104姗姗来迟,才刚刚启动,于是又发起一次选举,hadoop104同样投给自己,但这时候已经存在Leader了,所以自己只能做Flower了。
zookeeper的选举机制是:只要投票过半数,服务器 id(myid)大的 直接胜出。
比如这个案例,尽管hadoop104比hadoop102和hadoop103的myid和服务器id都要大,但是因为当hadoop102和hadoop103启动的时候,已经超过了半数的要求,直接就开始选举并且hadoop103胜出,所以即使hadoop104的myid比hadoop103更大也没用。
非第一次启动
除了服务器初始化启动,当服务器节点无法和Leader保持连接的时候,也会进行Leader选举。
集群中确实不存在Leader(比如 Leader挂掉了)
选举Leader的规则:
前提:节点数达到一半以上
比较优先级:
- Epoch大的直接胜出
- Epoch相同,ZXID大的胜出
- 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的换行符。文章来源:https://www.toymoban.com/news/detail-481348.html
可以从windows复制脚本内容,然后粘贴到linux的vim编辑器这样是没问题的。文章来源地址https://www.toymoban.com/news/detail-481348.html
到了这里,关于ZooKeeper【集群模式】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!