Kafka 踩坑小结

2022/08/11

Broker 的地址可以怎么填

部署 kafka_exporter 的时候,填写 consul 提供的 Kafka broker 内部域名,可以正常获取监控数据。

消费端连接 kafka 集群时,也不必要填写所有的 broker 地址,确保至少填 3 台 broker 的地址就行。

磁盘空间不足

__consumer_offset 目录占用空间过多的问题

单副本强行摘盘,丢失 LogSize 记录

消费者客户端报错

error initializing the kafka reader for partition 97 of uplog_baiduxhs: [1] Offset Out Of Range: the requested offset is outside the range of offsets maintained by the server for the given topic/partition

通过 Kafka Manager 观察

Partition 97 的 Consumer Offset 比 LogSize 要大, 然后 partition 97 一直没有被消费

回忆之前该 Kafka 集群之前有处理过故障。

其中一台 broker 因为磁盘故障,导致 kafka 重启时卡住了,同时有其他 broker 在停机换磁盘,导致这个分区的 ISR 全掉了。

配置中我们没有允许脏副本选举,所以这种情况下,消费和生产都会失败。紧急情况下,我们修改 kafka 配置文件中的 log.dirs 将故障盘目录剔除,然后重启成功。很快消费堆积降下去了,也没有告警了,然而没有注意到这个 Partition 97 的日志副本也被一并丢弃了,所以其 LogSize 从新开始计数,也就导致上面出现的现象。

处理办法:

为了确保新到来的消息都能被正确消费,新建一个 topic ,然后把消费和生产都转到新的 topic 上。

监控需要改进:

现有对 Lag 值的监控是定了 400k 作为上限,而对于负数 Lag 值不会有告警。当前异常就会导致一个极小的负数 Lag 值。

部署 Kafka-Manager(CMAK)碰到的问题

CMAK (Kafka-manager) 一点坑

Kafka-Manager 的 Generate Partition Assignments 别乱用

这个功能就是将 topic 的所有分区,均分到你选定的所有 broker 上。

其自动生成的结果就是简单的重新分配,不会考虑现有分区分布。所有应用这个重分配计划时会造成无法预估的大量副本迁移,严重的可导致整个集群无法正常工作。

如果不小心应用了自动生成的重分配计划,应登录 zookeeper 操作终止操作:

/opt/zookeeper/bin/zkCli.sh \
  -server $ZKHOST:2181/kafka \
  delete /admin/reassign_partitions

Broker 强行下线,ISR 中掉出的副本始终处于正在同步的状态

理想的方案是,再起一台机器,配置被下线的机器用过的 broker.id ,上线后完成同步,然后走正常的 broker 退役流程:迁出副本,然后停止 broker 。

极端情况下,补充不了新的机器,要维持足够的副本数,提高集群的可靠性。

Kafka 调整 topic 副本数

Kafka-Manager 碰到删除 topic 失败的问题

Kafka-Manager 删除 topic 失败的问题

Kafka-Manager broker 监控失效的问题

只要 Broker 端开启了 JMX 端口,Kafka-Manager 开启了 Enable JMX Polling 功能

在 Kafka-Manager 的 Brokers 页面就能观察到 Bytes In / Bytes Out 指标。

但是目前的问题是 broker 明明在正常分发消息带宽指标却一直为 0 。

查看 Kafka-Manager 端报错如下

简单搜索下找到一个解决办法

Kafka 服务的启动配置里原本是 -Djava.rmi.server.hostname={ip}

改成 -Dcom.sun.management.jmxremote.host={ip}

然后重启服务就好了。

用备份主机替换故障主机,副本没有主动拉取的问题

已确认:

最终定位到问题是 主机时间未同步