如何在本地Kafka副本模拟延迟并强制其退出ISR?
强制触发Kafka副本退出ISR的本地测试方案
针对本地部署的3节点Kafka集群,无需断网即可强制触发副本退出ISR,以下是几种可靠的实操方法:
方法1:临时调小同步超时阈值并占用副本节点资源
- 动态修改目标broker的同步超时参数,将
replica.lag.time.max.ms设为极小值(比如100ms),让副本只要短暂跟不上同步就会被移出ISR:kafka-configs.sh --bootstrap-server localhost:9092 --alter --entity-type brokers --entity-id <目标BrokerID> --add-config replica.lag.time.max.ms=100 - 在目标broker所在机器执行资源占用命令,让它无法及时处理同步请求:
# 占用磁盘IO,持续10秒左右即可 dd if=/dev/zero of=/tmp/temp_file bs=1G count=1 & sleep 10 && kill $! - 用
kafka-topics.sh查看ISR状态,确认副本已被移出:kafka-topics.sh --describe --topic <你的测试Topic> --bootstrap-server localhost:9092 - 测试完成后,恢复原配置:
kafka-configs.sh --bootstrap-server localhost:9092 --alter --entity-type brokers --entity-id <目标BrokerID> --delete-config replica.lag.time.max.ms
方法2:通过复制限流强制让副本掉队
利用Kafka的复制限流功能,把目标副本的同步速率降到几乎为0,使其无法跟上leader的消息生产:
- 给目标broker添加限流配置,指定要限流的副本和速率:
# 格式为"topic名-分区号:副本ID",多个用逗号分隔 kafka-configs.sh --bootstrap-server localhost:9092 --alter --entity-type brokers --entity-id <目标BrokerID> --add-config follower.replication.throttled.replicas=<test-topic-0:2>,replica.replication.throttled.rate=1 - 向topic生产少量消息,等待几秒后查看ISR,副本会因同步滞后被移出。
- 测试结束后移除限流配置:
kafka-configs.sh --bootstrap-server localhost:9092 --alter --entity-type brokers --entity-id <目标BrokerID> --delete-config follower.replication.throttled.replicas,replica.replication.throttled.rate
方法3:暂停目标Broker进程
直接暂停目标broker的Kafka进程,使其完全无法与leader通信,达到退出ISR的效果:
- 找到目标broker的Kafka进程PID:
ps aux | grep kafka | grep <目标BrokerID> - 暂停进程:
kill -STOP <Kafka进程PID> - 等待
replica.lag.time.max.ms时长后,查看ISR确认副本已被移出。 - 测试完成后恢复进程:
kill -CONT <Kafka进程PID>
注意事项
- 所有操作前请记录原集群配置,测试后务必恢复,避免影响后续正常使用。
- 优先使用动态配置修改(方法1、2),避免直接启停进程带来的集群波动。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

