Linxu环境下ZooKeeper的集群搭建之详细教程

来源:互联网 发布:艾默生ups监控软件 编辑:程序博客网 时间:2024/06/05 17:26

Linxu环境下ZooKeeper的集群搭建之详细教程

前言:由于项目中用到了ZooKeeper,于是抓紧时间了解下ZooKeeper
Zookeeper是一个开放源代码的分布式协调服务,由知名互联网公司雅虎创建。它是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现注入数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。目前已有许多大型分布式项目比如:Hadhop、HBase、Storm、Solr、当然还有我们应该很熟悉的dubbo都将ZooKeeper作为核心组件。到这里你是不是也心动了呢,让我们一起来搭建一个简单的ZooKeeper集群吧!
我这里用三台服务器搭建(由于ZooKeeper master选举遵循过半协议,所以建议集群搭建最少三台服务器),首先肯定需要ZooKeeperjar包
zookeeper-3.4.8.tar.gz:<链接:https://pan.baidu.com/s/1hrA4xzY 密码:qka7>

一、将下载的jar包解,我这里是放到 /opt/zookeeper/,然后解压 命令:tar -zxvf zookeeper-3.4.8.tar.gz

这里写图片描述

二、进入到 /opt/zookeeper/zookeeper-3.4.8/conf 目录中 命令:cd zookeeper-3.4.8/conf/
三、复制 zoo_sample.cfg 文件的并命名为为 zoo.cfg 命令:cp zoo_sample.cfg zoo.cfg
四、打开 zoo.cfg 文件并修改其内容 命令:vim zoo.cfg

这里写图片描述

其中参数
ticktime:用于配置ZooKeeper中最小时间单元的长度,很多运行时的时间间隔都是使用tickTime的倍数来表示的。例如,ZooKeeper中会话的最小超时间时间默认是2*tickTime。
clientPort:改参数无默认值,必须配置,不支持系统属性方式配置。用于配置当前服务器对外的服务端口,客户端会通过该端口和ZooKeeper服务器创建连接一般设置为2181。注意每台ZooKeeper服务器都可以配置任意可用的端口无需非得与clientPort端口保持一致。
dataDir:改参数无默认值,必须配置,不支持系统属性方式配置。用于配置ZooKeeper服务器存储快照文件的目录。
dataLogDir:配置ZooKeeper事务日志的存储目录。
initLimit:默认值为10,表示是参数tickTime值的10倍,必须配置且必须是正数。改参数用于配置Leader服务器等待Follower启动,并完成数据同步的时间。Follower服务器在启动过程中,会与Leader建立连接并完成对数据的同步,从而确定自己对外提供服务的起始状态。Leader服务器允许Foller在initLimit时间内完成这个工作。
syncLimit:默认值为5,表示tickTime值的5倍,必须配置,且是正数。改参数用于配置Leader服务器和Follower之间进行心跳检测的最大延时时间,。在ZooKeeper集群运行过程中,Leader服务器会与所有的Follower进行心跳检测来确定该服务器是否存活。如果Leader服务器在syncLimit时间内无法获取到Follower的心跳检测响应,那么Leader就会认为该Follower已经脱离了和自己的同步。
server.id=host:port:port 其中id被称为ServerId用来标识该机器在集群中的机器序号。

五、修改完后,保存退出。

(ps:有些对不了解的Linxu的童鞋在vim进入后不知道该如何入手,vim进入后按i键进入编辑状态,修改完后按Ecs退出编辑状态,然后ctr+:输入wq保存退出)

六、由于我上面dataDir配置的是/var/lib/zookeeper/ 因此新建目录,

命令:mkdir /var/lib/zookeeper
新建文件myid 命令:touch /var/lib/zookeeper/myid
并写入值 1 命令:echo “1” > /var/lib/zookeeper/myid
注意:此处的值1与上面配置的server.id=host:port:port 中的id需要对应,比如此服务器配置的server.1那么myid文件中值就是1。
这里写图片描述

七、配置环境

1、进入到bin目录 命令:cd /opt/zookeeper/zookeeper-3.4.8/bin/
2、vim /etc/profile 在其顶部添加如下内容

export ZOOKEEPER_HOME=/opt/zookeeper/zookeeper-3.4.8/export PATH=$ZOOKEEPER_HOME/bin:$PATH

这里写图片描述
然后执行:source /etc/profile

八、将设置好的zooKeeper拷贝到其他两台服务器ZooKeeper2和ZooKeeper3
scp -r /opt/zookeeper/zookeeper-3.4.8/ 172.168.1.130:/opt/zookeeperscp -r /opt/zookeeper/zookeeper-3.4.8/ 172.168.1.131:/opt/zookeeper
九、分别将myid修改为对应的值2、3,并分别执行 source /etc/profile

ZooKeeper2:依次执行如下命令

touch /var/lib/zookeeper/myidecho "2" > /var/lib/zookeeper/myidsource /etc/profile
Keeper3:依次执行如下命令
touch /var/lib/zookeeper/myidecho "3" > /var/lib/zookeeper/myidsource /etc/profile
十、依次启动集群中的服务

进入到bin目录,启动

cd /opt/zookeeper/zookeeper-3.4.8/bin/zkServer.sh start

这里写图片描述
看到如上状态,就说明启动成了

十一、检查服务状态
zkServer.sh status

这里写图片描述
意外发生了,我们发现了,Error contacting server. It is probably not running. 百度了下发现有不少朋友也报了同样的错误,但许多错误的原因却不尽相同,为此也走了不少弯路。其实发生这样的错误只需要重要的一步,那就是查看日志,找到zookeeper.out,注意路径

cd /opt/zookeeper/zookeeper-3.4.8/conf/cat zookeeper.out

这里写图片描述
当我们发现这个错误后,只需要在zkServer.sh里添加JDK环境配置就OK了
找到zkServer.sh并添加配置(我这里是jdk1.7.0_07,安装在opt目录下)

vim /opt/zookeeper/zookeeper-3.4.8/opt/zkServer.sh#java_homeexport JAVA_HOME=/opt/jdk1.7.0_07export PATH=$JAVA_HOME/bin:$PATH

这里写图片描述
在三台服务器zkServer.sh里面添加如上配置后,再重新启动,查看状态发现问题解决
这里写图片描述

这里写图片描述

这里写图片描述

后记:
1、对于发生Error contacting server. It is probably not running这样的异常,原因有很多,有的是端口占用,有的是配置问题等等,所以对于这样的问题第一步就是看zookeeper.out日志对症下药。
2、重启服务命令 zkServer.sh reStart 停止服务命令 zkServer.sh stop
3、如果省略步骤7,集群也是可以正常启动使用的,只是启动时必须添加sh 即sh zkServer.sh start
4、由于zookeeper master选举从3.4.0版本开始只保留一种选举算法FastLeaderElection,根据投票信息(myid,zxid). myid(服务器id即server.id中的id) zxid服务器的事务id。优先会根据zxid的大小来决定leader.如果zxid相同,再根据myid的大小进行比对。由于刚开始搭建的集群还没有进行事务性操作,所以你会发现服务启动的顺序不同会导致Leader的不同,例如启动1、2、3,那么2服务器会成为Leader,启动3、2、1,那么3服务器会成为Leader,有兴趣的童鞋可以自己试试。

第一次写博客如有问题,望各位兄台不吝指出,定当感激不尽!

原创粉丝点击