概述
- 基于观察者模式设计的分布式服务管理框架,zookeeper=文件系统+通知机制。
- zookeeper是树形数据结构,每个节点是一个ZNode,每个ZNode路径都是唯一的。每个节点默认存储1MB数据。
1 2 3 4 5 6 7
| -- / 路径:/ -- /node1 路径:/node1 -- /test1 路径:/node1/test1 -- /test2 路径:/node1/test2 -- /node2 路径:/node2 -- /test1 路径:/node2/test1 -- /test3 路径:/node2/test3
|
zookeeper集群
- zookeeper集群是一主多从的集群机制,半数以上的节点存活集群即可正常工作。(集群最小节点数为3)
- 全局数据一致,每个节点的数据完全相同。
- 数据更新具有原子性,实时性较高
应用场景
统一命名服务
- 为微服务提供命名服务,树形数据结构也挺适合公司里面的团队结构的。
1 2 3 4 5 6 7 8
| -- / -- /services -- /login_services - IP1 - IP2 -- /feedback_services - IP1 - IP2
|
软负载均衡
- 在统一命名服务的基础上,将节点访问数信息写入ZNode,优先让访问数较小的服务处理新请求
1 2 3 4 5 6 7 8
| - / -- /services -- /login_services - IP1 访问数 99 - IP2 访问数 100 -- /feedback_services - IP1 访问数 100 - IP2 访问数 1000
|
统一配置管理
- 集中管理配置文件,客户端监听ZNode,可以实现动态配置
统一集群管理
安装配置
单机
可以直接启动,但是使用docker-compose写配置文件的话,更加规范美观
配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13
| version: '3' services: zookeeper: image: zookeeper:3.4 restart: always container_name: zookeeper volumes: - /usr/workspace/volumes/single/zk/data:/data - /usr/workspace/volumes/single/zk/logs:/datalog ports: - "2181:2181" 可选数据卷挂载:- /usr/workspace/volumes/single/zk/config:/conf
|
启动
1
| docker-compose -f zk-single.yml up -d
|
测试
集群
创建网络
- 创建自定义网络:
docker network create --driver=bridge --subnet=172.18.0.0/16 --gateway=172.18.0.1 my-cluster-network
服务 |
IP |
端口(主机:容器) |
zookeeper1 |
172.18.1.1 |
2181:2181 |
zookeeper2 |
172.18.1.2 |
2182:2181 |
zookeeper3 |
172.18.1.3 |
2183:2181 |
编写配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| version: '3' services: zoo1: image: zookeeper:3.4 restart: always hostname: zoo1 container_name: zoo1 ports: - 2181:2181 volumes: - "/usr/workspace/volumes/zkcluster/zoo1/data:/data" - "/usr/workspace/volumes/zkcluster/zoo1/datalog:/datalog" environment: ZOO_MY_ID: 1 ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 networks: my-cluster-network: ipv4_address: 172.18.1.1
zoo2: image: zookeeper:3.4 restart: always hostname: zoo2 container_name: zoo2 ports: - 2182:2181 volumes: - "/usr/workspace/volumes/zkcluster/zoo2/data:/data" - "/usr/workspace/volumes/zkcluster/zoo2/datalog:/datalog" environment: ZOO_MY_ID: 2 ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 networks: my-cluster-network: ipv4_address: 172.18.1.2
zoo3: image: zookeeper:3.4 restart: always hostname: zoo3 container_name: zoo3 ports: - 2183:2181 volumes: - "/usr/workspace/volumes/zkcluster/zoo3/data:/data" - "/usr/workspace/volumes/zkcluster/zoo3/datalog:/datalog" environment: ZOO_MY_ID: 3 ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 networks: my-cluster-network: ipv4_address: 172.18.1.3 networks: my-cluster-network: external: name: my-cluster-network
|
启动
docker-compose -f zk-cluster.yml up -d
测试
- 分别进入zoo1、zoo2以及zoo3容器,发现zoo1、zoo2是Follower,zoo3是Leader,集群搭建完毕。
配置文件解读
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| # 心跳间隔(ms),也是zookeeper中一个基本的单位 tickTime=2000 # 初始化最大延迟时间(10*tickTime) initLimit=10 # 同步时间(5*tickTime) syncLimit=5 # 客户端访问端口号 clientPort=2181
# 数据文件目录、数据持久化路径 # 快照日志 dataDir=xxx # 事务日志 dataLogDir=xxx
# zookeeper3.4之后zookeeper支持自动清理快照文件和事务日志文件的功能 # 保留文件的个数 autopurge.snapRetainCount=3 # 自动清理的频率,单位为小时,0为不清理 autopurge.purgeInterval=0
# 最大客户端连接数 maxClientCnxns=60 # 集群配置项 server.A=B:C:D(A为服务器编号,B为服务器IP,C为数据通信(副本拷贝)端口,D为选举端口)
|