Kafka中节点故障挂了怎么办?

本文讲述了Follower挂起时,如何通过LEO(LogEndOffset)和HW(HighWatermark)处理数据同步问题。当follower恢复后,需删除高于HW的log,确保数据一致性。同样,Leader挂起时,isr会选择新Leader并同步至其他follower。

1.Follower挂了

在讲这个之前,首先介绍两个概念

1.LEO(Log End Offset)

每个副本的最后一个offset,LEO就是最新的offset+1

2.HW(High Watermark)

所有副本中最小的LEO.

如果follower挂了,首先会从isr中退出,在这期间Leader和Follower继续接收数据,等到follower恢复之后,首先找到hw,并将log文件高于HW的部分截取掉,从HW开始向Leader进行同步。

其实这里有个问题,就是为什么要将log文件高于HW部分截取掉,不直接向Leader进行同步,因为Leader始终是数据比较多的?

这里解释一下:如果leader挂了,数据最少的节点成为leader,那follower比Leader数据多,那多的数据来自哪里呢?因此,需要截取掉那一部分数据。

2.如果是Leader挂了呢。

isr中选取新的leader,其他的follower截取hw,然后向leader同步。

### 3.1 Kafka节点集群配置概述 Kafka节点集群的搭建涉及多个关键步骤,包括 Zookeeper 的部署、Kafka Broker 的配置、主题的管理以及节点间的数据同步。Kafka 依赖 Zookeeper 来管理集群的元数据,尤其是在 Kafka 3.0 以下版本中,Zookeeper 是必需的组件[^5]。在多节点集群中,每个 Kafka Broker 都需要配置其唯一的 `broker.id`,并确保它们能够通过网络互相通信。 ### 3.2 Zookeeper 配置 在多节点环境中,Zookeeper 通常部署为集群模式,以确保高可用性。每个 Zookeeper 节点需要创建数据目录,并在其中创建 `myid` 文件,分别写入 1、2、3 等唯一标识符。此外,所有节点的 `hosts` 文件需要配置 IP 地址与主机名的映射,确保 Zookeeper 节点之间能够通过主机名进行通信。Zookeeper 的配置文件 `zoo.cfg` 需要指定集群中所有节点的地址和端口,格式为 `server.id=host:port1:port2`,其中 `port1` 用于选举,`port2` 用于数据同步。 ```properties dataDir=/opt/zookeeper/data clientPort=2181 server.1=node1:2888:3888 server.2=node2:2888:3888 server.3=node3:2888:3888 ``` 启动 Zookeeper 服务后,可以通过 `zkServer.sh status` 查看其运行状态,确认是否为 Leader 或 Follower 角色。 ### 3.3 Kafka Broker 配置 Kafka Broker 的配置主要集中在 `server.properties` 文件中。每个 Broker 需要设置唯一的 `broker.id`,并指定 `listeners` 和 `advertised.listeners`,确保其他节点和客户端能够正确连接。`log.dirs` 指定 Kafka 数据的存储路径,`zookeeper.connect` 配置 Zookeeper 集群的连接地址。为了确保集群内部通信的稳定性,`replica.lag.time.ms` 和 `num.replica.fetchers` 等参数可以根据网络状况进行调整。 ```properties broker.id=1 listeners=PLAINTEXT://:9092 advertised.listeners=PLAINTEXT://node1:9092 log.dirs=/opt/kafka/logs zookeeper.connect=node1:2181,node2:2181,node3:2181 replica.lag.time.ms=10000 num.replica.fetchers=2 ``` 启动 Kafka 服务时,使用以下命令: ```bash /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties ``` ### 3.4 主题管理与数据同步 在多节点 Kafka 集群中,创建主题时需要指定分区数和副本因子。副本因子应小于或等于 Broker 的数量,以确保数据的高可用性。例如,以下命令创建一个名为 `test` 的主题,包含 3 个分区和 2 个副本: ```bash /opt/kafka/bin/kafka-topics.sh --create --topic test --bootstrap-server node1:9092,node2:9092,node3:9092 --partitions 3 --replication-factor 2 ``` Kafka 通过副本机制实现数据的冗余存储,确保即使某个 Broker 故障,数据仍然可用。副本的同步依赖于 `ISR`(In-Sync Replica)机制,只有与 Leader 副本保持同步的 Follower 副本才会被包含在 ISR 中。如果某个副本落后太多,会被移出 ISR,导致副本不可用。 ### 3.5 节点扩展与分区重新分配 当需要扩展 Kafka 集群时,可以使用 Kafka 提供的分区重新分配工具 `kafka-reassign-partitions.sh`。该工具支持三种工作模式:自动将数据迁移到新机器、自定义分区分配和迁移,以及增加复制因子。例如,以下命令可以将分区从旧节点迁移到新节点: ```bash /opt/kafka/bin/kafka-reassign-partitions.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --reassignment-json-file reassignment.json --execute ``` 其中,`reassignment.json` 文件定义了分区的重新分配策略。此外,在数据迁移期间,可以通过 `--throttle` 参数限制带宽使用,避免对集群性能造成过大影响。 ### 3.6 Kafka 集群清理与初始化 在学习或测试过程中,可能需要清除 Zookeeper 和 Kafka 的数据以重新初始化。Zookeeper 的数据清理可以通过删除其数据目录中的内容完成,而 Kafka 的数据清理则需要删除 `log.dirs` 指定的目录。此外,还需要清理 Kafka 的元数据,确保下次启动时不会出现数据冲突。 ```bash # 清理 Zookeeper 数据 rm -rf /opt/zookeeper/data/* # 清理 Kafka 数据 rm -rf /opt/kafka/logs/* ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值