原文地址:ZooKeeper学习笔记一:集群搭建
说明单机版的zk安装和运行参考:https://zookeeper.apache.org/doc/r3.7.0/zookeeperStarted.html
单机版的zk只适合用于测试或者开发环境,不适合用于生产环境。
本文主要介绍zk的集群搭建。
环境CentOS 7
ZooKeeper 3.7.0
准备工作第一步,准备四个Linux实例,zk01-zk04,我的四个实例的ip分别是:
zk01:192.168.150.128
zk02:192.168.150.130
zk03:192.168.150.131
zk04:192.168.150.132
第二步,在四个实例中都安装好jdk1.8。
安装与配置我们只需要在一台实例上安装并配置好zk,然后把安装文件和配置文件scp到其他实例即可
在zk01中,下载并解压zk安装包:
cd /usr/local ## 如果下载失败,请手动下载并上传到/usr/local目录上 wget https://dlcdn.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz ## 解压 tar -xf apache-zookeeper-3.7.0-bin.tar.gz ## 重命名 mv apache-zookeeper-3.7.0-bin zookeeper加入环境变量
vi /etc/profile在末尾加入:
export ZOOKEEPER_HOME=http://www.likecs.com/usr/local/zookeeper export PATH=$PATH:$ZOOKEEPER_HOME/bin执行
source /etc/profile修改zk配置文件:
# 把默认的zoo_sample.cfg拷贝一份zoo.cfg出来 cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg修改zoo.cfg配置文件中的如下配置
dataDir=http://www.likecs.com/data/zookeeper增加如下配置到zoo.cfg中
server.1=192.168.150.128:2888:3888 server.2=192.168.150.130:2888:3888 server.3=192.168.150.131:2888:3888 server.4=192.168.150.132:2888:3888创建zk01的dataDir目录
mkdir -p /data/zookeeper在dataDir目录下创建一个myid文件,并写入1
echo 1 > /data/zookeeper/myid至此,zk01实例已经完全配置好了,现在将zk01实例上的一些安装文件和配置文件拷贝到zk02-zk04上,
拷贝zk01上的profile文件到zk02-zk04三个节点
## 拷贝到zk02,过程中会让你输入yes,以及zk02的密码 scp /etc/profile 192.168.150.130:/etc ## 拷贝到zk03 scp /etc/profile 192.168.150.131:/etc ## 拷贝到zk04 scp /etc/profile 192.168.150.132:/etc拷贝zk01的dataDir目录到zk02-zk04三个节点,在zk01上执行:
scp -r /data/ 192.168.150.130:/ scp -r /data/ 192.168.150.131:/ scp -r /data/ 192.168.150.132:/拷贝zk01的zookeeper程序到zk02-zk04三个节点, 在zk01上执行:
scp -r /usr/local/zookeeper 192.168.150.130:/usr/local/ scp -r /usr/local/zookeeper 192.168.150.131:/usr/local/ scp -r /usr/local/zookeeper 192.168.150.132:/usr/local/至此,zk02-zk04都准备好了相关文件,现在连接zk02-zk04,在zk02-zk04上分别执行如下操作
source /etc/profile将zk02,zk03,zk04的myid文件,修改成对应的值
vi /data/zookeeper/myidzk02的/data/zookeeper/myid修改成2
zk03的/data/zookeeper/myid修改成3
zk04的/data/zookeeper/myid修改成4
在zk01-zk04上分别执行:
zkServer.sh start-foreground 查看leader和follower [root@zk01 ~]# zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Client SSL: false. Mode: follower说明此节点是follower节点
[root@zk03 ~]# zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Client SSL: false. Mode: leader在任意节点通过zk客户端连接
zkCli.sh -server 127.0.0.1:2181执行:
create /abc set /abc "hello world"其他节点都可以查看到
[zk: localhost:2181(CONNECTED) 0] get /abc hello world ZAB协议Zookeeper 的核心是原子广播机制,这个机制保证了各个 server 之间的同步。实现这个机制的协议叫做 Zab 协议。Zab 协议有两种模式,它们分别是恢复模式和广播模式。
恢复模式
当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数 server 完成了和 leader 的状态同步以后,恢复模式就结束了。状态同步保证了 leader 和 server 具有相同的系统状态。
广播模式
一旦 leader 已经和多数的 follower 进行了状态同步后,它就可以开始广播消息了,即进入广播状态。这时候当一个 server 加入 ZooKeeper 服务中,它会在恢复模式下启动,发现 leader,并和 leader 进行状态同步。待到同步结束,它也参与消息广播。ZooKeeper 服务一直维持在 Broadcast 状态,直到 leader 崩溃了或者 leader 失去了大部分的 followers 支持。