作用
在分布式环境中保证数据的强一致性。
使用场景如
分布式锁
zk保证所有客户端只有一个客户端能够创建临时目录,最终创建成功的客户端就能获取锁,锁释放临时目录就删除了。命名服务
客户端连接zk,创建顺序节点,每个节点创建个全局唯一的路径 ,这个路径就可以作为一个名字。客户端根据名字找到对应的提供者信息。配置管理
分布式应用中有很多个节点,每个节点逐一增加配置很繁琐工作效率很低。把配置放到zookeeper上,所有应用对zookeeper监控,一旦配置信息发生改变,每个应用程序都会收到通知,然后从zookeeper钟获取最新的的配置。队列管理
-
集群管理
维护机器退出和加入、选举。
1.退出:所有节点约定在父目录钟创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该节点与zookeeper断开,其所创建的目录节点也被删除,其他机器也收到通知,某个节点挂了。
2.加入:有新的连接进来,会在目录中生成带顺序编号的目录节点,每次选取编号最小的机器作为master
3.选举:集群分为三个角色,- leader 为客户端提供读写服务
- follower
- observer
发布订阅
工作原理:zab协议
- 恢复模式(选主):当服务启动或者领导者崩溃后,zab进入恢复模式
- 广播模式(同步):当领导者被选举出来,且大多数server和leader状态同步完之后,恢复模式结束。leader将数据广播到各个follower
配置说明
配置项 | 值 | 说明 |
---|---|---|
tickTime | 2000 | 控制心跳和超时时间(毫秒) |
initLimit | 2 | 集群中的follower与leader中间初始连接时能容忍的最大心跳数(tickTime的倍数) |
syncLimit | 5 | 主从节点请求和应答的超时时间 |
dataDir | /home/zk/data | 用于存储zk产生的数据 |
clientPort | 2181 | zookeeper客户端端口 |
maxClientCnxn | 0 | 最大客户端连接数量(??为何不-1,如果不允许连接??) |
server.1 | server.1=47.96.170.165:2181 ... | 集群环境,节点名称以及端口 |
使用docker搭建集群环境
- docker-zk-compose.yml
version: '3.1'
services:
zoo1:
image: zookeeper
restart: always
hostname: localhost
ports:
- 2181:2181
environment:
服务ID,要保持唯一
ZOO_MY_ID: 1
2888端口号是zookeeper服务之间通信的端口
3888端口是zookeeper与其他应用程序通信的端口
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
zoo2:
image: zookeeper
restart: always
hostname: localhost
ports:
- 2182:2181
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
zoo3:
image: zookeeper
restart: always
hostname: localhost
ports:
- 2183:2181
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
- 后台启动集群
docker-compose -f docker-zk-compose.yml up -d - 进入集群
docker exec -it docker-zookeeper-cluster_zoo1_1 /bin/bash
root@localhost:/apache-zookeeper-3.6.1-bin# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader