主要内容:
搭建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 集群的状态和性能
常见问题和解决方案
- 网络分区:确保网络稳定,使用冗余网络连接,避免单点故障。
- Leader 选举失败:检查网络连接和配置参数,确保 Quorum 机制正常工作。
- 数据一致性问题:使用 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