文章目录
- ZooKeeper
- zk的由来
- zk解决了什么问题
- ZK工作原理
- ZK数据模型
- zk功能
- 1.命名服务
- 2.状态同步
- 3.配置中心
- 4.集群管理
- zk部署
- 单机
- 启动zk
- 验证zk
- zk集群
- 集群角色
- 选举过程
- 1.节点角色状态
- 2.选举ID
- 3.具体过程
- 4.心跳机制
- 5.ZAB协议
- ZooKeeper 选举示例
- 1.第一轮投票:
- 2.节点收到其他投票并更新提议:
- 3.节点 5 被选为 Leader:
- 4.其余节点成为 Follower:
- 集群部署
ZooKeeper
官方网站:https://zookeeper.apache.org/
官方文档:https://zookeeper.apache.org/doc/
zk的由来
ZooKeeper 是由 雅虎(Yahoo!)开发的,用来解决分布式系统中协调和管理的问题。它最早是雅虎为了支持其大规模分布式应用而开发的协调服务。
在分布式系统中,多个节点需要相互协调和通信以保持一致性,而直接实现这些协调任务是非常复杂和容易出错的。雅虎在开发其分布式应用时,发现每次要构建高效且可靠的分布式协调机制都非常困难,特别是在面对节点故障、网络分区等复杂的分布式问题时。因此,雅虎开发了 ZooKeeper 作为一个通用的协调服务,来为分布式系统中的任务提供高效、可靠的协调功能。
zk解决了什么问题
在分布式系统中,有许多常见的协调问题需要解决。ZooKeeper 的设计目标是通过提供一个简单的、高可用的、可扩展的分布式协调服务来解决这些问题。
1.分布式协调的复杂性
在分布式系统中,节点彼此独立运行,它们之间可能存在网络延迟、节点故障或网络分区等问题。要让这些节点协调一致地工作,尤其是保证数据一致性和协调复杂的工作流(如任务调度、分布式锁等),非常困难。ZooKeeper 提供了一套简单的 API,使开发人员无需关心分布式协调的底层复杂性,只需通过 ZooKeeper 的数据模型和 Watch 机制,就可以轻松实现协调功能。
2.一致性问题
分布式系统的一个关键问题是 一致性。当多个节点对同一个共享资源进行操作时,如何确保数据的一致性?例如,多个客户端可能同时读取和写入某个共享的数据,而如果没有有效的协调机制,可能会导致数据不一致。
ZooKeeper 通过其 原子性和顺序一致性 的特性,确保所有节点能够以相同的顺序看到相同的数据变化。它使用 Paxos 类的协议确保每个写操作都在大多数节点上达成共识,从而实现分布式数据的一致性。
3.分布式锁
在分布式系统中,多个客户端可能需要同时访问和修改共享资源,如何避免资源竞争并确保只有一个客户端能同时访问共享资源是一个挑战。ZooKeeper 通过 临时节点 和 有序节点 的机制,简化了分布式锁的实现,使得开发者可以很方便地实现分布式锁和领导者选举。
临时节点:
当客户端创建临时节点时,ZooKeeper 保证在客户端会话断开后自动删除节点。这有助于管理分布式系统中的锁和其他资源。
有序节点:
ZooKeeper 允许创建带有序号的节点,从而可以方便地实现如分布式队列、任务调度等应用场景。
4. Leader 选举
在分布式系统中,有时需要选出一个节点作为 Leader 来协调其他节点的工作,比如处理写请求或分配任务。ZooKeeper 提供了 Leader 选举机制,通过其一致性协议可以快速选出一个 Leader,并确保其他节点知道谁是当前的 Leader。
这一功能广泛应用于集群管理,例如 Hadoop、Kafka 等系统都使用 ZooKeeper 进行 Leader 选举。
5.分布式配置管理
分布式系统通常会有多个节点,这些节点可能需要共享某些配置信息。如果手动管理这些配置信息并在节点之间同步非常麻烦,ZooKeeper 提供了分布式配置管理的功能。
开发者可以将配置存储在 ZooKeeper 中,ZooKeeper 保证这些配置能实时同步到所有的客户端节点。通过 Watch 机制,客户端还能监听配置的变化,当配置更新时,ZooKeeper 会通知所有客户端进行调整。
6.分布式服务注册与发现
在分布式系统中,服务的节点数量通常是动态变化的,某些服务可能会随时加入或离开集群。为了实现 服务注册与发现,ZooKeeper 提供了一个集中的注册服务,服务节点可以将自己的信息注册到 ZooKeeper 中,客户端则可以从 ZooKeeper 上发现并获取这些服务节点的信息。
这为负载均衡、容错等机制提供了基础支持。例如,ZooKeeper 被广泛应用于 Apache Kafka、Dubbo、Hadoop 等框架中作为服务注册与发现的基础组件。
7.故障恢复与高可用性
在分布式系统中,节点故障是不可避免的。如果系统中没有合适的协调机制,故障会导致系统整体不可用。ZooKeeper 通过 复制机制 和 多数决原则,确保即使部分节点故障,集群也能正常运行。
复制机制:ZooKeeper 中的所有数据都被复制到集群中的多个节点上,这样即使某些节点发生故障,其他节点依然可以提供服务。
多数决原则:只要有超过半数的 ZooKeeper 节点正常工作,整个系统就能继续运行。这种机制保证了 ZooKeeper 集群的高可用性。
ZK工作原理
ZK数据模型
在zookeeper 中,节点分为两类
第一类是指构成zookeeper集群的主机,称之为主机节点
第二类则是指内存中zookeeper数据模型中的数据单元,用来存储各种数据内容,称之为数据节点ZNode.
zookeeper内部维护了一个层次关系(树状结构)的数据模型,它的表现形式类似于Linux的文件系统,甚至操作的种类都一致。
Zookeeper
数据模型中有自己的根目录(/),根目录下有多个子目录,
每个子目录后面有若干个文件,由斜杠(/)进行分割的路径,就是一个ZNode,
每个ZNode上都会保存自己的数据内容和一系列属性信息.
zk功能
1.命名服务
命名服务是分布式系统中比较常见的一类场景。命名服务是分布式系统最基本的公共服务之一。在分布式系统中,被命名的实体通常可以是集群中的机器、提供的服务地址或远程对象等—―这些我们都可以统称它们为名字(Name),其中较为常见的就是一些分布式服务框架(如RPC、RMI)中的服务地址列表,通过使用命名服务,客户端应用能够根据指定名字来获取资源的实体、服务地址和提供者的信息等。
2.状态同步
每个节点除了存储数据内容和node节点状态信息之外,还存储了已经注册的APP的状态信息,当有些节点或APP不可用,就将当前状态同步给其他服务。
3.配置中心
现在我们大多数应用都是采用的是分布式开发的应用,搭建到不同的服务器上,我们的配置文件,同一个应用程序的配置文件一样,还有就是多个程序存在相同的配置,当我们配置文件中有个配置属性需要改变,需要改变每个程序的配置属性,这样会很麻烦的去修改配置,那么可用使用ZooKeeper来实现配置中心。
ZooKeeper 采用的是推拉相结合的方式:客户端向服务端注册自己需要关注的节点,一旦该节点的数据发生变更,那么服务端就会向相应的客户端发送Watcher事件通知,客户端接收到这个消息通知后,需要主动到服务端获取最新的数据。
Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,此应用比较流行。
4.集群管理
所谓集群管理,包括集群监控与集群控制两大块,前者侧重对集群运行时状态的收集,后者则是对集群进行操作与控制,在日常开发和运维过程中,我们经常会有类似于如下的需求:
1.希望知道当前集群中究竟有多少机器在工作。
2.对集群中每台机器的运行时状态进行数据收集。对集群中机器进行上下线操作。
ZooKeeper 具有以下两大特性:
1.客户端如果对ZooKeeper的一个数据节点注册Wwatcher监听,那么当该数据节点的内容或是其子节点列表发生变更时,
Zookeeper服务器就会向已注册订阅的客户端发送变更通知。
2.对在ZooKeeper上创建的临时节点,一旦客户端与服务器之间的会话失效,那么该临时节点也就被自动清除。
Watcher(事件监听器)是Zookeeper中的一个很重要的特性。Zookeeper 允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,ZooKeeper服务端会将事件通知到感兴趣的客户端上去,该机制是Zookeeper实现分布式协调服务的重要特性。
zk部署
单机
官方文档:https://zookeeper.apache.org/doc/r3.6.2/zookeeperStarted.html#sc_InstallingSingleMode
1.配置Java环境
官方依赖介绍:https://zookeeper.apache.org/doc/r3.8.0/zookeeperAdmin.html#sc_systemReq
2.包安装
[root@ubuntu2204 ~]#apt list zookeeper
正在列表...完成
zookeeper/jammy 3.4.13-6ubuntu4 all
[root@ubuntu2204 ~]#apt -y insta11 zookeeper
[root@ubuntu2204 ~]#grep -Ev "#|^$” /etc/zookeeper/conf/zoo.cfg
tickTime=2000 服务器与服务器之间的单次心跳检测时间间隔,单位为毫秒
initLimit=10 集群中leader服务器与fo1lower服务器初始连接心跳次数,即多少个2000毫秒
syncLimit=5 leader与fo11ower之间检测发送和应答的心跳次数,
如果该fo11ower在时间段5*200不能与leader进行通信,此follower将不可用
dataDir=/var/lib/zookeeper 自定义的zookeeper保存数据的目录
c1ientPort=2181 客户端连接zookeeper服务器的端口,zookeeper会监听这个端口,接受客户端的访问请求
[root@ubuntu2204 ~]#1s /usr/share/zookeeper/bin/
zkcleanup.sh zkc1i.sh zkEnv.sh zkserver.sh
[root@ubuntu2204 ~]#/usr/share/zookeeper/bin/zkServer.sh start
ZooKeeper JMx enab1ed by default
using config: /etc/zookeeper/conf/zoo.cfg
starting zookeeper ... STARTED
[root@ubuntu2204 ~]#/usr/share/zookeeper/bin/zkserver.sh status
ZooKeeper JMX enabled by default
using config: /etc/zookeeper/conf/zoo.cfg
Mode: standalone
单机安装脚本
install_zookeeper_single_node.sh
#!/bin/bash
#
#********************************************************************
#Author: wangxiaochun
#Date: 2020-06-20
#FileName: install_zookeeper.sh
#URL: http://www.wangxiaochun.com
#Description: The test script
#Copyright (C): 2022 All rights reserved
#********************************************************************
#支持在线和离线安装
ZK_VERSION=3.8.1
#ZK_VERSION=3.8.0
#ZK_VERSION=3.6.3
#ZK_VERSION=3.7.1
#ZK_URL=https://archive.apache.org/dist/zookeeper/zookeeper-${ZK_VERSION}/apache-zookeeper-${ZK_VERSION}-bin.tar.gz
ZK_URL=https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-${ZK_VERSION}/apache-zookeeper-${ZK_VERSION}-bin.tar.gz
#ZK_URL="https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/stable/apache-zookeeper-${ZK_VERSION}-bin.tar.gz"
#ZK_URL="https://downloads.apache.org/zookeeper/stable/apache-zookeeper-${ZK_VERSION}-bin.tar.gz"
INSTALL_DIR=/usr/local/zookeeper
HOST=`hostname -I|awk '{print $1}'`
. /etc/os-release
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1" && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
install_jdk() {
if [ $ID = 'centos' -o $ID = 'rocky' ];then
yum -y install java-1.8.0-openjdk-devel || { color "安装JDK失败!" 1; exit 1; }
else
apt update
apt install openjdk-11-jdk -y || { color "安装JDK失败!" 1; exit 1; }
#apt install openjdk-8-jdk -y || { color "安装JDK失败!" 1; exit 1; }
fi
java -version
}
install_zookeeper() {
if [ -f apache-zookeeper-${ZK_VERSION}-bin.tar.gz ] ;then
cp apache-zookeeper-${ZK_VERSION}-bin.tar.gz /usr/local/src/
else
wget -P /usr/local/src/ --no-check-certificate $ZK_URL || { color "下载失败!" 1 ;exit ; }
fi
tar xf /usr/local/src/${ZK_URL##*/} -C /usr/local
ln -s /usr/local/apache-zookeeper-*-bin/ ${INSTALL_DIR}
echo "PATH=${INSTALL_DIR}/bin:$PATH" > /etc/profile.d/zookeeper.sh
. /etc/profile.d/zookeeper.sh
mkdir -p ${INSTALL_DIR}/data
cat > ${INSTALL_DIR}/conf/zoo.cfg <<EOF
tickTime=2000
initLimit=10
syncLimit=5
dataDir=${INSTALL_DIR}/data
clientPort=2181
maxClientCnxns=128
autopurge.snapRetainCount=3
autopurge.purgeInterval=24
EOF
cat > /lib/systemd/system/zookeeper.service <<EOF
[Unit]
Description=zookeeper.service
After=network.target
[Service]
Type=forking
#Environment=${INSTALL_DIR}
ExecStart=${INSTALL_DIR}/bin/zkServer.sh start
ExecStop=${INSTALL_DIR}/bin/zkServer.sh stop
ExecReload=${INSTALL_DIR}/bin/zkServer.sh restart
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now zookeeper.service
systemctl is-active zookeeper.service
if [ $? -eq 0 ] ;then
color "zookeeper 安装成功!" 0
else
color "zookeeper 安装失败!" 1
exit 1
fi
}
install_jdk
install_zookeeper
启动zk
#查看选项
[root@ubuntu1804~]#zkServer.sh --help
#前台启动观察启动过程
[root@ubuntu1804~]#zkServer.sh start-foreground
#后台启动
[root@ubuntu1804~]#zkServer.sh start
/usr/bin/java
ZooKeeper JMX enabled by default
using config: /usr/local/zookeeper/bin/ ../conf/zoo.cfg
starting zookeeper ... STARTED
注意:如果配置service, zkserver.sh和systemctl不要混用,否则无法启动
验证zk
[root@ubuntu1804~]#zkserver.sh status
/usr/bin/java
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: standalone
[root@ubuntu1804 ~]#ss -ntpl|grep 2181
LISTEN 0 50 *:2181 *:* users: (("java",pid=1041,fd=70))
[root@ubuntu1804 ~]#pstree -p 1041
java (1041) --{java}(1044)
|-{java}(1045)
|-{java}(1046)
|-{java}(1047)
|-{java}(1048)
|-{java}(1049)
|-{java}(1050)
|-{java}(1051)
|-{java}(1052)
|-{java}(1053)
|-{java}(1054)
|-{java}(1055)
zk集群
ZooKeeper集群用于解决单点和单机性能及数据高可用等问题。
Zookeeper集群基于Master/Slave的模型
处于主要地位负责处理写操作)的主机称为Leader节点,处于次要地位主要负责处理读操作的主机称为follower节点
当进行写操作时,由Master(leader)完成,再同步到其它Slave(follower)节点;而且要求在保证写操作在所有节点的总数过半后;才会认为写操作成功。
生产中读取的方式一般是以异步复制方式来实现的。
对于n台server,每个server都知道彼此的存在。只要有>n/2台server节点可用,整个zookeeper系统保持可用。因此zookeeper集群通常由奇数台Server节点组成。
官方链接:下图表示读的比例越高,性能越好
https://zookeeper.apache.org/doc/r3.7.0/zookeeperOver.html
集群角色
角色功能简介:
1.Leader:领导者
是ZooKeeper集群中最核心的角色,所有的写请求都会经过 Leader 处理,
它负责将写操作同步给其他节点并保证集群一致性。Leader 还负责管理整个集群的状态以及协调其他节点的选举。
2.Follower:跟随者
主要负责处理客户端的读请求,并作为写请求的中转,将其转发给 Leader 处理。
Follower参与集群中的一致性协议,通过与 Leader 同步数据来保持数据一致性。
3.Observer:观察者
这是一个特殊的角色,主要处理读请求,不参与投票和写操作的同步,适合在需要扩展读能力的场景下使用,可以减轻集群的写压力。
4.Leaarner: 学习者
和leader进行状态同步的节点统称Learner,包括:Follower和Observer
5.Client:客户端
客户端与ZooKeeper集群交互,发起读写请求,依赖于 ZooKeeper的一致性和Watch机制来监控分布式系统的状态变化。
选举过程
1.节点角色状态
节点角色状态:
1.LOOKING: 寻找Leader状态,处于该状态需要进入选举流程
2.LEADING: 领导者状态,处于该状态的节点说明是角色已经是Leader
3.FOLLOWING: 跟随者状态,表示Leader已经选举出来,当前节点角色是follower
4.OBSERVER: 观察者状态,表明当前节点角色是observer
2.选举ID
选举ID;
1.ZXID (zookeeper transaction id):每个改变Zookeeper状态的操作都会自动生成一个对应的ZXID。ZXID最大的节点优先选为Leader
2.myid:服务器的唯一标识(SID),通过配置myid文件指定,集群中唯一当ZXID一样时,myid大的节点优先选为Leader
3.具体过程
当集群中的zookeeper节点启动以后,会根据配置文件中指定的zookeeper节点地址进行leader选择操作,
过程如下:
1.每个zookeeper都会发出投票,由于是第一次选举leader,因此每个节点都会把自己当做leader角色进行选举,
每个zookeeper的投票中都会包含自己的myid和zxid,此时zookeeper 1的投票为myid为1,
初始zxid有一个初始值0xO,后期会随着数据更新而自动变化,zookeeper 2的投票为myid为2,初始zxid为初始生成的值。
2.每个节点接受并检查对方的投票信息,比如投票时间、是否状态为LOOKING状态的投票。
3.对比投票,优先检查zxid,如果zxid不一样则zxid大的为leader,
如果zxid相同则继续对比myid,myid大的一方为leader
成为Leader的必要条件: Leader要具有最高的zid;
当集群的规模是n时,集群中大多数的机器(至少n/2+1)得到响应并从follower中选出的Leader。
4.心跳机制
心跳机制:
Leader与Follower利用PING来感知对方的是否存活,当Leader无法响应PING时,将重新发起Leader选举。
5.ZAB协议
ZAB(ZooKeeper Atomic Broadcast原子广播)协议是为分布式协调服务zooKeeper专门设计的一种支持崩溃恢复的原子广播协议。在Zookeeper 中,主要依赖ZAB协议来实现分布式数据一致性,基于该协议,Zookeeper实现了一种主备模式的系统架构来保持集群中各个副本之间的数据一致性。
当Leader服务器出现网络中断、崩溃退出与重启等异常情况时,
ZAB(Zookeeper Atomic Broadcast)协议就会进入恢复模式并选举产生新的Leader服务器。
这个过程大致如下:
1.Leader Election(选举阶段)︰
节点在一开始都处于选举阶段,只要有一个节点得到超半数节点的票数,它就可以当选准leader,
2.Discovery(发现阶段)︰
在这个阶段,followers跟准leader进行通信,同步followers最近接收的事务提议。
3.Synchronization(同步阶段):
同步阶段主要是利用leader前一阶段获得的最新提议历史,同步集群中所有的副本。同步完成之后准leader 才会成为真正的leader。
4.Broadcast(广播阶段)︰
到了这个阶段,Zookeeper集群才能正式对外提供事务服务,并且leader可以进行消息广播。同时如果有新的节点加入,还需要对新节点进行同步
集群特性
整个集群中只要有超过集群数量一半的zookeeper工作是正常的,那么整个集群对外就是可用的。
假如有2台服务器做了一个Zookeeper集群,只要有任何一台故障或宕机,那么这个ZooKeeper集群就不可用了,因为剩下的一台没有超过集群一半的数量,但是假如有三台zookeeper组成一个集群,那么损坏一台就还剩两台,大于3台的一半,所以损坏一台还是可以正常运行的,但是再损坏一台就只剩一台集群就不可用了。那么要是4台组成一个zookeeper集群,损坏一台集群肯定是正常的,那么损坏两台就还剩两台,那么2台不大于集群数量的一半,所以3台的zookeeper集群和4台的zookeeper集群损坏两台的结果都是集群不可用,以此类推5台和6台以及7台和8台都是同理。
ZooKeeper 选举示例
假设 ZooKeeper 集群中有 5 个节点,ID 分别为 1、2、3、4、5,节点的 ZXID 如下:
1.第一轮投票:
第一轮每个节点都选自己
节点1提议自己为Leader,投票内容为 (ID=1, ZXID=0x100)。
节点2提议自己为Leader,投票内容为 (ID=2, ZXID=0x200)。
节点4提议自己为Leader,投票内容为 (ID=4, ZXID=0x300)。
节点5提议自己为Leader,投票内容为 (ID=5, ZXID=0x400)。
2.节点收到其他投票并更新提议:
节点1收到其他节点的投票,发现节点5的ZXID比自己大,更新投票为(ID=5, ZXID=0x400)。
节点2和3同样更新为支持节点5。
节点4也更新为支持节点5。
3.节点 5 被选为 Leader:
最终,节点5获得了超过半数(3 个以上)节点的支持,因此节点5成为新的 Leader。
4.其余节点成为 Follower:
其他节点确认了节点5成为Leader 后,进入FOLLOWING 状态,开始从节点5同步数据。
集群部署
官方文档:https://zookeeper.apache.org/doc/r3.6.2/zookeeperAdmin.html#sc_zkMulitServerSetup
1.环境准备
#三台ubuntu18.04,20.04,22.04
zookeeper-node1.wang.org 10.0.0.101
zookeeper-node2.wang.org 10.0.0.102
zookeeper-node3.wang.org 10.0.0.103
#在三个节点都安装]DK8或JDK11
[root@zookeeper-node1 ~]#apt update && apt -y install openjdk-11-jdk
[root@zookeeper-node1 ~]#apt update 8& apt -y install openjdk-8-jdk
[root@zookeeper-node2 ~]#apt update 8& apt -y install openjdk-8-jdk
[root@zookeeper-node3 ~]#apt update && apt -y install openjdk-8-jdk
2.在所有节点下载并解压缩ZooKeeper包文件
[root@zookeeper-node1 ~]#wget -P /usr/local/src https://downJoads.apache.org/zookeeper/stable/apache-zookeeper-3.6.3-bin.tar.gz
[root@zookeeper-node1 ~]#tar xf /usr/local/src/apache-zookeeper-3.6.3-bin.tar.gz -c /usr/local/
[root@zookeeper-node1 ~]#ln -s /usr/local/apache-zookeeper-3.6.3-bin /usr/local/zookeeper
[root@zookeeper-node1 ~]#echo 'PATHE/usr/local/zookeeper/bin:$PATH' > /etc/profile.d/zookeeper .sh
[root@zookeeper-node1 ~]#. /etc/profile.d/zookeeper.sh
3.准备配置文件
#三个节点都要创建数据目录
[root@zookeeper-node1 ~]#mkdir /usr/local/zookeeper/data
#基于模板配置文件生成配置文件
[root@zookeeper-node1 ~]#cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg
#修改配置文件
[root@zookeeper-node1 ~]#vim /usr/local/zookeeper/conf/zoo.cfg
#配置文件内容
[root@zookeeper-node1 ~-]#grep -v "\^\#” /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000 服务器与服务器之间的单次心跳检测时间间隔,单位为毫秒
initLimit=10 集群中leader服务器与follower服务器初始连接心跳次数,即多少个2000毫秒
syncLimit=5 leader与follower之间连接完成之后,后期检测发送和应答的心跳次数,
如果该follower在设置的时间内(5*2000)不能与leader进行通信,那么此 follower将被视为不可用。
dataDir=/usr/loca1/zookeeper/data 自定义的zookeeper保存数据的目录
clientPort=2181 客户端连接zookeeper服务器的端口,
zookeeper会监听这个端口,接受客户端的访问请求
maxclientcnxns=128 单个客户端IP可以和zookeeper保持的连接数
autopurge .snapRetaincount=3 3.4.0中的新增功能:启用后,zooKeeper自动清除功能,
会将只保留此最新3个快照和相应的事务日志,并分别保留在dataDir
和dataLogDir中,删除其余部分,默认值为3,最小值为3
autopurge.purgeInterval=24 3.4.0及之后版本,ZK提供了自动清理日志和快照文件的功能,
这个参数指定了清理频率,单位是小时,需要配置一个1或更大的整数,默认是0,表示不开启自动清理功能
格式: server.MyID服务器唯一编号=服务器IP;
Leader和Follower的数据同步端口(只有leader才会打开):Leader和Follower选举端口(L和F都有)
server.1=10.0.0.101: 2888:3888
server.2=10.0.0.102: 2888:3888
server.3=10.0.0.103: 2888:3888
如果添加节点,只需要在所有节点上添加新节点的上面形式的配置行,在新节点创建myid文件,并重启所有节点服务即可
[root@zookeeper-node1 ~]#scp /usr/local/zookeeper/conf/zoo.cfg 10.0.0.102:/usr/local/zookeeper/conf/
[root@zookeeper-node1 ~]#scp /usr/local/zookeeper/conf/zoo.cfg 10.0.0.103:/usr/local/zookeeper/conf/
4.在各个节点生成ID文件
[root@zookeeper-node1 ~]#echo 1 > /usr/local/zookeeper/data/myid
[root@zookeeper-node2~-]#echo 2 > /usr/local/zookeeper/data/myid
[root@zookeeper-node3 ~]#echo 3 > /usr/local/zookeeper/data/myid
5.各服务器启动Zookeeper
#注意:在所有三个节点快速启动服务,否则会造成集群失败
[root@zookeeper-node1 ~]#zkServer.sh start
[root@zookeeper-node2 ~]#zkServer.sh start
[root@zookeeper-node3 ~]#zkserver.sh start
#注意:如果无法启动查看日志
[root@zookeeper-node1 ~]#cat /usr/local/zookeeper/logs/zookeeper-root-server-zookeeper-node1.wang.org.out
6.查看集群状态
[root@zookeeper-node1 ~]#zkServer.sh status
/usr/bin/java
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
[root@zookeeper-node1 ~]#ss -ntl|grep 888
LISTEN 0 50 [::ffff:10.0.0.101]:3888
#只有leader监听2888/tcp端口
[root@zookeeper-node2 ~]#zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config:/usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. client address: localhost.client ssl: fa1se.
Mode: leader
[root@zookeeper-node2~]#ss -ntl|grep 888
LISTEN 0 50 [::ffff:10.0.0.102]:3888 ☆:☆
LISTEN 0 50 [::ffff:10.0.0.102]:3888 ☆:☆
[root@zookeeper-node3 ~]#zkServer.sh status
/usr/bin/java
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
[root@zookeeper-node3~]#ss -ntl|grep 888
LISTEN 0 50 [::ffff:10.0.0.103]:3888 ☆:☆