一、关于ZooKeeper
ZooKeeper是一个分布式的、开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件,为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。ZooKeeper包含一个简单的原语集,提供Java和C的接口。ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在$zookeeper_home\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。
ZooKeeper是以Fast Paxos算法为基础的,Paxos 算法存在活锁的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,而Fast Paxos做了一些优化,通过选举产生一个leader (领导者),只有leader才能提交proposer,具体算法可见Fast Paxos。
ZooKeeper应用场景主要有配置中心、统一命名服务、分布式锁、分布式队列等。
二、安装与配置
1、进入到ZooKeeper官网选择download下载对应的zookeeper版本
2、登录节点主机(node-01,node-02,node-03),上传下载的安装包
3、解压上传的压缩包到指定的目录位置:切换到上传的目录/export/software中,然后使用tar 命令将其解压到具体的位置
4、配置zookeeper的环境变量、zookeeper配置文件
1)修改/etc/profile配置文件中,添加下面的语句,完成后使用source命令刷新配置
export ZK_HOME=/export/servers/zookeeper-3.8.1
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZK_HOME/bin
2)切换到zookeeper的安装目录中,找到conf文件夹,将zoo-sample.cfg 文件重命名为zoo.cfg,并按以下内容修改。
# 指定数据文件目录+数据持久化路径
dataDir=/export/data/zookeeper/zkdata
# 配置zookeeper集群的服务器编号以及对应的主机名,选举端口号和通信端口号
server.1=node-01:2888:3888
server.2=node-02:2888:3888
server.3=node-03:2888:3888
3)创建zkdata文件夹,后在里面创建myid的文件(myid用于设置服务器编号,选举leader的使用)
cd /export/data/ #切换路径
mkdir -p zookeeper/zkdata #直接创建多级目录
#查看当前目录信息
cd zookeeper/zkdata
echo 1>myid #设定服务器编号为1
5、将zookeeper及其配置文件转发复制到其他的节点中
1)将zookeeper安装的目录的文件远程拷贝到其他节点
2)将zkdata(myid服务器编号的存放位置)拷贝到其他两台节点
3)将zookeeper的环境变量配置文件远程拷贝到其他节点
6、对其他两台节点的myid(服务器id值进行配置),分别将其他的两台节点的myid配置为2和3
7、运行测试:启动zookeeper看它能否正常启动和停止
zkServer.sh start #启动
zkServer.sh status # 观察状态
zkServer.sh stop #停止
三、ZooKeeper集群扩容
ZooKeeper的扩容是向现有集群添加更多的服务器,以提高容量和性能,扩容ZooKeeper涉及以下步骤:
1)添加新服务器:在现有集群中添加新的ZooKeeper服务器。新服务器将参与选举、数据同步等过程。
2)配置更新:更新现有服务器的配置,使其知道新服务器的存在,并与其进行通信。
3)数据同步:新服务器需要从现有服务器同步数据。这可能需要一段时间,具体时间取决于数据量的大小。
4)验证集群状态:确保新服务器已经成功加入集群,并且集群的状态正常。
四、ZooKeeper监控
监控ZooKeeper集群对于确保其可用性和性能至关重要,可以通过以下方式监控集群:
1)指标监控:监控集群的关键指标,如吞吐量、延迟、请求处理时间等。可以使用监控系统(例如Prometheus、Grafana)来收集、可视化和报告这些指标。
2)日志监控:定期检查ZooKeeper服务器的日志,以便发现潜在的问题或错误。
3)警报和通知:设置警报,以便在出现问题时及时通知管理员。这可以通过邮件、短信、Slack等方式进行通知。
五、ZooKeeper常见问题处理
1、ZooKeeper服务不稳定,发生异常重启等情况
造成服务不稳定的情况可能有很多,最常见的情况是znode数量过大或者snapshot过大,由于ZooKeeper将所有的znode维护在内存中,并且需要在节点间进行数据同步,因此过大的znode数量或者容量会对服务稳定性造成影响。ZooKeeper的定位是一个分布式协调服务,不能把ZooKeeper当作一个文件系统来使用,通常,znode数量应尽量保持在10万以下,snapshot大小应在800 MB以下。
2、部署zookeeper时,如何解决脑裂问题
如果当leader挂掉后重启,会认为自己还是leader。解决办法是通过EpochId来解决,只接受最大的EpochId的leader的事务。
3、如何解决zookeeper磁盘IO高的问题
1)可以把事务日志输出到内存空间,配置内存空间目录dataLogDir:/dev/shm/
2)ZK提供了自动清理事务日志和快照文件的功能,关闭autopurge.purgeInterval =0
3)可以配置snapCount:默认是100000,调大一点就可以减少触发快照snapshot,就会少生成一定的snapshot.*文件、事务日志文件log.*,减少磁盘IO
4、为什么zookeeper_init设置recv_timeout较长却没有效果
zookeeper_init设置recv_timeout 100000ms,但客户端与服务端断开连接30s就session失效了。解决办法是增加zookeeper_init recv_timeout大小的同时,需要配置tickTime的值。