作者:Grey
原文地址: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=/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=/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/myid
zk02的/data/zookeeper/myid修改成2
zk03的/data/zookeeper/myid修改成3
zk04的/data/zookeeper/myid修改成4
配置防火墙
firewall-cmd --zone=public --add-port=3888/tcp --permanent
firewall-cmd --zone=public --add-port=2888/tcp --permanent
firewall-cmd --zone=public --add-port=2181/tcp --permanent
firewall-cmd --reload
启动
在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 支持。
client 端会对某个 znode 建立一个 watcher 事件,当该 znode 发生变化时,这些 client 会收到 zk 的通知,然后 client 可以根据 znode 变化来做出业务上的改变等。
单数服务器只要没超过一半的服务器宕机就可以继续使用, 集群规则为 2N+1 台,N >0,即最少需要 3 台。
关于四种类型的数据节点(Znode)
PERSISTENT:持久节点,除非手动删除,否则节点一直存在于 Zookeeper 上。
EPHEMERAL:临时节点,临时节点的生命周期与客户端会话绑定,一旦客户端会话失效(客户端与 Zookeeper连接断开不一定会话失效),那么这个客户端创建的所有临时节点都会被移除。
PERSISTENT_SEQUENTIAL:持久顺序节点,基本特性同持久节点,只是增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。
EPHEMERAL_SEQUENTIAL:临时顺序节点,基本特性同临时节点,增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。