【Zookeeper】ZooKeeper集群搭建与选举原理终极指南(Docker版 + 三角色详解)
ZooKeeper集群搭建与选举原理终极指南(Docker版 + 三角色详解)
一、环境准备(Docker版)
1. 服务器准备(3台节点)
# 所有节点执行
sudo apt-get update && sudo apt-get install -y docker.io docker-compose
sudo systemctl enable docker && sudo systemctl start docker
2. 创建专用网络(所有节点)
docker network create --driver bridge --subnet 172.20.0.0/16 zk_net
二、Docker方式部署ZooKeeper集群
1. 节点1配置(Leader候选)
# 创建数据目录
mkdir -p /data/zookeeper/node1/{data,datalog}
# 创建docker-compose.yml
cat > /data/zookeeper/node1/docker-compose.yml <<EOF
version: '3.8'
services:
zookeeper:
image: zookeeper:3.8.1
restart: always
hostname: zk-node1
container_name: zk-node1
ports:
- "2181:2181"
- "2888:2888"
- "3888:3888"
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zk-node1:2888:3888;2181 server.2=zk-node2:2888:3888;2181 server.3=zk-node3:2888:3888;2181
ZOO_STANDALONE_ENABLED: "false"
volumes:
- /data/zookeeper/node1/data:/data
- /data/zookeeper/node1/datalog:/datalog
networks:
zk_net:
ipv4_address: 172.20.0.101
networks:
zk_net:
external: true
EOF
2. 节点2配置(Follower)
mkdir -p /data/zookeeper/node2/{data,datalog}
cat > /data/zookeeper/node2/docker-compose.yml <<EOF
version: '3.8'
services:
zookeeper:
image: zookeeper:3.8.1
restart: always
hostname: zk-node2
container_name: zk-node2
ports:
- "2182:2181"
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zk-node1:2888:3888;2181 server.2=zk-node2:2888:3888;2181 server.3=zk-node3:2888:3888;2181
volumes:
- /data/zookeeper/node2/data:/data
- /data/zookeeper/node2/datalog:/datalog
networks:
zk_net:
ipv4_address: 172.20.0.102
networks:
zk_net:
external: true
EOF
3. 节点3配置(Observer)
mkdir -p /data/zookeeper/node3/{data,datalog}
cat > /data/zookeeper/node3/docker-compose.yml <<EOF
version: '3.8'
services:
zookeeper:
image: zookeeper:3.8.1
restart: always
hostname: zk-node3
container_name: zk-node3
ports:
- "2183:2181"
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zk-node1:2888:3888;2181 server.2=zk-node2:2888:3888;2181 server.3=zk-node3:2888:3888;2181:observer
ZOO_OBSERVER_ENABLED: "true"
volumes:
- /data/zookeeper/node3/data:/data
- /data/zookeeper/node3/datalog:/datalog
networks:
zk_net:
ipv4_address: 172.20.0.103
networks:
zk_net:
external: true
EOF
三、启动集群
# 每个节点执行(注意在对应目录执行)
docker-compose up -d
# 查看节点状态
docker exec -it zk-node1 zkServer.sh status
docker exec -it zk-node2 zkServer.sh status
docker exec -it zk-node3 zkServer.sh status
四、三大核心角色详解
1. Leader(领导者)
核心职责:
- 唯一接受写请求的节点
- 负责将写操作转化为事务(ZXID)
- 管理数据同步流程(2PC提交)
- 维护与Follower的心跳
关键特性:
Client-->|写请求|Leader
Leader-->|Proposal|Follower1
Leader-->|Proposal|Follower2
Follower-->|ACK|Leader
Leader-->|Commit|All
2. Follower(跟随者)
核心职责:
- 接受客户端读请求(负载分流)
- 参与Leader选举投票
- 从Leader同步数据变更
- 转发写请求给Leader
状态转换:
[*] --> LOOKING
LOOKING --> FOLLOWING: 确认Leader
FOLLOWING --> LOOKING: Leader失联
3. Observer(观察者)
特殊优势:
- 不参与投票(提高集群扩展性)
- 接受客户端读请求
- 异步同步Leader数据
- 跨数据中心部署的理想选择
性能对比:
| 角色 | 写吞吐量 | 读吞吐量 | 网络开销 |
|---|---|---|---|
| Leader | 低 | 中 | 高 |
| Follower | 无 | 高 | 中 |
| Observer | 无 | 最高 | 低 |
五、选举原理深度解析
1. 选举触发条件
- 集群初始化启动
- Leader失去心跳(默认2*tickTime)
- 超过半数节点连接丢失
- 管理员手动触发(
zkServer.sh restart)
2. 选举过程详解
阶段一:选票广播
# 伪代码示例
class Vote:
def __init__(self, sid, zxid, epoch):
self.sid = sid # 服务器ID
self.zxid = zxid # 最新事务ID
self.epoch = epoch # 选举周期
def compare_votes(v1, v2):
if v1.epoch != v2.epoch:
return v1.epoch > v2.epoch
elif v1.zxid != v2.zxid:
return v1.zxid > v2.zxid
else:
return v1.sid > v2.sid
阶段二:状态转换
participant Node1
participant Node2
participant Node3
Note over Node1: 初始状态: LOOKING
Node1->>Node2: 投票(1, zxid=100)
Node2->>Node1: 投票(2, zxid=120)
Node1->>Node3: 投票(2, zxid=120)
Node3->>Node1: 投票(3, zxid=120)
Note over Node1: 发现Node2获得多数票
Node1->>Node2: LEADERINFO
Node2-->>Node1: ACK
Note over Node1: 切换为FOLLOWING
六、生产环境调优建议
1. 关键参数优化
# 在docker环境变量中添加:
environment:
ZOO_TICK_TIME: "2000"
ZOO_INIT_LIMIT: "10"
ZOO_SYNC_LIMIT: "5"
ZOO_AUTOPURGE_SNAP_RETAIN_COUNT: "3"
ZOO_AUTOPURGE_PURGE_INTERVAL: "24"
2. 监控方案
# 使用四字命令监控
watch -n 1 "echo mntr | nc localhost 2181"
# 推荐监控指标:
• zk_avg_latency # 平均延迟
• zk_outstanding_requests # 排队请求数
• zk_znode_count # 节点数量
• zk_watch_count # watch数量
3. 故障模拟测试
# 模拟Leader宕机
docker pause zk-node1
# 观察日志(约2-5秒应完成选举)
docker logs --tail 100 -f zk-node2
# 恢复节点
docker unpause zk-node1
通过这种Docker化部署方式,您可以在10分钟内快速搭建一个生产可用的ZooKeeper集群,三大角色各司其职:Leader处理写请求保证一致性,Follower参与选举并提供读服务,Observer则专门扩展读能力。这种架构设计完美体现了分布式系统CAP理论中的CP特性。
【Zookeeper】ZooKeeper集群搭建与选举原理终极指南(Docker版 + 三角色详解)的更多相关文章
- Redis集群搭建及选举原理
redis集群简述 哨兵模式中如果主从中master宕机了,是通过哨兵来选举出新的master,在这个选举切换主从的过程,整个redis服务是不可用的.而且哨兵模式中只有一个主节点对外提供服务,因此没 ...
- 分享知识-快乐自己:zookeeper 伪集群搭建
1):单一 zookeeper 搭建步骤 2):zookeeper 伪集群搭建 1):新建一个集群目录 [root@zoodubbo opt]# mkdir zookeeper_cluster 2) ...
- zookeeper伪集群搭建
zookeeper伪集群搭建 1. 下载zookeeper: https://zookeeper.apache.org/ 2. 解压: tar -zxvf zookeeper-3.4.14.tar.g ...
- 给Clouderamanager集群里安装可视化分析利器工具Hue步骤(图文详解)
扩展博客 以下,是我在手动的CDH版本,安装Hue. CDH版本大数据集群下搭建Hue(hadoop-2.6.0-cdh5.5.4.gz + hue-3.9.0-cdh5.5.4.tar.gz)(博主 ...
- 给Ambari集群里安装可视化分析利器工具Hue步骤(图文详解)
扩展博客 以下,是我在手动的CDH版本平台下,安装Hue. CDH版本大数据集群下搭建Hue(hadoop-2.6.0-cdh5.5.4.gz + hue-3.9.0-cdh5.5.4.tar.gz) ...
- 初始zookeeper与集群搭建实例
zookeeper是什么 Zookeeper,一种分布式应用的协作服务,是Google的Chubby一个开源的实现,是Hadoop的分布式协调服务,它包含一个简单的原语集,应用于分布式应用的协作服务, ...
- [dubbo实战] dubbo+zookeeper伪集群搭建
zookeeper作为注册中心,服务器和客户端都要访问,如果有大量的并发,肯定会有等待.所以可以通过zookeeper集群解决. 一.为什么需要zookeeper呢? 大部分分布式应用需要一个主控.协 ...
- [dubbo实战] dubbo+zookeeper伪集群搭建 (转)
zookeeper作为注册中心,服务器和客户端都要访问,如果有大量的并发,肯定会有等待.所以可以通过zookeeper集群解决. 一.为什么需要zookeeper呢? 大部分分布式应用需要一 个主控. ...
- 初识ZooKeeper与集群搭建实例
原文链接:http://www.linuxidc.com/Linux/2015-02/114230.htm zookeeper是什么 Zookeeper,一种分布式应用的协作服务,是Google的Ch ...
- Zookeeper + Kafka 集群搭建
第一步:准备 1. 操作系统 CentOS-7-x86_64-Everything-1511 2. 安装包 kafka_2.12-0.10.2.0.tgz zookeeper-3.4.9.tar.gz ...
随机推荐
- Chrome浏览器使用AdGuard去除百度热搜
前言 百度的热搜会分散注意力,chrome 的 AdGuard 插件可以屏蔽广告,还可以屏蔽百度热搜 设置 > 用户过滤器 > 添加以下代码,即可屏蔽百度热搜 baidu.com##div ...
- 【JVM之内存与垃圾回收篇】垃圾回收相关概念
垃圾回收相关概念 System.gc() 的理解 在默认情况下,通过 System.gc() 或者 Runtime.getRuntime().gc() 的调用,会显式触发 FullGC,同时对新生代. ...
- Python+硅基流动API实现小说转有声读物
一.注册硅基流动账号获取文本转语音api 1.注册登录硅基流动 注册.登录硅基流动 查看apikey 查看赠送的免费额度 点击文档中心 2.查看文本转语音api 查看文本转语音api 查看api使用指 ...
- 《机器人SLAM导航核心技术与实战》第1季:第7章_SLAM中的数学基础
<机器人SLAM导航核心技术与实战>第1季:第7章_SLAM中的数学基础 视频讲解 [第1季]7.第7章_SLAM中的数学基础-视频讲解 [第1季]7.1.第7章_SLAM中的数学基础_S ...
- TidHTTP的post编码,老掉牙的问题
TidHTTP使用post时,需要提交json字符串. 那么采用什么编码,这个问题就头大了.目前xe已经不要考虑编码转换问题.但是.... 我们使用ISuperObject操控json.那么最后提交到 ...
- Web前端入门第 26 问:CSS 浏览器兼容性怎么查?
学编码之前,当先学排查问题的能力. 在那个 IE 浏览器 当道的时代,前端开发简直就是刀耕火种一般,一个简单的圆角模块,嘿...不好意思,它不支持,用图片吧. 但凡经历过 IE 的洗礼,就会知道当时哪 ...
- Linux halt命令
若系统的 runlevel 为 0 或 6 ,则Linux halt命令关闭系统,否则以 shutdown 指令(加上 -h 参数)来取代. 使用权限:系统管理者. 语法 halt [-n] [-w] ...
- JMeter递增加压总结
1.安装插件 a.下载JMeterPlugins-Standard.jar文件 下载链接:https://jmeter-plugins.org/downloads/old/ 下载完成后解压,将JMet ...
- 为了掌握设计模式,开发了一款Markdown 文本编辑器软件(已开源)
设计模式实战项目:Markdown 文本编辑器软件开发(已开源) 一.项目简介 项目名称:YtyMark-java 本项目是一款基于 Java 语言 和 JavaFX 图形界面框架 开发的 Markd ...
- fiddler断点应用
一.作用 1.模拟网络中断 2.断点时篡改数据 3.测试时做一些极端测试 二.断点步骤 1.全局断点 1)全局断点的两种方式 点击状态栏空白框,点击一下请求前断点,两下请求后断点,三下取消断点 Rul ...