1,安装
wget tar zxvf zookeeper-3.4.9.tar.gz cd zookeeper-3.4.9/conf cp zoo_sample.cfg zoo.cfg
修改zoo.cfg配置文件
如下
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/opt/zookeeper/zookeeper-3.4.9/data dataLogDir=/opt/zookeeper/zookeeper-3.4.9/logs clientPort=2181 autopurge.snapRetainCount=3 autopurge.purgeInterval=1 server.1=zk1:2888:3888:observer server.2=zk2:2888:3888 server.3=zk3:2888:3888 server.4=zk4:2888:3888
编辑环境变量vim /etc/profile
export ZOOKEEPER_HOME=/opt/zookeeper/zookeeper-3.4.9/ export PATH=$ZOOKEEPER_HOME/bin:$PATH export PATH
添加myid 文件
在dataDir目录下,添加myid,文件内容要与配置文件中server.1的数字一样,仅仅是数字
安装java8
yum install java1.8
启动zookeeper,并查看状态
zkServer.sh start zkServer.sh status
2,集群配置注意事项
一般来讲,3到5个zookeeper投票者(leader,follower),必须是单数,因为数量过半才能保证正常运行,公式N=2F+1 其中F是可以容错的数量
配置observer(观察者)(跟follower没什么区别,只是不参与投票),为了减少选举过程中和资源,一般客户端都是连接observer,
配置如下:
要指定相关的机器是observer,并且在集群配置里注明
peerType=observer server.1=zk1:2888:3888:observer
3,内存
zk在读写数据的时候,不要用swap交换分区,因为zookeeper都是把数据放在内存中,如果发生和磁盘交换的话,性能会大打折扣,修改启动脚本,配置jvm,配置原则物理内存的80%
vim zkServer.sh
case $1 in
start)
echo -n "Starting zookeeper ... "
if [ -f "$ZOOPIDFILE" ]; then
if kill -0 `cat "$ZOOPIDFILE"` > /dev/null 2>&1; then
echo $command already running as process `cat "$ZOOPIDFILE"`.
exit 0
fi
fi
nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
-cp "$CLASSPATH" $JVMFLAGS -Xmx512m -Xms512m $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &
4,磁盘
zk 对磁盘要求比较高,因为会做磁盘镜像备份snapshot到磁盘,第一要用高速磁盘,第二要定期处理,虽然配置里有自动清理,但是会遇到zk使用高峰,建议自己写crontab来定期清理
autopurge.snapRetainCount=3#保留最新的3个镜像数据 autopurge.purgeInterval=1#每隔1小时清理一次
5,最后说下投票机制
当有节点宕机了,所有服务都将进入选举模式,先断掉连接,然后开始选举,过程是server1挂了,server2 server3进入选举,每个server都会先投自己,选票结构(id,zxid),那么server2(2,0),server3(3,0),然后再把自己的选票发给所有的server,当每个server收到别人发来的选票会进行对比,对比顺序是先从zxid 开始(zxid是代表了数据的新旧,比如3>2,那么3就是最新的),如果zxid相同,在对比id,这是server2收到来自server3的选票(3,0),zxid相同,但是id比自己大,这是server2会更新自己的选票server2(3,0),再发给所有的server,进入下一轮选举,这是server3(3,0),没变化,所以不用更新,server2(3,0),那么这时server3变成leader,如果参与投票的机器比较多,那么就按照这个机制进行多轮投票
运维经验,这里有个问题,如果在zk宕机选举过程中,clint不断的尝试重新,会导致zk进入死循环,因为选举的第一步就是先断掉所有连接,所以,客户端要用调用的方式,而不是无限的重新连接