Zookeeper分布式集群管理系统
Author:xusy
参考教程:
1.zookeeper下载:http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.3.6/
2.安装参照:
Zookeeper是Hadoop的开源子项目,在分布式系统架构中被大量运用,从而减少分布式架构的复杂度。典型应用的场景:数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、master选举、分布式锁、分布式队列。
分布式消息服务kafka、Hbase到Hadoop等分布式大数据处理都会用到zookeeper。Zookeeper是分布式服务框架,主要用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等等。
Zookeeper的核心是广播,这个机制保证了各个server之间的同步。实现这个机制的协议叫做Zab协议。
Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或领导者崩溃后,Zab就进入到了恢复模式,当领导者被选举出来,且大多数server完成了和leader的状态同步后,恢复模式就结束了。
状态同步保证了leader和server具有相同的系统状态。为了保证事物状态的一致性,zookeeper采用了递增的事物id号(zxid)来标示事物。
所有的提议(proposal)都在被提出的时候加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标示leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标示当前属于那个leader的统治时期。低32位用于递增计数。
每个server在工作中都会有三种状态:
1、LOOKING:当前server不知道leader是谁,正在搜寻
2、LEADING:当前server即为选举出来的leader
3、FOLLOWING:leader已经选举出来,当前server与之同步
3.Zookeeper的安装模式
Zookeeper的安装分为三种模式:
A)、单机模式
B)、集群伪分布模式
C)、集群模式
4.开始安装
服务器集群为:192.168.56.100、192.168.56.101、192.168.56.102
建立文件上传及安装目录:mkdir /usr/local/zookeeper
每个服务器都上传zookeeper-3.3.6.tar.gz
执行:tar -zxvf zookeeper-3.3.6.tar.gz
改名:mv zookeeper-3.3.6 zookeeper
调整zoo.cnf文件
进入到cnf目录下,执行:cp zoo-simple.cnf zoo.cnf
打开zoo.cnf文件进行集群配置
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# dataDir=/tmp/zookeeper
dataDir=/home/zookeeper/data
dataLogDir=/home/zookeeper/logs
# the port at which the clients will connect
clientPort=10075
Server.100=192.168.56.100:2888:3888
Server.101=192.168.56.101:2888:3888
Server.102=192.168.56.102:2888:3888
由于dataDir、dataLogDir 对应的目录为 /home/zookeeper/data;/home/zookeeper/logs
需要执行创建对应目录:mkdir -p /home/zookeeper/data;/home/zookeeper/logs
并且在/home/zookeeper/data目录下创建 myid 文件
三台服务器对应myid文件的中的数字分别为:100、101、102
创建myid文件命令:touch myid 或者 vi myid
执行 zkServer.sh start 开始zookeeper服务
执行 zkServer.sh status 查看zookeeper服务器状态,可以查看哪台服务为leader,哪些是follower
在leader服务器中执行:zkCli.sh -server 192.168.56.100:2181,192.168.56.101:2181,192.168.56.102:2181
来连接zookeeper集群
连接成功后可以看到这样的日志输出:
从日志可以看出,客户端连接的是 102(leader) 服务器(连接上哪台服务器的zookeeper进程是随机的)、客户端已经成功连接上了zookeeper集群
试验:当杀死leader服务器进程后,zookeeper自动进入了恢复模式,选择了 101 服务器作为了leader
问题待解决:启动zookeeper服务,没法生成zookeeper_server.pid文件
服务能够正常启动,但是没法创建zookeeper_server.pid 文件
网上各种方案尝试了,但是还是不行,希望后面能够找出好的解决方案。
后来经过各种检查,终于发现了问题,那就是 zoo.cfg 不能出现空行,包括# 注释的行也不行,这也太不智能了,无奈只能讲所有的注释删掉。具体如下:
执行以上操作,我们完成了zookeeper的安装配置,即能够正常使用了
============================================================================================
参照:http://nileader.blog.51cto.com/1381108/932156
在使用zookeeper过程中,我们知道,会有dataDir 和 dataLogDir 两个目录,分别用于snapshot和事务日志的输出。
正常运动过程中,ZK会不断的把快照数据及事物日志输出到这两个目录,并且如果没有认为操作的话,ZK自己是不会清理这些文件的,所以需要进行定时清理。我这边通过手写shell脚本来定时操作执行。
删除日志脚本,每天23:59分定时执行:
#!/bin/bash
#napshot file dir
dataDir=/home/zookeeper/data/version-2
#tran log dir
dataLogDir=/home/zookeeper/logs/version-2
#Leave 10 files
count=10
count=$[$count+1]
ls -t $dataLogDir/log.* | tail -n +$count | xargs rm -f
ls -t $dataDir/snapshot.* | tail -n +$count | xargs rm -f
以上这个脚本定义了删除对应两个目录中的文件,保留最新的10个文件,可以将他写到crontab中,设置为每天23:59执行一次就可以了。
然后进入到该脚本文件目录 chmod +x zookeeperclean.sh 添加执行权限,否则会报错 Permission denied
开始设置定时
crontab -e
添加:59 23 * * * /home/zookeeper/zookeeperclean.sh
执行每天 23:59分准时执行