zookeeper原理与部署
zookeeper概念
zookeeper是用来在分布式系统中,保证各节点的一致性,实现集群的高可用,采用ZAB协议,
zookeeper的主要功能有:管理分布式集群;维护和监控集群内存储数据的状态变化;实现基于数据的集群管理
zookeeper特点:
顺序一致性:客户端发起的事务请求,按照发起的顺序被应用到 zookeeper 中
原子性:所有事务请求的处理结果在集群中所有服务器上的应用情况一致
单一视图:客户端连接的集群内的任一服务器,看到的数据模型都是一致的
高性能:数据存储在内存中,性能高
高可用:基于副本机制实现高可用,支持故障恢复
zookeeper角色
leader:领导者,集群的中心,负责维护集群状态,统一调度及处理客户端请求的写操作,同时也会处理客户端请求的读操作。由集群选举产生,发生故障时会根据选举机制选出新的leader
follower:跟随者,负责客户端请求的读操作,并将写操作请求转发至leader,参与leader选举过程的投票
observer:观察者,观察zookeeper集群的状态,并进行同步,负责处理客户请求的读操作,但不参与投票选举leader,设置observer节点可以提升集群的读性能
zookeeper选举机制
第一次启动时:
原则:根据myid的大小决定投给哪个节点,一个节点得票数超过集群内服务器数量的一半就可以成为leader节点,因此一个zookeeper集群至少需要3台服务器
集群内有5台zookeeper服务器
服务器A启动,投票给自己
服务器B启动,投票给自己,这时服务器A发现服务器B的myid比自己高,于是便投票给服务器B
服务器C启动,投票给自己,这时服务器A和B发现服务器C的myid比自己高,因此便投票给C
这时,服务器C得票是3,大于集群节点数量的一半,因此服务器C选举为leader节点
服务器D,E启动后,会直接连接服务器C,不参与选举
非第一次启动:
选举过程与第一次启动大抵相同,也是数量超过一半,根据zxid,server id,epoch大小进行投票选举新的leader,与leader节点挂掉重新选举流程同
原则是,先比较epoch,会投票给epoch值大的
epoch相同,会投票给zxid值大的
zxid值相同,会投票给server id大的
zookeeper故障转移
如果follower节点挂掉,不会影响当前集群的状态,节点恢复后会重新加入到集群中
当leader节点挂掉时,集群内的其他处于follower状态的节点会将状态改成looking,重新进行选举
选举流程参照非第一次启动选举的流程
zookeeper部署
主机列表
ip | 角色 | 主机名 |
---|---|---|
192.168.88.159 | zooker-1 leader | web-server |
192.168.88.160 | zooker-2 follower | mysql-server1 |
192.168.88.128 | zooker-3 follower | mysql-server2 |
zookeeper版本:zookeeper-3.5.10
jdk版本:1.8.0
下载地址:https://dlcdn.apache.org/zookeeper/zookeeper-3.5.10/apache-zookeeper-3.5.10-bin.tar.gz
三台机器上进行操作:
建立目录及用户
]# mkdir /zookeeper ]# mkdir /zookeeper/data ##zooker数据存放目录
192.168.88.159
解压压缩包
zookeeper:
]# tar xvf apache-zookeeper-3.5.10-bin.tar.gz -C /zookeeper ]# cd /zookeeper/ ]# mv apache-zookeeper-3.5.10-bin/ zookeeper
jdk:
]# tar xvf jdk-8u321-linux-x64.tar.gz -C /zookeeper/zookeeper ]# cd /zookeeper/zookeeper/ ]# mv jdk1.8.0_321/ jdk
编辑zookeeper配置文件
zoo.cfg
]# cd /zookeeper/zookeeper/conf/ ]# cp zoo_sample.cfg zoo.cfg ]# vim zoo.cfg ##编辑以下配置 dataDir=/zookeeper/data ##zooker的数据目录,需要提前建立 clientPort=22181 ##客户端连接zooker的端口 ##配置集群通信端口 server.1=192.168.88.159:22888:23888 server.2=192.168.88.160:22888:23888 server.3=192.168.88.128:22888:23888
myid
##创建myid号,192.168.88.159的myid设置为3 ]# echo 3 > /zookeeper/data/myid
配置java环境变量:zkEnv.sh文件中
]# cd /zookeeper/zookeeper/bin ]# vim zkEnv.sh JAVA_HOME=/zookeeper/zookeeper/jdk
将zookeeper目录拷贝到192.168.88.160及192.168.88.128上
]# scp -r -P16022 /zookeeper/ 192.168.88.160:/ ]# scp -r -P16022 /zookeeper/ 192.168.88.128:/
分别在192.168.88.160及192.168.88.128上配置myid
192.168.88.160设置为1,192.168.88.128设置为2
]# echo 1 > /zookeeper/data/myid ##192.168.88.160 ]# echo 2 > /zookeeper/data/myid ##192.168.88.128
查看三台服务器的zookeeper状态:
192.168.88.159:leader
192.168.88.160:follower
192.168.88.128:follower
测试集群同步性
在192.168.88.159建立test文件并写入"test1"
在其他两个节点上查看
192.168.88.160:
192.168.88.128:
数据同步成功
zookeeper脚本
需要使用专用用户zookeeper运行
路径:/zookeeper/zookeeper/script
启动脚本:zooker_start.sh
#!/bin/bash if [ "`whoami`" != "zookeeper" ];then echo "error: not zookeeper user start" exit 10 fi /zookeeper/zookeeper/bin/zkServer.sh start 2>&1 | grep 'STARTED' &>/dev/null if [ $? -eq 0 ];then echo "success: zookeeper start" else echo "error: zookeeper start failed" fi
停止脚本:zooker_stop.sh
#!/bin/bash if [ "`whoami`" != "zookeeper" ];then echo "error: not zookeeper user stop" exit 10 fi /zookeeper/zookeeper/bin/zkServer.sh stop 2>&1 | grep 'STOPPED' &>/dev/null if [ $? -eq 0 ];then echo "success: zookeeper stop" else echo "error: zookeeper stop failed" fi
状态查看脚本:zooker_status.sh
#!/bin/bash /zookeeper/zookeeper/bin/zkServer.sh status