Zookeeper 为分布式应用提供高效且可靠的分布式协调服务,提供了诸如统一命名服务、配置管理和分布式锁等分布式的基础服务。在解决分布式数据一致性方面,ZooKeeper 并没有直接采用 Paxos 算法,而是采用了名为 ZAB 的一致性协议
ZooKeeper 主要用来解决分布式集群中应用系统的一致性问题
,它能提供基于类似于文件系统的目录节点树方式的数据存储。但是 ZooKeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控存储数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理
很多大名鼎鼎的框架都基于 ZooKeeper 来实现分布式高可用,如:Dubbo、Kafka 等
Zookeeper 一个最常用的使用场景就是用于担任服务生产者和服务消费者的注册中心
Zookeeper 数据结构为一棵树,每一个节点成为 ZNode,每个 ZNode 默认存储 1MB 数据
对多个相同服务进行统一命名,可以负载均衡以及提高可用性
在分布式环境下,保证所有节点配置信息一致,并保证在修改配置文件之后,快速可以同步到各个节点中
实现:在 Zookeeper 中维护一份配置文件,客户端监听配置文件,保证配置文件修改后可以同步到最新配置
https://zookeeper.apache.org/
去官网下载 3.5.7-bin-tar.gz
tar -zxvf xxxbin-tar.gz -C /解压目录
修改 zookeeper 配置文件 ./conf/zoo.cfg
cd conf
# 将示例配置文件复制一份
cp zoo_sample.cfg zoo.cfg
# 修改配置文件
vi zoo.cfg
# 修改 dataDir 数据存储目录,可以在安装的zookeeper目录下创建 zkData 目录,将数据存储目录设置为 zkData 目录
dataDir=
# 启动服务
./bin/zkServer.sh start
# 查看是否启动
jps -l
# 启动客户端
./bin/zkCli.sh
# 查看 zookeeper 状态
bin/zkServer.sh status
Zookeeper 配置文件内容如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper
clientPort=2181
tickTime
通信心跳时间,单位毫秒,是 Zookeeper 服务器与客户端心跳事件
initLimit
LF 初始通信时间,Leader 和 Follower 初始连接时能容忍的最多心跳数
即如果 initLimit=2,tickTime=2000,那么 Leader 和 Follower 初始连接时间最大不能超过 2 * 2000ms = 2秒
syncLimit
LF 同步通信时限
Leader 和 Follower 之间通信如果超过 syncLimit * tickTime
,则 Leader 认为 Follower 挂掉,从服务器列表中删除 Follower
dataDir:保存 Zookeeper 中的数据
默认 tmp 目录,Limux 中 tmp 目录定期删除,一般不用默认目录
在 3 台服务器上部署 zookeeper,假设服务器分别为:zk1、zk2、zk3
部署流程为:
解压安装到 /develop/
目录下,并且改名为 zookeeper
,最终 zookeeper 目录为 /develop/zookeeper/
单台服务器编号配置
# 在 /develop/zookeeper/ 目录下创建目录 zkData,用于存放数据
cd /develop/zookeeper
mkdir zkData
# 在 zkData 目录下创建 myid 文件
vi myid
# myid 文件内容,作为身份标识
1
将上述的 zookeeper 目录拷贝到其他两台服务器,并且修改 myid
内容分别为 2、3
# 在每一台服务器将 zoo_sample.cfg 命名为 zoo.cfg
mv zoo_sample.cfg zoo.cfg
vim zoo_cfg
# 修改数据存储路径
dataDir=/develop/zookeeper/zkData
# 增加集群配置
server.1=ip:2888:3888
server.2=ip:2888:3888
server.3=ip:2888:3888
上边集群配置参数解释:
server.A=B:C:D
A 表示为服务器的 myid
B 表示服务器 ip
C 表示服务器 Follower 和集群中的 Leader 服务器交换信息的端口
D 表示集群中 Leader 如果挂了,需要用来选举的通信端口
在每台服务器中进行启动
zkServer.sh start
可以使用命令 zkServer.sh status
查看启动状态,当集群超过半数节点启动后,状态才为正常(如果不超过半数启动,无法选举 Leader)