在某鲲鹏服务器(主机名暂隐,操作系统为 openEuler)上部署 Kafka 后,集群稳定运行一段时间,突然出现以下现象:
- Kafka 日志中频繁报出
ReplicaFetcherThread 错误,提示 partition 拉取失败。 - 伴随
UnknownServerException 和 Leader not available。 - 消费者组在短时间内发生多次重平衡(Rebalance),消费断断续续。
- Kafka 本身没有崩溃,但副本同步严重滞后,消费卡顿。
2. 初步排查:磁盘与文件系统
2.1 磁盘空间检查
bash
发现磁盘 {根目录磁盘}(根目录)使用率 52%,数据盘 {数据盘} 使用率 10%,磁盘空间充足,排除磁盘写满导致写入失败的可能。
2.2 文件系统重挂载日志
系统日志中出现 EXT4-fs ({根目录磁盘}): re-mounted. Opts: (null)。经时间戳确认(发生在数周前),这是系统启动时的正常重挂载行为,不是当前故障原因。
3. 深入定位:系统日志与网络层分析
让我们把目光从 Kafka 自身转移到底层操作系统和网络。查看系统日志(journalctl),发现了令人警觉的信息:
3.1 TCP SYN 泛洪攻击
bash
关键点:端口 {控制端口} 正在遭受大量伪造的 SYN 包攻击。该端口正是 Kafka 内部用于控制器通信的端口(根据实际配置,也可能是自定义的监听端口)。当半连接队列被占满,正常的副本同步请求(ReplicaFetcherThread)无法完成 TCP 三次握手,导致拉取失败并报 UnknownServerException。
3.2 网卡链路不稳定
bash
这表明网卡({网卡接口名}、{另一网卡接口名})在启动时未就绪,可能存在物理链路问题(网线松动、交换机端口故障)或驱动兼容性问题。
3.3 内核模块警告
bash
鲲鹏服务器通常使用特定厂商网卡,加载非官方驱动可能引入不稳定性。
3.4 连接跟踪日志
tcq 和 skb_defer 等日志也暗示了网络栈在处理连接时存在异常。
4. 鲲鹏 + openEuler 环境下的特定注意事项
- ARM 架构兼容性:openEuler 对 ARM 的支持已成熟,但部分第三方内核模块(如某些网卡驱动)可能需要重新编译或调整参数。
- 网卡驱动:建议使用华为提供的
hisi 或 hinic 驱动,避免使用非官方驱动。 - 内核版本:openEuler 20.03/22.03 的某些版本可能存在 TCP 处理优化上的差异,建议升级到最新 SP 版本。
5. 排查方法详解(实战命令)
5.1 检查当前是否仍存在 SYN 泛洪
bash
syn-recv 状态连接数 > 1000 通常表明异常。
5.2 检查端口 {控制端口} 的丢包情况
bash
观察是否存在大量 [TCP Retransmission] 或只有 SYN 没有 SYN/ACK 的情况。
5.3 检查网卡物理层丢包
bash
重点关注 RX errors 和 TX errors 是否为非零。
5.4 验证 Kafka 消费者组
bash
观察 LAG 是否持续增长,以及 CURRENT-OFFSET 是否卡在某个位置。
6. 根本原因总结
7. 解决方案与预防措施
7.1 短期应急处理(在不停止服务的情况下)
增加半连接队列大小,缓解 SYN 泛洪影响:
bash
启用 iptables 规则限制 SYN 速率(仅允许可信 IP):
bash
如果怀疑是网卡驱动问题,重新加载驱动:
bash
7.2 长期根治方案
- 检查物理网络:更换网线、测试交换机端口,确保
link is ready。 - 升级网卡驱动:使用华为官方驱动(
hinic)或升级 openEuler 内核到最新版本。 - 启用 SYN Cookie 保护(默认已开启,无需额外操作)。
- 迁移 Kafka 端口:将监听端口从 {控制端口} 改为 9092 等默认端口,避开可能被攻击的端口。
- 引入负载均衡:在 Kafka 集群前使用 Nginx 或 HAProxy 作为代理,隔离外部直接访问。
- 监控与告警:对
systemd-journal 中的 SYN flooding 关键词和 ReplicaFetcherThread 错误进行实时告警。
7.3 针对鲲鹏 openEuler 的特别建议
- 配置内核参数:
net.ipv4.tcp_tw_recycle = 0(ARM 环境一般不启用)。 - 关闭 IPv6(如果无需使用):
sysctl -w net.ipv6.conf.all.disable_ipv6=1。 - 使用 sysctl 保留调整:编辑
/etc/sysctl.conf,使 tcp_max_syn_backlog 等参数重启后生效。
8. 总结
本次 Kafka 故障并非 Kafka 本身的问题,而是由于 网络层的 SYN 泛洪攻击 和 网卡链路不稳定 导致的连锁反应。在鲲鹏 + openEuler 环境下,底层网络驱动和内核参数的兼容性值得特别关注。通过系统日志(dmesg、journalctl)和抓包分析,我们可以快速定位到真实瓶颈,避免陷入 Kafka 自身配置的误区。
关键教训:当 Kafka 报出 ReplicaFetcherThread 和 UnknownServerException 时,请先检查磁盘、然后检查网络——因为很多时候,问题不在 Kafka,而在通往 Kafka 的路上。
在某鲲鹏服务器(主机名暂隐,操作系统为 openEuler)上部署 Kafka 后,集群稳定运行一段时间,突然出现以下现象:
ReplicaFetcherThread错误,提示 partition 拉取失败。UnknownServerException和Leader not available。2. 初步排查:磁盘与文件系统
2.1 磁盘空间检查
bash
发现磁盘
{根目录磁盘}(根目录)使用率 52%,数据盘{数据盘}使用率 10%,磁盘空间充足,排除磁盘写满导致写入失败的可能。2.2 文件系统重挂载日志
系统日志中出现
EXT4-fs ({根目录磁盘}): re-mounted. Opts: (null)。经时间戳确认(发生在数周前),这是系统启动时的正常重挂载行为,不是当前故障原因。3. 深入定位:系统日志与网络层分析
让我们把目光从 Kafka 自身转移到底层操作系统和网络。查看系统日志(
journalctl),发现了令人警觉的信息:3.1 TCP SYN 泛洪攻击
bash
tcq: request_sock_TCP: Possible SYN flooding on port {控制端口}. Sending cookies.关键点:端口 {控制端口} 正在遭受大量伪造的 SYN 包攻击。该端口正是 Kafka 内部用于控制器通信的端口(根据实际配置,也可能是自定义的监听端口)。当半连接队列被占满,正常的副本同步请求(ReplicaFetcherThread)无法完成 TCP 三次握手,导致拉取失败并报
UnknownServerException。3.2 网卡链路不稳定
bash
IP6: ADDRCONF(NETDEV_UP): {网卡接口名}: link is not ready IP6: ADDRCONF(NETDEV_UP): {另一网卡接口名}: link is not ready这表明网卡(
{网卡接口名}、{另一网卡接口名})在启动时未就绪,可能存在物理链路问题(网线松动、交换机端口故障)或驱动兼容性问题。3.3 内核模块警告
bash
{特定内核模块}: loading out-of-tree module taints kernel.鲲鹏服务器通常使用特定厂商网卡,加载非官方驱动可能引入不稳定性。
3.4 连接跟踪日志
tcq和skb_defer等日志也暗示了网络栈在处理连接时存在异常。4. 鲲鹏 + openEuler 环境下的特定注意事项
hisi或hinic驱动,避免使用非官方驱动。5. 排查方法详解(实战命令)
5.1 检查当前是否仍存在 SYN 泛洪
bash
syn-recv状态连接数 > 1000 通常表明异常。5.2 检查端口 {控制端口} 的丢包情况
bash
# 抓包分析三次握手 tcpdump -i any port {控制端口} -n -c 200观察是否存在大量
[TCP Retransmission]或只有SYN没有SYN/ACK的情况。5.3 检查网卡物理层丢包
bash
重点关注
RX errors和TX errors是否为非零。5.4 验证 Kafka 消费者组
bash
观察
LAG是否持续增长,以及CURRENT-OFFSET是否卡在某个位置。6. 根本原因总结
7. 解决方案与预防措施
7.1 短期应急处理(在不停止服务的情况下)
增加半连接队列大小,缓解 SYN 泛洪影响:
bash
启用 iptables 规则限制 SYN 速率(仅允许可信 IP):
bash
iptables -A INPUT -p tcp --dport {控制端口} -m limit --limit 10/s --limit-burst 20 -j ACCEPT iptables -A INPUT -p tcp --dport {控制端口} -j DROP如果怀疑是网卡驱动问题,重新加载驱动:
bash
modprobe -r {网卡驱动名} && modprobe {网卡驱动名}7.2 长期根治方案
link is ready。hinic)或升级 openEuler 内核到最新版本。systemd-journal中的 SYN flooding 关键词和ReplicaFetcherThread错误进行实时告警。7.3 针对鲲鹏 openEuler 的特别建议
net.ipv4.tcp_tw_recycle = 0(ARM 环境一般不启用)。sysctl -w net.ipv6.conf.all.disable_ipv6=1。/etc/sysctl.conf,使tcp_max_syn_backlog等参数重启后生效。8. 总结
本次 Kafka 故障并非 Kafka 本身的问题,而是由于 网络层的 SYN 泛洪攻击 和 网卡链路不稳定 导致的连锁反应。在鲲鹏 + openEuler 环境下,底层网络驱动和内核参数的兼容性值得特别关注。通过系统日志(
dmesg、journalctl)和抓包分析,我们可以快速定位到真实瓶颈,避免陷入 Kafka 自身配置的误区。关键教训:当 Kafka 报出
ReplicaFetcherThread和UnknownServerException时,请先检查磁盘、然后检查网络——因为很多时候,问题不在 Kafka,而在通往 Kafka 的路上。