概念:
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。Zookeeper是一个基础组件。(百度百科)
原理:
ZooKeeper是以Fast Paxos算法为基础的,Paxos 算法存在活锁的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,而Fast Paxos作了一些优化,通过选举产生一个leader (领导者),只有leader才能提交proposer,具体算法可见Fast Paxos。
运行机制:
Zookeeper常用场景:
- zookeeper可以为客户端管理少量数据,为kv键值对方式、k为类似目录形式如/aa,/aa/bb等。
- 可以为客户端监听指定节点的数据节点状态,并在节点发生变化时,通知客户端。
上图的应用场景是服务器上下线动态感知
上图的应用场景是配置文件的同步管理
Zookeeper集群的安装部署:
集群一般安装奇数个节点。
Leader选举机制:投票。票多的为leader。
步骤:
-
选3台Linux服务器做为节点,将zookeeper的安装包上传到节点1上。
-
解压安装包到/root/apps下(目录可以指定其他目录)
[root@slave1 ~]# tar -zxvf zookeeper-3.4.6.tar.gz -C apps/
解压后的目录结构如下:
-
在conf目录下,复制一份配置文件,修改文件名为zoo.cfg做为正式配置文件。
[root@slave1 conf]# cp zoo_sample.cfg zoo.cfg
-
编辑配置文件
vim zoo.cfg
,编辑内容如下:
修改dataDir为/root/zkdata(可以自己指定)
末尾添加:
server.1=slave1:2888:3888
server.1=slave2:2888:3888
server.1=slave3:2888:3888
保存配置文件
-
使用scp命令,将修改完配置文件的zookeeper传输到其余节点,在/root/apps目录下:
[root@slave1 apps]# scp -r zookeeper-3.4.6/ slave2:$PWD [root@slave1 apps]# scp -r zookeeper-3.4.6/ slave3:$PWD
-
在3台节点上,新建zkdata数据目录:
mkdir /root/zkdata
-
对3台节点,在工作目录中生成myid文件,但内容要分别为各自的id: 1,2,3
Slave1上:echo 1 > /root/zkdata/myid
Slave2上:echo 2 > /root/zkdata/myid
Slave3上:echo 3 > /root/zkdata/myid
-
启动zookeeper集群,在每个节点的bin目录下:
[root@slave1 bin]# ./zkServer.sh start JMX enabled by default Using config: /root/apps/zookeeper-3.4.6/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@slave1 bin]#
通过jps命令。可以看到zookeeper已经启动了。
如果此时只启动一台,比如只在slave1上启动,查看状态:zkServer.sh status
[root@slave1 bin]# ./zkServer.sh status JMX enabled by default Using config: /root/apps/zookeeper-3.4.6/bin/../conf/zoo.cfg Error contacting service. It is probably not running. [root@slave1 bin]#
显示连接服务器错误,因为此时只有一个节点(slave1)启动,没有选出leader,接着启动slave2节点的zk,再使用 zkServer.sh status查看状态,在节点2上:
[root@slave2 bin]# ./zkServer.sh status JMX enabled by default Using config: /root/apps/zookeeper-3.4.6/bin/../conf/zoo.cfg Mode: leader [root@slave2 bin]#
在查看节点1:
[root@slave1 bin]# ./zkServer.sh status
JMX enabled by default
Using config: /root/apps/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
[root@slave1 bin]#
可以看到,节点2为learder,节点1为follower,同样的,启动节点3的zk,节点3的角色也是follower。
如果将leader kill掉,那么集群依然存在,此时,节点3的状态为leader。如果再将节点2启动,那么节点2的角色将是follower。这是zk的投票机选举的结果。
自动化启动脚本:
新建一个文件 zkmanage.sh :vim zkmanage.sh
内容如下:
#!/bin/bash
for host in slave1 slave2 slave3
do
echo "${host}:${1}ing..."
ssh $host "source /etc/profile;/root/apps/zookeeper-3.4.6/bin/zkServer.sh $1"
echo "----------"
done
sleep 2
for host in slave1 slave2 slave3
do
echo "${host}:status"
ssh $host "source /etc/profile;/root/apps/zookeeper-3.4.6/bin/zkServer.sh status"
echo "----------"
done
修改成可执行文件:chmod +x zkmanage.sh
启动:./zkmanage.sh start
输出如下:
[root@slave1 ~]# ./zkmanage.sh start
slave1:starting...
JMX enabled by default
Using config: /root/apps/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
----------
slave2:starting...
JMX enabled by default
Using config: /root/apps/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
----------
slave3:starting...
JMX enabled by default
Using config: /root/apps/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
----------
slave1:status
JMX enabled by default
Using config: /root/apps/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
----------
slave2:status
JMX enabled by default
Using config: /root/apps/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
----------
slave3:status
JMX enabled by default
Using config: /root/apps/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
----------