Broker 的地址可以怎么填
部署 kafka_exporter 的时候,填写 consul 提供的 Kafka broker 内部域名,可以正常获取监控数据。
消费端连接 kafka 集群时,也不必要填写所有的 broker 地址,确保至少填 3 台 broker 的地址就行。
磁盘空间不足
单副本强行摘盘,丢失 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)碰到的问题
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-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}
然后重启服务就好了。
用备份主机替换故障主机,副本没有主动拉取的问题
已确认:
- kafka-logs 目录都已清空。
- broker.id 一致
最终定位到问题是 主机时间未同步。