摘要:本文系统讲解ZooKeeper分布式协调服务的核心概念、工作原理、数据一致性保障机制,以及完整的集群部署实践。作为Hadoop生态系统的核心组件,掌握ZooKeeper是理解分布式系统架构的关键一步。

关键词:ZooKeeper、分布式协调、Zab协议、Paxos算法、集群部署

第一章 环境规划与准备

一、规划内容

在搭建ZooKeeper集群之前,完整的环境规划是成功的关键。分布式系统的复杂性决定了我们必须从拓扑结构、主机规划、软件版本到数据目录进行全方位设计。

1. 集群拓扑(Master/Slave架构)

ZooKeeper集群采用经典的主从架构:

角色 数量 职责
Leader 1 主导写操作,协调事务提交流程
Follower 多个 处理读请求,参与选举与投票决策

核心特点

  • 每个Server保存一份完整的数据副本

  • 全局数据保持一致性视图

  • 写请求必须由Leader处理,读请求可分散到任意节点

2. 主机规划

/etc/hosts文件中配置IP映射,确保节点间可通过主机名通信:

# 编辑hosts文件
[root@hadoop1 ~]# vi /etc/hosts

# 添加以下配置
172.16.206.16   master
172.16.206.26   masterback
172.16.206.27   slave1
172.16.206.29   slave2
3. 软件规划清单
软件 版本 功能说明
CentOS 7.x 基础Linux操作系统
JDK 1.8 Java运行环境(支撑Hadoop生态)
ZooKeeper 3.4.6 分布式系统协调服务
Hadoop 2.7.2 分布式计算框架(依赖ZooKeeper)
Hive 2.2.0 大数据仓库工具
HBase 1.2.6 分布式NoSQL数据库
4. 数据目录规划

建议提前规划以下目录结构:

  • 数据目录/opt/zookeeper/data - 存储事务日志和快照

  • 日志目录/opt/zookeeper/logs - 存储运行日志

  • 配置目录/opt/zookeeper/conf - 配置文件存放

二、Windows IP映射(开发环境)

在Windows本地开发时,修改C:\Windows\System32\drivers\etc\hosts文件,添加相同的IP映射,方便通过SSH工具或浏览器访问集群节点。


第二章 基础环境配置

一、网络配置

1. 常用网络命令
reset                    # 清屏
ifconfig                 # 查看IP地址(若无效执行:yum install net-tools)
hostname                 # 查看当前主机名
hostnamectl set-hostname hadoop1    # 永久修改主机名
ping www.baidu.com       # 测试外网连通性
dhclient                 # 临时获取IP地址
2. 虚拟机联网模式选择
模式 适用场景 特点
桥接模式 与宿主机同网段 虚拟机获得独立IP,可被局域网直接访问
NAT模式 开发环境推荐 共享宿主机IP,通过端口映射实现访问
仅主机模式 生产环境隔离 完全隔离外部网络,确保系统安全
3. 永久联网配置(NAT模式)
# 进入网络配置目录
cd /etc/sysconfig/network-scripts/

# 编辑网卡配置文件(ens33为常见网卡名,根据实际情况调整)
vi ifcfg-ens33

# 修改以下关键配置
BOOTPROTO=static          # 改为静态IP
ONBOOT=yes               # 开机启动
IPADDR=172.16.206.16     # 设置静态IP
NETMASK=255.255.255.0    # 子网掩码
GATEWAY=172.16.206.1     # 网关地址
DNS1=8.8.8.8            # DNS服务器(Windows中ipconfig/all查看)

# 重启网络服务
systemctl restart network
4. 防火墙管理
systemctl start firewalld.service     # 启动防火墙
systemctl stop firewalld.service      # 关闭防火墙
systemctl disable firewalld           # 禁止开机启动(集群环境建议关闭)
firewall-cmd --state                  # 查看防火墙状态

二、时钟同步(NTP)

分布式系统中,时间同步是数据一致性的前提。ZooKeeper依赖时间戳进行事务排序,节点间时间偏差会导致严重问题。

1. 临时同步验证
# 向时间服务器同步(需安装ntpdate)
yum install ntpdate -y
ntpdate 192.168.1.128

# 看到类似以下输出表示成功:
# 5 Mar 22:26:19 ntpdate[8171]: step time server 192.168.1.128 offset 3045.561204 sec
2. 同步Internet时间
ntpdate time.nuri.net    # 亚洲NTP服务器
# 或
ntpdate cn.pool.ntp.org  # 中国NTP服务器池
4. 搭建集群内部NTP服务器

选一台节点作为时间服务器:

yum install ntp ntpdate -y

# 编辑NTP配置
vi /etc/ntp.conf

# 添加外部时间源
server 0.asia.pool.ntp.org
server 1.asia.pool.ntp.org
server 2.asia.pool.ntp.org
server 3.asia.pool.ntp.org

# 启动服务
systemctl start ntpd
systemctl enable ntpd

# 查看同步状态
ntpq -p

三、SSH免密登录

集群节点间需要频繁通信,配置免密登录是必要步骤。

# 1. 生成密钥对(所有节点执行)
ssh-keygen -t rsa
# 一路回车,密钥将保存在 ~/.ssh/ 目录

# 2. 查看生成的密钥
ls ~/.ssh/
# id_rsa(私钥)  id_rsa.pub(公钥)

# 3. 分发公钥到所有节点(包括自己)
ssh-copy-id hadoop1
ssh-copy-id hadoop2
ssh-copy-id hadoop3

# 4. 测试免密登录
ssh hadoop2
# 无需输入密码即成功

四、JDK安装与配置

# 1. 检查系统自带JDK
java -version
rpm -qa | grep java

# 2. 如有OpenJDK,建议卸载
rpm -e --nodeps java-1.8.0-openjdk*

# 3. 下载Oracle JDK 1.8
# 官网:http://www.oracle.com/technetwork/java/javase/downloads/index.html

# 4. 解压安装
tar -zxvf jdk-8uXXX-linux-x64.tar.gz -C /opt/

# 5. 配置环境变量
vi /etc/profile

# 添加以下内容
export JAVA_HOME=/opt/jdk1.8.0_XXX
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# 6. 生效配置
source /etc/profile
java -version

第三章 ZooKeeper核心原理

目录导航

  1. ZooKeeper概述

  2. ZooKeeper工作原理

  3. 数据一致性与Paxos算法

  4. ZooKeeper数据模型

  5. 其他重要概念

  6. ZooKeeper部署实践

Part 01 ZooKeeper概述

01、ZooKeeper简介

Apache ZooKeeper 是Apache软件基金会的顶级项目,官网描述为:

"致力于开发和维护实现高度可靠的分布式协调的开源服务器"

简单来说,ZooKeeper是一个为分布式应用提供一致性服务的协调工具。它的设计目标是将复杂且容易出错的分布式一致性服务封装起来,提供简单易用的接口。

典型应用场景

  • Hadoop:NameNode HA(高可用)、YARN资源调度

  • HBase:Master选举、元数据管理

  • Kafka:Broker注册、Topic分区Leader选举

  • SolrCloud:集群状态管理、配置分发

02、ZooKeeper术语体系

运行模式 节点数量 适用场景 生产可用性
单机模式 1个节点 本地学习、功能验证 ❌ 不推荐
伪分布式模式 1节点多进程 开发测试环境 ❌ 不推荐
全分布式模式 3+奇数节点 生产环境部署 ✅ 推荐
2. 集群角色详解

• Leader:负责处理所有写请求并协调事务
• Follower:处理读请求并参与投票选举
• Observer(可选):仅处理读请求,不参与投票

核心特性

  • 每个Server保存一份数据副本

  • 全局数据保持一致性视图

  • 更新请求按顺序执行(来自同一Client)

  • 数据更新具有原子性(要么全成功,要么全失败)

3. 事务与一致性

理解事务前,必须先理解一致性

一致性的核心是"看见"——谁能看见?能否看见?什么时候看见?

一致性级别分类

级别 定义 示例
强一致性 写入成功后,所有读取操作都能立即获取最新数据 ZooKeeper默认模式
弱一致性 写入成功后,部分读取操作可能无法立即获取最新数据 部分缓存系统
最终一致性 写入成功后,经过一定延迟后所有读取操作都能获取最新数据 DNS、Cassandra

ZooKeeper采用强一致性,确保分布式环境下的数据可靠性。

4. 原子广播机制(Zab协议)

Zab(ZooKeeper Atomic Broadcast)协议是ZooKeeper的核心,保证各Server间数据同步:

两种工作模式

  1. 恢复模式(Recovery):Leader选举 + 数据同步

  2. 广播模式(Broadcast):正常处理客户端请求

工作流程

zxid(事务ID)

  • 64位数字,高32位是epoch(Leader周期),低32位是递增计数

  • 每个事务proposal都携带zxid,保证全局顺序性

5. Znode节点类型

ZooKeeper的数据模型是层次化的命名空间,类似Linux文件系统,但每个节点称为Znode

Znode类型

类型 标识 生命周期 子节点
PERSISTENT 默认 永久有效,需手动删除 ✔️ 允许
EPHEMERAL -e 随会话结束自动删除 ✖️ 不允许
PERSISTENT_SEQUENTIAL -s 永久有效且自动编号 ✔️ 允许
EPHEMERAL_SEQUENTIAL -e -s 临时有效且自动编号 ✖️ 不允许

Part 02 ZooKeeper工作原理

01、数据写入流程(写请求处理)

详细步骤

  1. Client向Follower发送写请求

  2. Follower将请求转发给Leader

  3. Leader接收请求,发起投票(Proposal)

  4. 所有Follower进行投票(ACK)

  5. Leader统计投票,过半数同意则提交(Commit)

  6. Leader执行写入,通知Follower同步

  7. Follower完成同步后,返回结果给Client

02、Follower核心功能

Follower节点承担四项关键职责:

  1. 与Leader通信:发送PING心跳、REQUEST请求、ACK确认、REVALIDATE会话验证

  2. 处理Leader消息:解析并执行Leader指令

  3. 接收Client请求:读请求直接处理,写请求转发给Leader

  4. 返回结果:将操作结果返回给Client

Follower处理的消息类型

消息类型 功能描述
PING 心跳检测,保持连接活跃
PROPOSAL Leader发起的投票提案
COMMIT 确认事务提交
UPTODATE 通知同步已完成
REVALIDATE 返回会话验证结果
SYNC 触发强制数据同步

03、Leader选举流程

当集群启动或Leader崩溃时,Zab协议进入恢复模式,触发Leader选举:

我来先查看您提供的参考文章,了解其内容和风格。

获取网页

1 个网页

我已经查看了参考文章,它是一篇关于ZooKeeper分布式协调的教程文章,结构清晰,内容详实。参考您上传的PPT课件和参考文章的风格,我为您撰写一篇适合发布在CSDN的完整技术文章。


ZooKeeper分布式协调服务详解:从原理到实战部署

摘要:本文系统讲解ZooKeeper分布式协调服务的核心概念、工作原理、数据一致性保障机制,以及完整的集群部署实践。作为Hadoop生态系统的核心组件,掌握ZooKeeper是理解分布式系统架构的关键一步。

关键词:ZooKeeper、分布式协调、Zab协议、Paxos算法、集群部署


第一章 环境规划与准备

一、规划内容

在搭建ZooKeeper集群之前,完整的环境规划是成功的关键。分布式系统的复杂性决定了我们必须从拓扑结构、主机规划、软件版本到数据目录进行全方位设计。

1. 集群拓扑(Master/Slave架构)

ZooKeeper集群采用经典的主从架构:

表格

角色 数量 职责
Leader 1个 负责所有写操作,协调事务提交
Follower 多个 处理读请求,参与Leader选举和事务投票

核心特点

  • 每个Server保存一份完整的数据副本

  • 全局数据保持一致性视图

  • 写请求必须由Leader处理,读请求可分散到任意节点

2. 主机规划

/etc/hosts文件中配置IP映射,确保节点间可通过主机名通信:

bash

复制

# 编辑hosts文件
[root@hadoop1 ~]# vi /etc/hosts

# 添加以下配置
172.16.206.16   master
172.16.206.26   masterback
172.16.206.27   slave1
172.16.206.29   slave2
3. 软件规划清单

表格

软件 版本 说明
CentOS 7.x Linux操作系统
JDK 1.8 基础运行环境(Hadoop生态基于Java开发)
ZooKeeper 3.4.6 分布式协调服务核心
Hadoop 2.7.2 分布式计算框架(依赖ZK)
Hive 2.2.0 数据仓库工具
HBase 1.2.6 分布式列式数据库
4. 数据目录规划

建议提前规划以下目录结构:

  • 数据目录/opt/zookeeper/data - 存储事务日志和快照

  • 日志目录/opt/zookeeper/logs - 存储运行日志

  • 配置目录/opt/zookeeper/conf - 配置文件存放


二、Windows IP映射(开发环境)

在Windows本地开发时,修改C:\Windows\System32\drivers\etc\hosts文件,添加相同的IP映射,方便通过SSH工具或浏览器访问集群节点。


第二章 基础环境配置

一、网络配置

1. 常用网络命令

bash

复制

reset                    # 清屏
ifconfig                 # 查看IP地址(若无效执行:yum install net-tools)
hostname                 # 查看当前主机名
hostnamectl set-hostname hadoop1    # 永久修改主机名
ping www.baidu.com       # 测试外网连通性
dhclient                 # 临时获取IP地址
2. 虚拟机联网模式选择

表格

模式 适用场景 特点
桥接模式 与宿主机同网段 虚拟机拥有独立IP,局域网内可直接访问
NAT模式 推荐开发环境 共享宿主机IP,通过端口映射访问
仅主机模式 生产环境隔离 完全隔离外网,保证安全性
3. 永久联网配置(NAT模式)

bash

复制

# 进入网络配置目录
cd /etc/sysconfig/network-scripts/

# 编辑网卡配置文件(ens33为常见网卡名,根据实际情况调整)
vi ifcfg-ens33

# 修改以下关键配置
BOOTPROTO=static          # 改为静态IP
ONBOOT=yes               # 开机启动
IPADDR=172.16.206.16     # 设置静态IP
NETMASK=255.255.255.0    # 子网掩码
GATEWAY=172.16.206.1     # 网关地址
DNS1=8.8.8.8            # DNS服务器(Windows中ipconfig/all查看)

# 重启网络服务
systemctl restart network
4. 防火墙管理

bash

复制

systemctl start firewalld.service     # 启动防火墙
systemctl stop firewalld.service      # 关闭防火墙
systemctl disable firewalld           # 禁止开机启动(集群环境建议关闭)
firewall-cmd --state                  # 查看防火墙状态

生产环境建议:集群内部节点建议关闭防火墙,或通过firewall-cmd开放2181、2888、3888等ZooKeeper端口。


二、时钟同步(NTP)

分布式系统中,时间同步是数据一致性的前提。ZooKeeper依赖时间戳进行事务排序,节点间时间偏差会导致严重问题。

1. 临时同步验证

bash

复制

# 向时间服务器同步(需安装ntpdate)
yum install ntpdate -y
ntpdate 192.168.1.128

# 看到类似以下输出表示成功:
# 5 Mar 22:26:19 ntpdate[8171]: step time server 192.168.1.128 offset 3045.561204 sec
2. 同步Internet时间

bash

复制

ntpdate time.nuri.net    # 亚洲NTP服务器
# 或
ntpdate cn.pool.ntp.org  # 中国NTP服务器池
3. 定时自动同步

bash

复制

crontab -e
# 添加以下行,每分钟同步一次
*/1 * * * * /usr/sbin/ntpdate time.nuri.net
4. 搭建集群内部NTP服务器

选一台节点作为时间服务器:

bash

复制

yum install ntp ntpdate -y

# 编辑NTP配置
vi /etc/ntp.conf

# 添加外部时间源
server 0.asia.pool.ntp.org
server 1.asia.pool.ntp.org
server 2.asia.pool.ntp.org
server 3.asia.pool.ntp.org

# 启动服务
systemctl start ntpd
systemctl enable ntpd

# 查看同步状态
ntpq -p

其他节点指向该服务器同步即可。


三、SSH免密登录

集群节点间需要频繁通信,配置免密登录是必要步骤。

bash

复制

# 1. 生成密钥对(所有节点执行)
ssh-keygen -t rsa
# 一路回车,密钥将保存在 ~/.ssh/ 目录

# 2. 查看生成的密钥
ls ~/.ssh/
# id_rsa(私钥)  id_rsa.pub(公钥)

# 3. 分发公钥到所有节点(包括自己)
ssh-copy-id hadoop1
ssh-copy-id hadoop2
ssh-copy-id hadoop3

# 4. 测试免密登录
ssh hadoop2
# 无需输入密码即成功

四、JDK安装与配置

bash

复制

# 1. 检查系统自带JDK
java -version
rpm -qa | grep java

# 2. 如有OpenJDK,建议卸载
rpm -e --nodeps java-1.8.0-openjdk*

# 3. 下载Oracle JDK 1.8
# 官网:http://www.oracle.com/technetwork/java/javase/downloads/index.html

# 4. 解压安装
tar -zxvf jdk-8uXXX-linux-x64.tar.gz -C /opt/

# 5. 配置环境变量
vi /etc/profile

# 添加以下内容
export JAVA_HOME=/opt/jdk1.8.0_XXX
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# 6. 生效配置
source /etc/profile
java -version

第三章 ZooKeeper核心原理

目录导航

  1. ZooKeeper概述

  2. ZooKeeper工作原理

  3. 数据一致性与Paxos算法

  4. ZooKeeper数据模型

  5. 其他重要概念

  6. ZooKeeper部署实践


Part 01 ZooKeeper概述

01、ZooKeeper简介

Apache ZooKeeper 是Apache软件基金会的顶级项目,官网描述为:

"致力于开发和维护实现高度可靠的分布式协调的开源服务器"

简单来说,ZooKeeper是一个为分布式应用提供一致性服务的协调工具。它的设计目标是将复杂且容易出错的分布式一致性服务封装起来,提供简单易用的接口。

典型应用场景

  • Hadoop:NameNode HA(高可用)、YARN资源调度

  • HBase:Master选举、元数据管理

  • Kafka:Broker注册、Topic分区Leader选举

  • SolrCloud:集群状态管理、配置分发

02、ZooKeeper术语体系

1. 三种部署模式

表格

模式 节点数 适用场景 生产可用性
单机模式 1台 本地学习、功能测试 ❌ 不可用
伪分布式模式 1台(多进程) 开发测试 ❌ 不可用
全分布式模式 3+台(奇数) 生产环境 ✅ 推荐
2. 集群角色详解

plain

复制

┌─────────────────────────────────────────┐
│           ZooKeeper 集群架构            │
├─────────────────────────────────────────┤
│                                         │
│    ┌─────────┐      ┌─────────┐       │
│    │ Leader  │◄────►│Follower │       │
│    │  (主)   │      │  (从)   │       │
│    └────┬────┘      └────┬────┘       │
│         │                │              │
│         └────────┬───────┘              │
│                  ▼                      │
│           ┌─────────┐                  │
│           │Follower │                  │
│           │  (从)   │                  │
│           └─────────┘                  │
│                                         │
│  • Leader:处理所有写请求,协调事务      │
│  • Follower:处理读请求,参与投票选举    │
│  • Observer:(可选)只读,不参与投票    │
└─────────────────────────────────────────┘

核心特性

  • 每个Server保存一份数据副本

  • 全局数据保持一致性视图

  • 更新请求按顺序执行(来自同一Client)

  • 数据更新具有原子性(要么全成功,要么全失败)

3. 事务与一致性

理解事务前,必须先理解一致性

一致性的核心是"看见"——谁能看见?能否看见?什么时候看见?

一致性级别分类

表格

级别 定义 示例
强一致性 写成功后,所有读操作立即可见 ZooKeeper默认模式
弱一致性 写成功后,部分读操作可能不可见 某些缓存系统
最终一致性 写成功后,经过一段时间所有读操作可见 DNS、Cassandra

ZooKeeper采用强一致性,确保分布式环境下的数据可靠性。

4. 原子广播机制(Zab协议)

Zab(ZooKeeper Atomic Broadcast)协议是ZooKeeper的核心,保证各Server间数据同步:

两种工作模式

  1. 恢复模式(Recovery):Leader选举 + 数据同步

  2. 广播模式(Broadcast):正常处理客户端请求

工作流程

plain

复制

启动或Leader崩溃 ──► 进入恢复模式 ──► 选举新Leader
                                           │
                                           ▼
                              多数Follower完成状态同步
                                           │
                                           ▼
                              进入广播模式 ──► 处理客户端请求

zxid(事务ID)

  • 64位数字,高32位是epoch(Leader周期),低32位是递增计数

  • 每个事务proposal都携带zxid,保证全局顺序性

5. Znode节点类型

ZooKeeper的数据模型是层次化的命名空间,类似Linux文件系统,但每个节点称为Znode

Znode类型

表格

类型 标识 生命周期 子节点
PERSISTENT 默认 永久存在,需手动删除 允许
EPHEMERAL -e 随Session结束自动删除 ❌ 不允许
PERSISTENT_SEQUENTIAL -s 永久 + 自动编号 允许
EPHEMERAL_SEQUENTIAL -e -s 临时 + 自动编号 ❌ 不允许

Part 02 ZooKeeper工作原理

01、数据写入流程(写请求处理)

plain

复制

┌─────────┐     1.写请求      ┌─────────┐
│ Client  │ ────────────────► │Follower │
└─────────┘                   └────┬────┘
                                   │
                                   │ 2.转发
                                   ▼
                            ┌─────────┐
                            │ Leader  │
                            └────┬────┘
                                   │
                    ┌──────────────┼──────────────┐
                    │              │              │
                    ▼              ▼              ▼
              3.发起投票     4.Follower投票    5.统计结果
              (Proposal)      (ACK)           (Commit)
                    │              │              │
                    └──────────────┴──────────────┘
                                   │
                                   ▼
                            6.写入数据
                            7.通知Follower同步
                                   │
                                   ▼
                            ┌─────────┐
                            │Follower │──► 8.返回结果给Client
                            └─────────┘

详细步骤

  1. Client向Follower发送写请求

  2. Follower将请求转发给Leader

  3. Leader接收请求,发起投票(Proposal)

  4. 所有Follower进行投票(ACK)

  5. Leader统计投票,过半数同意则提交(Commit)

  6. Leader执行写入,通知Follower同步

  7. Follower完成同步后,返回结果给Client

02、Follower核心功能

Follower节点承担四项关键职责:

  1. 与Leader通信:发送PING心跳、REQUEST请求、ACK确认、REVALIDATE会话验证

  2. 处理Leader消息:解析并执行Leader指令

  3. 接收Client请求:读请求直接处理,写请求转发给Leader

  4. 返回结果:将操作结果返回给Client

Follower处理的消息类型

表格

消息类型 作用
PING 心跳检测,维持连接活性
PROPOSAL Leader发起的投票提案
COMMIT 事务提交确认
UPTODATE 同步完成通知
REVALIDATE 会话验证结果
SYNC 强制数据同步

03、Leader选举流程

当集群启动或Leader崩溃时,Zab协议进入恢复模式,触发Leader选举:

plain

复制

┌─────────────────────────────────────────────────────────┐
│                    Leader选举流程                        │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  1. 每个Server启动后进入LOOKING状态,推荐自己为Leader    │
│                                                         │
│  2. 交换投票信息:(myid, zxid)                           │
│     • myid:服务器唯一标识                               │
│     • zxid:最新事务ID(越大表示数据越新)                │
│                                                         │
│  3. 比较规则:                                           │
│     • 先比较zxid,zxid大的优先                           │
│     • zxid相同,比较myid,myid大的优先                   │
│                                                         │
│  4. 每轮投票后统计,获得半数以上选票的Server成为Leader     │
│                                                         │
│  5. 新Leader等待Follower连接,进行数据同步                │
│                                                         │
│  6. 同步完成后,集群进入广播模式,开始对外服务             │
│                                                         │
└─────────────────────────────────────────────────────────┘

选举示例(5节点集群):

  • 节点A(zxid=100, myid=1)、B(zxid=100, myid=2)、C(zxid=101, myid=3)

  • 第一轮投票:各投自己

  • 第二轮:节点发现C的zxid最大,改投C

  • C获得3票(过半),成为Leader

Part 03 数据一致性与Paxos算法

01、一致性保障原则

分布式系统中,保持数据一致性的核心思路:

如果各节点的初始状态一致,每个节点执行相同的操作序列,那么最终能得到一致的状态。

Master-Slave模式的问题

  • 单点Master存在性能瓶颈

  • Master故障会导致服务中断

  • 多Master又面临数据冲突

02、Paxos算法

Paxos算法是解决分布式一致性问题的经典方案,ZooKeeper的选举机制受其启发。

核心思想

┌────────────────────────────────────────┐
│           Paxos投票机制                │
├────────────────────────────────────────┤
│                                        │
│  • 同一时刻,只有一个写操作被批准       │
│  • 并发的写操作竞争选票                 │
│  • 获得过半数选票(>n/2)的写操作生效   │
│  • 未获胜的写操作进入下一轮投票         │
│                                        │
│  优势:任何节点挂掉(≤n/2)不影响一致性  │
│                                        │
└────────────────────────────────────────┘

为什么ZooKeeper集群通常为奇数?

集群规模 容错能力 最小存活节点 资源效率
3节点 1节点故障 2节点
4节点 1节点故障 3节点 较低(与3节点相同)
5节点 2节点故障 3节点
6节点 2节点故障 4节点 较低(与5节点相同)

Part 04 ZooKeeper数据模型

01、数据模型结构

ZooKeeper采用树形层次结构,与Linux文件系统类似

每个Znode包含三部分

05、Watcher监听机制

ZooKeeper提供事件监听功能,实现发布/订阅模式:

Session(会话)

  • stat:版本、权限、时间戳等元数据

  • data:关联的数据内容(最大1MB)

  • children:子节点列表

    # 1. 连接ZooKeeper服务器
    bin/zkCli.sh -server 192.168.58.99:2181
    
    # 2. 查看根节点子节点
    ls /
    ls /zookeeper
    
    # 3. 创建节点(必须携带数据)
    create /hello "world"
    create /app1 "application1"
    
    # 4. 获取节点数据和状态
    get /hello
    
    # 5. 创建临时节点(-e参数)
    create -e /temp "temporary_data"
    
    # 6. 创建顺序节点(-s参数)
    create -s /seq/item "data"
    # 实际创建:/seq/item0000000001
    
    # 7. 删除节点
    delete /hello        # 无子节点时
    deleteall /app1      # 递归删除(含子节点)
    
    # 8. 设置监听(watch)
    ls /hello true       # 监听子节点变化和删除
    get /hello true      # 监听数据变化和删除

    03、节点状态详解

    执行get /hello返回的完整信息:

    [zk: localhost:2181(CONNECTED) 1] get /hello
    world                                    # 节点数据
    cZxid = 0x1e00000075                     # 创建时的事务ID
    ctime = Tue Aug 21 23:42:08 PDT 2018     # 创建时间戳
    mZxid = 0x1e00000075                     # 最后修改的事务ID
    mtime = Tue Aug 21 23:42:08 PDT 2018     # 最后修改时间戳
    pZxid = 0x1e00000075                     # 最后子节点修改的zxid
    cversion = 0                             # 子节点版本号(修改次数)
    dataVersion = 0                          # 数据版本号
    aclVersion = 0                           # ACL版本号
    ephemeralOwner = 0x0                     # 临时节点所属会话ID(0x0表示持久节点)
    dataLength = 5                           # 数据长度
    numChildren = 0                          # 子节点数量

    04、zxid与Session机制

    zxid(ZooKeeper Transaction Id)

  • 64位整数,全局唯一且递增

  • 高32位:epoch(Leader周期号,每次选举+1)

  • 低32位:计数器(单调递增)

  • 作用:标识事务顺序,保证全局一致性

  • Client与Server间的TCP长连接

  • 会话有超时时间(默认tickTime * 2)

  • 会话结束会自动删除该Client创建的所有临时节点

  • 支持会话恢复(断线重连后恢复)

Watcher事件类型

NodeCreated:节点创建

NodeDeleted:节点删除

NodeDataChanged:数据修改

NodeChildrenChanged:子节点列表变化

Part 05 其他重要概念

01、Observer角色

为解决集群扩展性问题,ZooKeeper引入Observer

    特性 Leader Follower Observer
    处理读请求
    处理写请求 转发 转发
    参与投票
    参与选举

      优势

      增加Observer可线性扩展读性能

      不影响写性能(不参与投票)

      02、ZooKeeper核心特性总结

        • 适合读多写少的场景

      特性 说明
      顺序一致性 同一Client的请求按发送顺序执行
      原子性 事务要么全成功,要么全失败
      单一视图 无论连接哪个Server,数据视图一致
      可靠性 事务一旦提交,状态变更永久保留
      实时性 保证客户端最终能读到最新数据(非即时)

      03、ZooKeeper在Hadoop中的应用

      组件 应用场景
      HDFS HA NameNode主备切换、元数据同步
      YARN ResourceManager HA
      HBase Master选举、RegionServer注册、元数据管理
      Kafka Broker注册、Controller选举、Topic配置

      Part 06 ZooKeeper部署实践

      01、安装前准备

      Hadoop分布式集群环境搭建是入门者的常见痛点,环境配置问题往往导致集群无法正常启动。因此,正式部署前的规划至关重要

      02、配置文件详解

      ZooKeeper配置非常简单,各节点zoo.cfg内容相同,仅myid文件不同。

      03、集群操作命令

      # 1. 启动ZooKeeper(所有节点执行)
      [root@hadoop1 ~]# zkServer.sh start
      [root@hadoop2 ~]# zkServer.sh start
      [root@hadoop3 ~]# zkServer.sh start
      
      # 2. 查看启动状态
      [root@hadoop1 ~]# zkServer.sh status
      # 输出示例:
      # ZooKeeper JMX enabled by default
      # Using config: /opt/zookeeper/bin/../conf/zoo.cfg
      # Mode: follower    # 或 Mode: leader
      
      # 3. 停止服务
      zkServer.sh stop
      
      # 4. 重启服务
      zkServer.sh restart
      
      # 5. 前台启动(调试时使用)
      zkServer.sh start-foreground

      启动成功标志

      • 一个节点显示Mode: leader

      • 其他节点显示Mode: follower

      04、客户端连接测试

      # 连接集群
      zkCli.sh -server hadoop1:2181,hadoop2:2181,hadoop3:2181
      
      # 验证集群状态
      [zk: hadoop1:2181(CONNECTED) 0] ls /
      [zookeeper]
      
      [zk: hadoop1:2181(CONNECTED) 1] create /test "hello"
      Created /test
      
      [zk: hadoop1:2181(CONNECTED) 2] get /test
      hello

        总结

        本文从环境规划基础配置核心原理部署实践,系统性地讲解了ZooKeeper分布式协调服务

        掌握ZooKeeper是理解Hadoop生态系统乃至分布式系统架构的重要基础。建议读者在理解原理的基础上,动手搭建3节点集群,通过实际操作加深对分布式协调服务的理解。


          Logo

          腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

          更多推荐