ZooKeeper是一个开源的分布式应用程序协调服务,是Google的Chubby一个开源的实现。ZooKeeper为分布式应用提供一致性服务,提供的功能包括:分布式同步(Distributed Synchronization)、命名服务(Naming Service)、集群维护(Group Maintenance)、分布式锁(Distributed Lock)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。
ZooKeeper本身可以以单机模式安装运行,不过它的长处在于通过分布式ZooKeeper集群(一个Leader,多个Follower),基于一定的策略来保证ZooKeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。
ZooKeeper主要有领导者(Leader)、跟随者(Follower)和观察者(Observer)三种角色。
角色 | 说明 |
---|---|
领导者 (Leader) | 为客户端提供读和写的服务,负责投票的发起和决议,更新系统状态。 |
跟随者(Follower) | 为客户端提供读服务,如果是写请求则转发给Leader。在选举过程中参与投票 |
观察者(Observer) | 为客户端提供读服务,如果是写请求则转发给Leader。不参与选举过程中的投票,也不参与“过半写成功”策略。在不影响写性能的情况下提升集群的读性能。此角色与zookeeper3.3系列新增的角色。 |
ZooKeeper在提供分布式锁等服务的时候需要过半数的节点可用。另外高可用的诉求来说节点的个数必须>1,所以ZooKeeper集群需要是>1的奇数节点。例如3、5、7等等。
本次我们规划三个节点,操作系统选用CentOS 7。
节点名 | IP | 说明 |
---|---|---|
zookeeper01 | 172.17.132.13 | zookeeper节点 |
zookeeper02 | 172.17.132.34 | zookeeper节点 |
zookeeper01 | 172.17.132.243 | zookeeper节点 |
项 | 说明 |
---|---|
Linux Server | Centos 7.6 |
JDK | 1.8.0_321 |
Zookeeper | zookeeper-3.4.14 |
本次一共要部署3个zookeeper节点,所有文中没有指定机器的操作都表示每个节点都要执行该操作。
下载zookeeper并解压,创建所需目录
cd /opt
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar -zvxf zookeeper-3.4.14.tar.gz
cd zookeeper-3.4.14
mkdir data
mkdir logs
关闭防火墙
systemctl stop firewalld
所有节点均需要安装JDK8。
wget https://download.oracle.com/otn/java/jdk/8u321-b07/df5ad55fdd604472a86a45a217032c7d/jdk-8u321-linux-x64.tar.gz
tar -zxvf jdk-8u321-linux-x64.tar -C /usr/local/jdk1.8
配置jdk环境变量
vim /etc/profile
增加以下内容
export JAVA_HOME=/usr/local/jdk1.8
export PATH=JAVA_HOME/bin:PATH
export CLASSPATH=.:JAVA_HOME/lib:JAVA_HOME/jre/lib:$CLASSPATH
验证配置结果
source /etc/profile
java -version
vim /opt/zookeeper-3.4.14/conf/zoo.cfg
修改完成后的样子
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper-3.4.14/data
dataLogDir=/opt/zookeeper-3.4.14/logs
clientPort=2181
server.1=172.17.132.13:2888:3888
server.2=172.17.132.34:2888:3888
server.3=172.17.132.243:2888:3888
zookeeper 的三个端口作用:
2181 : 对 client 端提供服务
2888 : 集群内机器通信使用
3888 : 选举 leader 使用
分别在三台机器的data目录中创建myid文件,内容为阿拉伯数字 1(如果是server.2则为2,与server对应)
zk01:172.17.132.13
echo "1" > /opt/zookeeper-3.4.14/data/myid
zk02:172.17.132.34
echo "2" > /opt/zookeeper-3.4.14/data/myid
zk03:172.17.132.243
echo "3" > /opt/zookeeper-3.4.14/data/myid
sh /opt/zookeeper-3.4.14/bin/zkServer.sh start
必须所有节点都启动以后,然后等一段时间,让三个节点互相通讯,然后才能进行状态查看
否则你会看到如下内容
sh /opt/zookeeper-3.4.14/bin/zkServer.sh status
如果为领导者节点则Mode:leader
这里随机选其中一个节点作为客户端连接其他节点即可
sh /opt/zookeeper-3.4.14/bin/zkCli.sh -server 172.17.132.34:2181
查看ZooKeeper根
[zk: 172.17.132.34:2181(CONNECTED) 2] ls /
[zookeeper]
退出zookeeper链接
[zk: 172.17.132.34:2181(CONNECTED) 2] quit
你在哪个目录执行的启动命令,该目录下的zookeeper.out即为其日志文件
zookeeper常用配置项说明
tickTime:CS通信心跳数;以毫秒为单位,可以使用默认配置。
initLimit:LF初始通信时限;
syncLimit:LF同步通信时限;数值不宜过高。
dataDir:数据文件目录;
dataLogDir:日志文件目录;
clientPort:客户端连接端口;
server.N:服务器名称与地址(服务编号,服务地址,LF通信端口,选举端口)
ZooKeeper高级配置
gloabalOutstandingLimit:最大请求堆积属,默认1000;
preAllocSize:预分配的Transaction log空间大小;
snapCount:每进行snapCount次事务日志输出后,触发一次快照;
maxClientCnxns:最大并发客户端数;
forceSync:是否提交事务的同时同步到磁盘;
leaderServes:是否禁止leader读功能;
traceFile:是否记录所有请求的log;<mark>不建议使用mark>