cd /usr/local/
mkdir zookeeper
cd zookeeper
下载
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
解压在当前目录
tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz
下载的zk安装,解压之后就可以用了:
修改解压之后的目录名称(也可以不修改)
mv apache-zookeeper-3.7.0-bin apache-zookeeper-3.7.0
cd apache-zookeeper-3.7.0
data/zoo用于存储zk数据
mkdir -p data/zoo
修改zoo_sample.cfg 为zoo.cfg,因为bin/zkServer.sh默认用的是zoo.cfg
mv conf/zoo_sample.cfg conf/zoo.cfg
修改zoo.cfg 中的dataDir为/usr/local/zookeeper/apache-zookeeper-3.7.0/data/zoo
不能用/tmp 存储zk数据,因为机器会定时清理/tmp目录下的数据
vim conf/zoo.cfg
启动,默认使用的conf/zoo.cfg启动,单机版。
bin/zkServer.sh start
直接运行bin/zkServer.sh
,可以看到该命令的使用说明,常用的有start
,status
,restart
,stop
,还可以在启动时指定配置文件,如:
指定配置文件启动,配置文件路径必须放在后面
bin/zkServer.sh start conf/zoo.cfg
2、配置说明
ZooKeeper
的启动配置文件zoo.cfg
的配置内容说明:
The number of milliseconds of each tick
通信心跳时间,Leader和Follower或者Zookeeper服务器与客户端心跳时间,单位毫秒
tickTime=2000
The number of ticks that the initial
synchronization phase can take
Leader和Follower初始连接时能容忍的最多心跳数(tickTime的数量)
initLimit=10
The number of ticks that can pass between
sending a request and getting an acknowledgement
Leader和Follower之间通信时间如果超过syncLimit * tickTime,
Leader认为Follwer死掉,从服务器列表中删除Follwer。
syncLimit=5
the directory where the snapshot is stored.
do not use /tmp for storage, /tmp here is just
example sakes.
保存zk数据的目录,默认是/tmp,一般要修改为其他路径,因为Linux系统会定期请求/tmp下的数据
dataDir=/usr/local/zookeeper/apache-zookeeper-3.7.0/data/zoo
the port at which the clients will connect
客户端连接的端口
clientPort=2181
the maximum number of client connections.
increase this if you need to handle more clients
最大客户端连接数,默认60
#maxClientCnxns=60
The number of snapshots to retain in dataDir
dataDir中保留的快照数量
#autopurge.snapRetainCount=3
Purge task interval in hours
Set to “0” to disable auto purge feature
自动清除任务运行时间间隔,单位为小时,
若设置为 0 则禁用自动清除功能
#autopurge.purgeInterval=1
zk 指标监控提供者,官方推荐用prometheus普罗米修斯
Metrics Providers
https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true
zoo.cfg
配置内容最后面是ZooKeeper
指标数据监控配置,官方推荐用prometheus
,如果用生产中用influxdb
存储zk指标数据,本人推荐用Telegraf。
ZooKeeper
集群中只要有半数以上节点存活,就能正常对外提供服务,所以Zookeeper
集群一般运行奇数个服务端。由于学习用的Linux只有一台,只能搭建一个伪集群,不过理论上都是一样的。
1、伪集群
搭建ZooKeeper
集群至少需要同时运行三个zk服务实例,如果其中一个挂了,依然可以正常对外提供服务。
(1)准备myid文件
为三个ZK实例创建数据存储目录。
在/usr/local/zookeeper/apache-zookeeper-3.7.0/data目录下
创建zoo-1、zoo-2、zoo-3
mkdir data/zoo-1 && mkdir data/zoo-2 && mkdir data/zoo-1
为三个目录分别创建myid
文件,其内容只有一个数字编号,分别为1、2、3。myid
文件中的编号唯一标识服务节点,用于Leader
投票选举。
(2)配置zoo-.cfg文件
复制修改三份zoo.cfg
,分别为zoo-1.cfg
、zoo-2.cfg
、zoo-3.cfg
。
zoo-1.cfg
没有显示的配置项和zoo.cfg一致
dataDir=/usr/local/zookeeper/apache-zookeeper-3.7.0/data/zoo-1
clientPort=2191
server.1 = 127.0.0.1:2888:3888
server.2 = 127.0.0.1:2889:3889
server.3 = 127.0.0.1:2890:3890
zoo-2.cfg
没有显示的配置项和zoo.cfg一致
dataDir=/usr/local/zookeeper/apache-zookeeper-3.7.0/data/zoo-2
clientPort=2192
server.1 = 127.0.0.1:2888:3888
server.2 = 127.0.0.1:2889:3889
server.3 = 127.0.0.1:2890:3890
zoo-3.cfg
没有显示的配置项和zoo.cfg一致
dataDir=/usr/local/zookeeper/apache-zookeeper-3.7.0/data/zoo-3
clientPort=2193
server.1 = 127.0.0.1:2888:3888
server.2 = 127.0.0.1:2889:3889
server.3 = 127.0.0.1:2890:3890
由于三个伪实例在一台机器上运行,所以clientPort
不一样,实际生产中三个zk实例会运行在不同机器上,clientPort
建议一致(2181)。
每个配置中都有相同的三行配置,表示这是一个集群关系配置:
server.A=B:C:D
-
A是一个数字,就是每个zk实例的myid文件中的编号。
-
B是ip地址,每个zk实例所在的机器ip。
-
C是集群中
Leader
和Follower
通信的端口,如Leader
向Follower
发送同步写指令,Follower
将写请求转发给Leader
。(通信端口) -
D是集群中用于投票选举Leader的端口。(选举端口)
实际生产中,不同的zk实例运行在不同机器上,所以通信端口和选举端口各需要一个即可。
2、集群启动第一次Leader选举
依次执行如下命令,启动集群:
在/usr/local/zookeeper/apache-zookeeper-3.7.0目录下
bin/zkServer.sh start conf/zoo-1.cfg
bin/zkServer.sh start conf/zoo-2.cfg
bin/zkServer.sh start conf/zoo-3.cfg
为了看清楚三个zk实例启动时的Leader
选举过程,特意在每次start
之后穿插status
:
-
启动
zoo-1
时,发起一次投票,zoo-1
给自己投一票,此时服务实例不够半数以上,无法对外提供服务。status
显示Error contacting service
。 -
启动
zoo-2
时,再发起一次投票,status
显示zoo-2
为leader
,zoo-1显示follower
,说明zoo-2
给自己投了一票,zoo-1
也给zoo-2
投了一票,服务实例数超过半数,leader
选举完成,此时可以对外提供服务。 -
启动
zoo-3
时,status
显示zoo-3
是follower
。说明后来者zoo-3
把选票投给了已经当上了leader
的zoo-2
。
调整启动顺序,zoo-2
,zoo-1
,zoo-3
:
leader依然是zoo-2。
将zoo-3
放在前两次启动,leader
就是zoo-3
,最后启动实例都是Follower
(演示省略),可得出结论:
-
myid
小的投票给myid
大的实例。 -
已经完成
leader
选举后,后来者会直接把选票投给现任leader
,自己甘为Follower
。
(leader投票选举的更多细节还需要后续看了源码才知道。)
3、模拟服务实例宕机leader重选
Follower
实例宕机,只要集群实例个数在半数以上,依然可以对外提供服务,leader
的地位也不会动摇,只有当身为leader
的实例宕机了,此时就需要重新投票选leader
。
此时leader
是zoo-2
,将其stop
,再次查看zoo-1
和zoo-3
的状态,zoo-3
变成了leader
。
(更多leader重选细节还需后续看了源码才知道。)
4、编写集群批量启动脚本
集群中每个实例手动一个个执行启动命令,确实比较麻烦,特编写一个批量启动脚本,如果多实例运行在不同机器上,可改成ssh的方式:
#!/bin/bash
case $1 in
“start”){
for i in zoo-1.cfg zoo-2.cfg zoo-3.cfg
do
echo ---------- zookeeper $i 启动 ------------
/usr/local/zookeeper/apache-zookeeper-3.7.0/bin/zkServer.sh start /usr/local/zookeeper/apache-zookeeper-3.7.0/conf/$i
done
};;
“stop”){
for i in zoo-1.cfg zoo-2.cfg zoo-3.cfg
do
echo ---------- zookeeper $i 停止 ------------
/usr/local/zookeeper/apache-zookeeper-3.7.0/bin/zkServer.sh stop /usr/local/zookeeper/apache-zookeeper-3.7.0/conf/$i
done
};;
“restart”){
for i in zoo-1.cfg zoo-2.cfg zoo-3.cfg
do
echo ---------- zookeeper $i 重启 ------------
/usr/local/zookeeper/apache-zookeeper-3.7.0/bin/zkServer.sh restart /usr/local/zookeeper/apache-zookeeper-3.7.0/conf/$i
done
};;
“status”){
for i in zoo-1.cfg zoo-2.cfg zoo-3.cfg
do
echo ---------- zookeeper $i 状态 ------------
/usr/local/zookeeper/apache-zookeeper-3.7.0/bin/zkServer.sh status /usr/local/zookeeper/apache-zookeeper-3.7.0/conf/$i
done
};;
esac
ZooKeeper
集群搭建好了,就该用客户端连接上集群进行操作了,后续篇章会对客户端操作做详细讲解。
本篇总结如下:
-
Zookeeper
有两个核心设计:Watch
机制和ZAB
一致性算法。基于此,Zookeeper
成为很多分布式系统的基石。 -
Zookeeper
放弃可用性A,保证CP。数据全局强一致性,并且能在几秒内快速同步,具有不错的实时性体验。 -
Zookeeper
数据结构是类UNIX文件系统目录的树状结构,每个ZNode
通过其路径(Path)唯一标识,每个ZNode
可以存储少量二进制数据,默认最大为1MB。 -
ZNode
有四种类型:持久节点(配置中心,注册中心)、临时节点(服务上下线感知)、时序节点(分布式ID)、临时时序节点(分布式锁)。 -
Zookeeper
的典型的应用场景:配置中心,命名服务,服务注册中心,服务上下线感知,集群通信与控制系统,分布式锁等。 -
在
leader
选举没有完成前,选票会投给myid
较大的实例,选举完成后,后来启动的实例会将选票直接投给现任leader
,自己为Follower
。
知其然不知其所以然,大厂常问面试技术如何复习?
1、热门面试题及答案大全
面试前做足功夫,让你面试成功率提升一截,这里一份热门350道一线互联网常问面试题及答案助你拿offer
2、多线程、高并发、缓存入门到实战项目pdf书籍
3、文中提到面试题答案整理
4、Java核心知识面试宝典
覆盖了JVM 、JAVA集合、JAVA多线程并发、JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入
88126712)]
[外链图片转存中…(img-6BxvBu8Q-1714188126712)]
3、文中提到面试题答案整理
[外链图片转存中…(img-9a9M7ilp-1714188126713)]
4、Java核心知识面试宝典
覆盖了JVM 、JAVA集合、JAVA多线程并发、JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入
[外链图片转存中…(img-JpDifJAO-1714188126713)]
[外链图片转存中…(img-dgLHKcXv-1714188126713)]
[外链图片转存中…(img-FeQagqE8-1714188126714)]