开发者
资源
openEuler 下 Kafka 部署问题排查:从 ReplicaFetcherThread 报错到网络 SYN 泛洪
openEuler 下 Kafka 部署问题排查:从 ReplicaFetcherThread 报错到网络 SYN 泛洪
原创
发表于06/11
120

在某鲲鹏服务器(主机名暂隐,操作系统为 openEuler)上部署 Kafka 后,集群稳定运行一段时间,突然出现以下现象:

  • Kafka 日志中频繁报出 ReplicaFetcherThread 错误,提示 partition 拉取失败。
  • 伴随 UnknownServerException 和 Leader not available
  • 消费者组在短时间内发生多次重平衡(Rebalance),消费断断续续。
  • Kafka 本身没有崩溃,但副本同步严重滞后,消费卡顿。

2. 初步排查:磁盘与文件系统

2.1 磁盘空间检查

bash

df -h

发现磁盘 {根目录磁盘}(根目录)使用率 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 环境下的特定注意事项

  • ARM 架构兼容性:openEuler 对 ARM 的支持已成熟,但部分第三方内核模块(如某些网卡驱动)可能需要重新编译或调整参数。
  • 网卡驱动:建议使用华为提供的 hisi 或 hinic 驱动,避免使用非官方驱动。
  • 内核版本:openEuler 20.03/22.03 的某些版本可能存在 TCP 处理优化上的差异,建议升级到最新 SP 版本。

5. 排查方法详解(实战命令)

5.1 检查当前是否仍存在 SYN 泛洪

bash

dmesg -T | grep -i "SYN flooding" | tail -n 10
netstat -s | grep "SYN" | grep -i "drop"
ss -t state syn-recv | wc -l
  • syn-recv 状态连接数 > 1000 通常表明异常。

5.2 检查端口 {控制端口} 的丢包情况

bash

# 抓包分析三次握手
tcpdump -i any port {控制端口} -n -c 200

观察是否存在大量 [TCP Retransmission] 或只有 SYN 没有 SYN/ACK 的情况。

5.3 检查网卡物理层丢包

bash

ip -s link show

重点关注 RX errors 和 TX errors 是否为非零。

5.4 验证 Kafka 消费者组

bash

./kafka-consumer-groups.sh --bootstrap-server <broker> --group <group> --describe

观察 LAG 是否持续增长,以及 CURRENT-OFFSET 是否卡在某个位置。

6. 根本原因总结

现象根本原因
ReplicaFetcherThread 失败TCP 握手因 SYN 泛洪而失败,导致副本无法从 Leader 拉取数据
UnknownServerException底层网络通信异常,Kafka 无法正确处理请求
消费者组频繁重平衡消费者因连接超时被踢出,再加入,形成死循环
系统日志的 link not ready物理链路或网卡驱动不稳定,加剧了网络问题

7. 解决方案与预防措施

7.1 短期应急处理(在不停止服务的情况下)

增加半连接队列大小,缓解 SYN 泛洪影响:

bash

echo 65535 > /proc/sys/net/ipv4/tcp_max_syn_backlog

启用 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 长期根治方案

  1. 检查物理网络:更换网线、测试交换机端口,确保 link is ready
  2. 升级网卡驱动:使用华为官方驱动(hinic)或升级 openEuler 内核到最新版本。
  3. 启用 SYN Cookie 保护(默认已开启,无需额外操作)。
  4. 迁移 Kafka 端口:将监听端口从 {控制端口} 改为 9092 等默认端口,避开可能被攻击的端口。
  5. 引入负载均衡:在 Kafka 集群前使用 Nginx 或 HAProxy 作为代理,隔离外部直接访问。
  6. 监控与告警:对 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 环境下,底层网络驱动和内核参数的兼容性值得特别关注。通过系统日志(dmesgjournalctl)和抓包分析,我们可以快速定位到真实瓶颈,避免陷入 Kafka 自身配置的误区。

关键教训:当 Kafka 报出 ReplicaFetcherThread 和 UnknownServerException 时,请先检查磁盘、然后检查网络——因为很多时候,问题不在 Kafka,而在通往 Kafka 的路上。

收藏举报
Level 1
0
帖子
0
粉丝
0
获赞