Zookeeper集群
Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目。
工作机制:Zookeeper基于观察者模式设计,负责存储和管理关键数据,同时接受观察者注册,一旦数据状态发生变化,将通知已注册的观察者做出相应反应。因此,Zookeeper可以理解为文件系统加通知机制的组合。
特点:
- 集群由一个领导者(Leader)和多个跟随者(Follower)组成。
- 集群中只要有半数以上节点存活,Zookeeper集群就能正常服务,适合安装奇数台服务器。
- 全局数据一致,每个Server保存相同的数据副本。
- 更新请求顺序执行,来自同一客户端的更新请求按发送顺序依次执行。
- 数据更新原子性,一次数据更新要么成功,要么失败。
- 实时性,在一定时间范围内,Client能读到最新数据。
数据结构:
类似Linux文件系统,整体是一棵树,每个节点称做一个ZNode,每个ZNode默认能够存储1MB的数据。
应用场景:
包括统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。
选举机制:
Zookeeper选举机制包括第一次启动选举机制和非第一次启动选举机制,确保在Leader故障时能够重新选举产生新的Leader,保证系统高可用性。
以上是Zookeeper的概述,其工作原理和应用场景都在文档中有详细介绍。
Zookeeper应用场景
- 统一命名服务:Zookeeper提供统一的命名服务,有助于分布式环境下识别应用/服务。举例来说,IP地址不易记忆,而域名则容易记住。
- 统一配置管理:Zookeeper可统一管理分布式环境下的配置信息,确保所有节点的配置信息一致。通过将配置信息写入Zookeeper的ZNode,其他客户端服务器可以监听该ZNode,一旦数据更新,Zookeeper将通知其他服务器,实现快速同步配置。
- 统一集群管理:Zookeeper可以实时监控节点状态变化,提供统一管理服务。节点信息可以写入Zookeeper的ZNode,监听该ZNode可以获取节点实时状态变化。
- 服务器节点动态上下线:Zookeeper支持客户端实时感知服务器上下线的变化,为系统提供更好的动态管理能力。
- 软负载均衡:Zookeeper记录每台服务器的访问数,并通过Zookeeper的数据管理来实现负载均衡。
以上是Zookeeper的应用场景,其协调服务为分布式系统提供了重要的管理功能。
Zookeeper 选举机制
根据文档内容,Zookeeper的选举机制主要包括以下几个方面:
- 第一次启动选举机制:
- 服务器1启动,发起一次选举,此时服务器1获得一票,不足半数以上(3票),选举无法完成,服务器1状态保持LOOKING。
- 服务器2启动,再次发起选举。服务器1和2分别投自己一票并交换选票信息。服务器1发现服务器2的myid比自己大,因此更改选票为推举服务器2。此时服务器1和2的状态保持LOOKING。
- 服务器3启动,发起一次选举。此时服务器1和2会更改选票为服务器3。此次投票结果:服务器1和2为0票,服务器3为3票,超过半数,因此服务器3当选为Leader。服务器1和2的状态更改为FOLLOWING,服务器3的状态更改为LEADING。
- 服务器4和5启动后,成为小弟,状态为FOLLOWING。
- 非第一次启动选举机制:
- 服务器启动或无法与Leader保持连接时,会进入选举流程。
- 如果集群已存在Leader,新加入的服务器只需与Leader建立连接并进行状态同步即可。
- 如果集群不存在Leader,则根据服务器ID、事务ID等参数进行选举。
- 选举规则:
- EPOCH大的直接胜出。
- EPOCH相同,事务ID大的胜出。
- 事务ID相同,服务器ID大的胜出。
综上所述,Zookeeper的选举机制通过保证系统的高可用性,使得Zookeeper集群在发生故障时能够快速选举出新的Leader,从而确保集群能够正常提供服务。
Zookeeper的部署
1.准备三台服务器
server.1:192.168.20.10
server.2:192.168.20.20
server.3:192.168.20.30
2.安装JDK环境
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
java -version
3.下载安装包
cd /opt
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/apache-zookeeper-3.5.7-bin.tar.gz
mv apache-zookeeper-3.5.7-bin /usr/local/zookeeper-3.5.7
4.修改配置文件
cd /usr/local/zookeeper-3.5.7/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
添加服务器节点,设置日志存放目录和数据存放目录
每个节点都要添加
创建两个目录文件夹
mkdir -p /tmp/zookeeper/log
mkdir -p /tmp/zookeeper/data
每个节点的dataDir指定的目录下创建一个 myid 的文件
echo 1 > /tmp/zookeeper/data/myid
echo 2 > /tmp/zookeeper/data/myid
echo 3 > /tmp/zookeeper/data/myid
5.配置 Zookeeper 启动脚本
vim /etc/init.d/zookeeper
#!/bin/bash
#chkconfig:2345 20 90
#description:Zookeeper Service Control Script
ZK_HOME='/usr/local/zookeeper-3.5.7'
case $1 in
start)
echo "---------- zookeeper 启动 ------------"
$ZK_HOME/bin/zkServer.sh start
;;
stop)
echo "---------- zookeeper 停止 ------------"
$ZK_HOME/bin/zkServer.sh stop
;;
restart)
echo "---------- zookeeper 重启 ------------"
$ZK_HOME/bin/zkServer.sh restart
;;
status)
echo "---------- zookeeper 状态 ------------"
$ZK_HOME/bin/zkServer.sh status
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
esac
6.设置开机自启
chmod +x /etc/init.d/zookeeper
chkconfig --add zookeeper
分别启动Zookeeper并且查看状态
service zookeeper start
service zookeeper status
启动成功