Linux云计算 |【第五阶段】ARCHITECTURE-DAY5

主要内容:

搭建Zookeeper高可用集群、搭建分布式消息队列kafka、搭建高可用hadoop集群

一、Zookeeper 介绍

Zookeeper是一个开源分布式应用程序协调服务,主要用于解决分布式集群中应用系统的一致性问题。它能提供类似文件系统的目录节点树方式的数据存储,主要用途是维护和监控所存数据的状态变化,以实现对集群的管理。而Zookeeper 集群通常由多个 Zookeeper 服务器组成,以提供高可用性和数据一致性。

Zookeeper应用场景:

  • ① 集群分布式共享锁;
  • ② 集群统一命名服务;
  • ③ 分布式协调服务;
  • ④ 队列管理

1、Zookeeper 关键字

1)ZooKeeper Ensemble:

  • Zookeeper 集群通常称为 Ensemble。一个 Ensemble 至少需要三台服务器,以确保在单台服务器故障时仍能正常工作。

2)Leader 和 Follower:

  • 在 Ensemble 中,服务器分为 Leader 和 Follower。Leader 负责处理所有写请求,并将更改同步到 Followers。读请求可以由任何服务器处理。

3)Quorum:

  • 为了达成一致性,Zookeeper 使用 Quorum 机制。Quorum 是指 Ensemble 中大多数服务器(超过一半)的同意。例如,一个三台服务器的 Ensemble 需要两台服务器的同意。

4)ZNode:

  • Zookeeper 的数据存储在树形结构中,每个节点称为 ZNode。ZNode 可以是持久性的或临时性的。

2、Zookeeper 角色与选举

1)Leader:

职责:

  • 处理所有写请求。
  • 将写请求的更改同步到所有 Followers。
  • 管理集群的协调和同步。

特点:

  • 只有一个 Leader,负责所有写操作。
  • Leader 故障时,会触发新的 Leader 选举。

2)Follower:

职责:

  • 处理读请求。
  • 参与 Leader 选举过程。
  • 接收并应用 Leader 同步的写操作。

特点:

  • 可以有多个 Followers。
  • 在 Leader 故障时,参与新的 Leader 选举。

3)Observer(可选):

职责:

  • 处理读请求。
  • 不参与 Leader 选举和写操作的投票。

特点:

  • 用于扩展读性能,但不影响写操作的 Quorum。
  • 不参与 Leader 选举和写操作的投票。

选举 Leader 遵循过半原则:
Zookeeper 使用 ZAB(Zookeeper Atomic Broadcast)协议来保证数据一致性和 Leader 选举。以下是 Leader 选举的基本过程:

① 初始化:所有服务器启动时,状态为 LOOKING,表示它们正在寻找 Leader。
② 选举消息:每个 LOOKING 状态的服务器会向其他服务器发送选举消息,包含自己的 ID 和最新的 ZXID(事务 ID)。
③ 比较 ZXID:服务器收到选举消息后,会比较 ZXID。ZXID 较大的服务器优先成为 Leader。如果 ZXID 相同,则比较服务器 ID,ID 较大的服务器优先。
④ 投票:每个服务器会向其他服务器发送投票消息,表示支持某个服务器成为 Leader。如果一个服务器收到超过半数的投票支持,它将成为 Leader。
⑤ Leader 确认:成为 Leader 的服务器会向其他服务器发送确认消息,表示自己已成为 Leader。其他服务器收到确认消息后,状态变为 FOLLOWING,表示它们已成为 Follower。
⑥ Leader 服务:Leader 开始处理写请求,并将更改同步到 Followers。Followers 处理读请求,并接收 Leader 同步的写操作。

补充:

- Quorum:选举过程中需要多数服务器(Quorum)的同意。例如,一个三台服务器的 Ensemble 需要两台服务器的同意。
- ZXID:ZXID 是事务 ID,用于比较服务器的数据更新情况。ZXID 较大的服务器优先成为 -Leader。
- 服务器 ID:如果 ZXID 相同,则比较服务器 ID。ID 较大的服务器优先。

3、Zookeeper 高可用

Zookeeper 的高可用性是通过其分布式架构和 Leader 选举机制来实现的。以下是确保 Zookeeper 高可用性的关键点和配置建议:

网络配置:

  • 稳定网络:确保集群中各服务器之间的网络连接稳定,避免网络分区导致脑裂问题
  • 低延迟:尽量减少网络延迟,以提高数据同步和 Leader 选举的效率

硬件配置:

  • 高性能服务器:选择高性能的服务器,确保处理能力和存储容量满足需求
  • 冗余硬件:使用冗余硬件(如 RAID、双电源),提高硬件可靠性

Zookeeper 配置:

  • tickTime:基本时间单位(毫秒),建议根据网络延迟和性能需求调整
  • initLimit:Follower 初始化连接到 Leader 的超时时间,建议根据网络延迟调整
  • syncLimit:Follower 与 Leader 同步的超时时间,建议根据网络延迟调整
  • dataDir:数据存储目录,建议使用高性能存储设备
  • clientPort:客户端连接端口,建议使用默认端口 2181

监控和日志:

  • 监控工具:使用如 Zabbix、Prometheus监控 Zookeeper 集群的状态和性能

常见问题和解决方案

  1. 网络分区:确保网络稳定,使用冗余网络连接,避免单点故障。
  2. Leader 选举失败:检查网络连接和配置参数,确保 Quorum 机制正常工作。
  3. 数据一致性问题:使用 ZAB 协议确保数据一致性,定期备份数据。

4、Zookeeper 可伸缩扩展性原理与设计

在Observer出现之前,Zookeeper的伸缩性由Follower来实现,可以通过添加Follower节点的数量来保证Zookeeper服务的读性能,但是随着Follower节点数量的增加,Zookeeper服务的写性能受到了影响。当客户端提交一个请求,若是读请求,则由每台Server的本地副本数据库直接响应;若是写请求,需要通过一致性协议(Zab)来处理。

Zab协议规定:

来自客户端的所有写请求都要转发给集群中唯一的Leader,当Leader收到一个写请求时,就会发起一个提案进行投票,然后其它的Server对该提案进行投票,之后Leader收集投票的结果,当投票数据量过半时,Leader会向所有的Server发送一个通知消息;最后当客户端所连接的Server收到该消息时,会把该操作更新并对客户端的写请求做出回应。

写性能问题:

  • ① Zookeeper在上述协议中实际扮演了两个职能,一方面从客户端接收连接与操作请求,另一方面对操作结果进行投票,这两个职能在集群扩展的时候彼此制约;
  • ②  从Zab协议对写请求的处理过程中可以发现,增加Follower的数量,则增加了协议投票的过程压力,因为Leader节点必须等待集群中过半Server响应投票,是节点的增加使得部分计算机运行较慢,从而拖慢整个投票过程的可能性也随之提高,随着集群变大,写操作也会随之下降;

解决办法:

  • 为解决增加Follower的写性能问题,不得不在增加集群规模和保持较好吞吐性能之间进行权衡,为了打破这一耦合关系,引入了不参与投票的服务器Observer,Observer可以接受客户端的连接,并将写请求转发给Leader节点,但Leader节点不会要求Observer参加投票;
  • Observer的扩展,给Zookeeper的可伸缩性带来了全新的景象,加入很多Observer节点,无需担心严重影响写吞吐量,Observer提升读性能的可伸缩性,并且还提供了广域网能力;
  • 但Observer因为协议中的通知阶段,仍然与服务器的数量呈线性关系,但是这里的串行开销非常低,因此,可以认为在通知服务器阶段不会成为瓶颈。

5、Zookeeper 配置步骤

  • - Zookeeper安装目录:/usr/local/zookeeper
  • - Zookeeper配置目录:/usr/local/zookeeper/conf/

① 安装 Zookeeper

下载 Zookeeper 并解压到指定目录;配置环境变量 ZOOKEEPER_HOME 和 PATH

② 配置文件

在 Zookeeper 的配置目录中创建 zoo.cfg 文件,配置示例:

​tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888

tickTime:基本时间单位(毫秒)。
dataDir:数据存储目录。
clientPort:客户端连接端口。
initLimit:Follower 初始化连接到 Leader 的超时时间。
syncLimit:Follower 与 Leader 同步的超时时间。
server.X:指定每个服务器的地址和端口。

③ 创建 myid 文件

在 dataDir 目录下创建 myid 文件,内容为服务器的 ID(如 1、2、3)。

④ 启动 Zookeeper 服务

在每台服务器上启动 Zookeeper 服务:

$ZOOKEEPER_HOME/bin/zkServer.sh start

⑤ 验证集群状态:确保每台服务器的状态正确(Leader 或 Follower)

$ZOOKEEPER_HOME/bin/zkServer.sh status


Zookeeper集群部署示例:

zookeeper集群图例:

主机名称

IP地址

相关配置

角色

hadpoo1

192.168.1.50

最低配置2核4G

Observer

node-0001

192.168.1.51

最低配置2核4G

自动选举分配

node-0002

192.168.1.52

最低配置2核4G

自动选举分配

node-0003

192.168.1.53

最低配置2核4G

自动选举分配

建议:重启4台云主机hadoop1、node-000、,node-0002、node-0003(清理缓存)

步骤1:配置Zookeeper,并同步安装目录给其他主机(hadoop1操作)

# 拷贝云盘public/hadoop/zookeeper-3.4.13.tar.gz到hadoop1

[root@ecs-proxy hadoop]# scp zookeeper-3.4.13.tar.gz 192.168.1.50:/root

① 安装JAVA运行环境,并准备Zookeepeer安装目录(已完成)

[root@hadoop1 ~]# yum install -y java-1.8.0-openjdk-devel
[root@hadoop1 ~]# tar -zxf zookeeper-3.4.13.tar.gz
[root@hadoop1 ~]# mv zookeeper-3.4.13 /usr/local/zookeeper
[root@hadoop1 ~]# cd /usr/local/zookeeper/
[root@hadoop1 zookeeper]# ls

② 修改配置文件(/usr/local/zookeeper/conf/zoo.cfg)

补充:Zookeeper配置文件默认是单机模式(Standalone),如果组建集群,在配置文件末尾添加集群节点成员,即成为集群模式

[root@hadoop1 zookeeper]# cd conf/     //切换到配置目录
[root@hadoop1 conf]# cp zoo_sample.cfg zoo.cfg     //拷贝配置模板文件
[root@hadoop1 conf]# vim zoo.cfg
server.1=node-0001:2888:3888    &nbs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小安运维日记

Hey~ 感谢您的充电支持!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值