ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。ZooKeeper 的架构通过冗余服务实现高可用性。
Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。
一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
目前我司的生产项目中用到 Zookeeper 的场景有:
有条件的可以分开不同的机器进行部署(真正的分布式),如果想节省成本可以在本机进行伪集群部署即可。
.
├── docker-compose.yml
├── zk-1
│ ├── conf
│ │ └── zoo.cfg
│ ├── data
│ └── datalog
├── zk-2
│ ├── conf
│ │ └── zoo.cfg
│ ├── data
│ └── datalog
└── zk-3
├── conf
│ └── zoo.cfg
├── data
└── datalog
version: '3'
services:
zk-1:
image: zookeeper:3.6
restart: always
container_name: zk-1
hostname: zk-1
# 给docker容器给超级权限,访问宿主机目录
privileged: true
ports:
- 2181:2181
- 8181:8080
environment:
# 当前zk实例的id
ZOO_MY_ID: 1
# 整个zk集群的机器端口列表(2181:对client端提供服务的端口,3888:选举leader使用,2888:集群内机器通讯使用(Leader监听此端口))
ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
volumes:
- ./zk-1/data:/data
- ./zk-1/datalog:/datalog
- ./zk-1/conf:/conf
networks:
- zk-net
zk-2:
image: zookeeper:3.6
restart: always
container_name: zk-2
hostname: zk-2
privileged: true
ports:
- 2182:2181
- 8182:8080
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
volumes:
- ./zk-2/data:/data
- ./zk-2/datalog:/datalog
- ./zk-2/conf:/conf
networks:
- zk-net
zk-3:
image: zookeeper:3.6
restart: always
container_name: zk-3
hostname: zk-3
privileged: true
ports:
- 2183:2181
- 8183:8080
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
volumes:
- ./zk-3/data:/data
- ./zk-3/datalog:/datalog
- ./zk-3/conf:/conf
networks:
- zk-net
# 给zk集群配置一个网络,网络名为zk-net
networks:
zk-net:
name: zk-net
# 存储快照文件snapshot的目录(相当于redis的rdb)
dataDir=/data
# ZK中的一个时间单元。ZK中所有时间都是以这个时间单元为基础,进行整数倍配置的。例如,session的最小超时时间是2*tickTime
tickTime=2000
# 初始值显示的刻度数,同步阶段可能需要
initLimit=10
# 发送请求和获得确认之间可以传递的心跳数
syncLimit=5
# 暴露服务端对外端口
clientPort=2181
# 单个客户端与单台服务器之间的连接数的限制,是ip级别的,默认是60,如果设置为0,那么表明不作任何限制
maxClientCnxns=60
# 需要保留的文件数目,默认是保留3个
autopurge.snapRetainCount=3
# ZK提供了自动清理事务日志和快照文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个1或更大的整数,默认是0,表示不开启自动清理功能
autopurge.purgeInterval=1
# 监控指标
metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
metricsProvider.httpPort=7000
metricsProvider.exportJvmInfo=true
docker-compose up -d
docker-compose ps
[root@Reseach zkCluster]# docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------------------------------------
zk-1 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2181->2181/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:8181->8080/tcp
zk-2 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2182->2181/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:8182->8080/tcp
zk-3 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2183->2181/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:8183->8080/tcp
curl localhost:8181/commands/stats
{
"version" : "3.6.3--6401e4ad2087061bc6b9f80dec2d69f2e3c8660a, built on 04/08/2021 16:35 GMT",
"read_only" : false,
"server_stats" : {
"packets_sent" : 0,
"packets_received" : 0,
"fsync_threshold_exceed_count" : 0,
"client_response_stats" : {
"last_buffer_size" : -1,
"min_buffer_size" : -1,
"max_buffer_size" : -1
},
"provider_null" : false,
"data_dir_size" : 615,
"log_dir_size" : 615,
"last_processed_zxid" : 0,
"outstanding_requests" : 0,
"server_state" : "standalone",
"avg_latency" : 0.0,
"max_latency" : 0,
"min_latency" : 0,
"num_alive_client_connections" : 0,
"auth_failed_count" : 0,
"non_mtlsremote_conn_count" : 0,
"non_mtlslocal_conn_count" : 0,
"uptime" : 498771
},
"client_response" : {
"last_buffer_size" : -1,
"min_buffer_size" : -1,
"max_buffer_size" : -1
},
"node_count" : 5,
"connections" : [ ],
"secure_connections" : [ ],
"command" : "stats",
"error" : null
}