您的位置:首页 > 其它

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

2017-12-15 10:25 561 查看

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建立连接并完成对数据的同步,从而确定自己对外提供服务的
4000
起始状态。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/zookeeper
scp -r /opt/zookeeper/zookeeper-3.4.8/ 172.168.1.131:/opt/zookeeper


九、分别将myid修改为对应的值2、3,并分别执行 source /etc/profile

ZooKeeper2:依次执行如下命令

touch /var/lib/zookeeper/myid
echo "2" > /var/lib/zookeeper/myid
source /etc/profile


Keeper3:依次执行如下命令


touch /var/lib/zookeeper/myid
echo "3" > /var/lib/zookeeper/myid
source /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_home
export JAVA_HOME=/opt/jdk1.7.0_07
export 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,有兴趣的童鞋可以自己试试。

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: