Linux搭建zookeeper集群

注意:要在配置完kafka后才可进行zookeeper的配置,kafka的配置见博客:Linux配置kafka

zookeeper集群的介绍

ZooKeeper 集群是基于 Apache ZooKeeper 分布式协调服务构建的多节点部署模式,通过多个节点的协同工作,提供高可用、高可靠的分布式协调能力,广泛应用于分布式系统中,如分布式锁、服务注册与发现、配置管理等场景。

一、ZooKeeper 集群的核心作用

ZooKeeper 本身是一个分布式的、开源的协调服务,集群化部署主要解决单节点的单点故障问题,并通过分布式特性支持:

统一命名服务:为分布式系统中的资源(如服务、节点)提供唯一标识和查询能力。
配置管理:集中存储和同步分布式系统的配置信息,确保各节点配置一致。
分布式锁:通过临时节点等机制实现跨节点的互斥访问控制。
集群管理:监控节点状态(上线 / 下线),实现集群成员管理和故障检测。
分布式队列:协调多个节点的任务执行顺序。

二、ZooKeeper 集群的架构与角色

ZooKeeper 集群采用主从架构,节点分为以下角色:

Leader(领导者):
负责处理所有写请求(如创建节点、修改数据),并协调集群内的数据同步。
由集群通过选举机制产生,确保同一时刻只有一个 Leader。
Follower(追随者):
接收读请求,转发写请求给 Leader。
参与 Leader 选举,在 Leader 故障时可被选为新 Leader。
同步 Leader 的数据,保持集群数据一致性。
Observer(观察者,可选):
仅处理读请求,不参与 Leader 选举和写操作投票,减轻集群压力。
适用于读多写少的场景,可扩展集群的读性能。

三、集群节点数量与容错性

ZooKeeper 集群的节点数量通常配置为奇数(如 3、5、7 个节点),这是因为其选举机制依赖多数派原则(超过半数节点同意):

容错能力:集群最多可容忍 (n-1)/2 个节点故障(n 为总节点数,且为奇数)。
例如:3 节点集群最多容忍 1 个节点故障,5 节点集群最多容忍 2 个节点故障。
原因:奇数节点可避免投票僵局(如 2 节点集群,1 个故障后无法达成多数派)。

四、ZooKeeper 集群的工作原理

数据一致性模型:
采用 ZAB(ZooKeeper Atomic Broadcast,原子广播协议) 保证数据一致性,类似 Paxos 算法的简化版。
写操作流程:Client → Follower(转发)→ Leader(处理并广播)→ 多数 Follower 确认 → Leader 反馈 Client,此时数据生效。
Leader 选举:
集群启动或 Leader 故障时,所有节点进入选举状态,通过比较 myid(节点唯一标识) 和 zxid(事务 ID,反映数据版本) 选出新 Leader。
最终获得超过半数选票的节点成为 Leader,其余节点作为 Follower 或 Observer。
数据存储:
集群中所有节点(Leader/Follower)存储相同的内存数据树(Data Tree),数据以节点(ZNode)形式组织,类似文件系统的目录结构。
每个写操作会生成全局唯一的 zxid,确保操作的顺序性。

五、ZooKeeper 集群的典型应用场景

Hadoop 生态:作为 HDFS 的 NameNode 高可用协调器、YARN 的资源管理节点故障检测。
分布式数据库:如 MySQL 主从切换的状态同步、MongoDB 分片集群的元数据管理。
微服务架构:服务注册与发现(如 Dubbo 框架)、配置中心(动态更新服务配置)。
分布式锁:通过创建临时有序节点实现公平锁,避免并发冲突。

六、ZooKeeper 集群的部署要点

节点数量:建议 3、5 或 7 个(奇数),根据集群规模和容错需求选择。
配置文件:每个节点需配置 zoo.cfg,指定集群节点列表(格式:server.id=host:port1:port2,其中 port1 为数据同步端口,port2 为选举端口)。
myid 文件:每个节点在 dataDir 目录下创建 myid 文件,内容为该节点的唯一 ID(与 zoo.cfg 中的 server.id 对应)。
启动顺序:可依次启动所有节点,自动完成 Leader 选举;关闭时建议先关闭 Leader,再关闭 Follower。

部署过程

jdk 安装

注意:部署zookeeper一定要有jdk,我这里三台机子都有,可以输入java -version进行验证

jdk17版本下载

下载这个版本
配置jdk


tar -zxvf jdk-17.0.12_linux-x64_bin.tar.gz
mkdir -p /usr/lib/java17
# 移到刚刚创建的目录下
mv jdk-17.0.12 /usr/lib/java17/
# 配置环境变量
vi /etc/profile
# 文件末尾添加
export JAVA_HOME=/usr/lib/java17/jdk17.0.2  # 根据实际路径
export PATH=$JAVA_HOME/bin:$PATH

# 执行
source /etc/profile
echo $JAVA_HOME  # 验证输出是否正确

输入java -version验证
在这里插入图片描述

zookeeper部署

这是zookeeper的下载地址zookeeper下载
我下载的版本是3.4.6

# 解压
tar -zxvf zookeeper-3.4.6.tar.gz -C /opt/
# 改名
mv zookeeper-3.4.6 zookeeper
# 配置环境变量
export ZOOKEEPER_HOME=/opt/zookeeper
# 直接添加在kafka后面
export PATH=$KAFKA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH 
# 执行使配置生效
source /etc/profile

注意:因为我们准备了三台机子,将master的配置复制到其他两台,这里的master、slave1、slave2是我三台机子的主机名

# 复制到第一台
scp -r zookeeper/ root@slave1:$PWD
# 复制到第二台
scp -r zookeeper/ root@slave2:$PWD

在这里插入图片描述
slave1与slave2:
验证看看是否传入成功

cd /opt/zookeeper
ls

在这里插入图片描述
master、slave1、slave2都进行如下操作:

# 进入conf目录
cd conf
ls
# 对原本的zoo_sample.cfg 进行备份
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
# 修改这一块,其他内容保持不变
dataDir=/var/zookeeper
# 创建如下目录
mkdir /var/zookeeper
cd /var/zookeeper/
vi myid
# master的myid中填入1,slave1的myid中填入2、slave2的myid中填入3

在master中操作:

cd /opt/zookeeper/conf
vi zoo.cfg
# 在末尾添加如下内容:
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888

# 将配置复制到slave1中
scp zoo.cfg root@slave1:$PWD
# 将配置复制到slave2中
scp zoo.cfg root@slave2:$PWD

在slave1、slave2也进行环境变量的配置

vi /etc/profile
export ZOOKEEPER_HOME=/opt/zookeeper
# 直接接在后面
export PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH
# 使配置生效
source /etc/profile

接下来按顺序依次启动
依次是:master、slave1、slave2

zkServer.sh start
zkServer.sh status

master:
在这里插入图片描述
slave1:
在这里插入图片描述
slave2:
在这里插入图片描述
部署完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值