定制制作网站哪家好,合肥网站优化价格,大连网站建设过程,怎么开通网站kafka部分partition的leader-1修复方案整理 1. 背景说明2. 修复测试2.1 创建正常的topic并验证生产和消费2.2 停止kafka模拟leader-12.3 修复parition2.4 修复完成验证生产消费是否恢复 3. 疑问和思考3.1 kafka在进行数据消费时#xff0c;如果有partition的leader-1#xff… kafka部分partition的leader-1修复方案整理 1. 背景说明2. 修复测试2.1 创建正常的topic并验证生产和消费2.2 停止kafka模拟leader-12.3 修复parition2.4 修复完成验证生产消费是否恢复 3. 疑问和思考3.1 kafka在进行数据消费时如果有partition的leader-1进行数据生产和消费时kafka是否会自动剔除对应的parition 4. 参考文档 1. 背景说明
部分环境发现支撑kafka部分topic的被设置成单副本。当出现单机故障时部分topic-partition出现leader-1对应的partition无法正常读写数据。特别是kafka内置的topic __consumer_offsets__consumer_offsets 是记录topic的消费组数据消费的相关信息如果出现了该问题就会导致部分topic的消费组无法正常进行数据消费。
本文记录在工作中遇到的一次修复经历并进行整理
2. 修复测试
2.1 创建正常的topic并验证生产和消费
获取kafka的配置zk链接信息以及leader-1的topic-partition、和每个kafka的id
# 获取kafka的id
cd /usr/local/services/kafka_2.11-1.1.1
cat config/server.properties |grep broker.id# 获取kafka的zk地址
cd /usr/local/services/kafka_2.11-1.1.1
cat config/server.properties |grep zookeeper创建一个单parition4副本的topic便于后续测试
# 创建topic
./bin/kafka-topics.sh --create --zookeeper $zk --topic test5 --replication-factor 4 --partitions 1验证topic的读写情况
# 控制台1创建数据消费者
./bin/kafka-console-consumer.sh --topic test5 --group test5 --bootstrap-server localhost:9092 --from-beginning# 控制台2创建数据生产者
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test52.2 停止kafka模拟leader-1
停止部分kafka节点使得__consumer_offsets的partition:41为-1正好记录test5的数据消费信息
# 停止相关kafka节点的计划任务
crontab -e# 停止相关kafka进程ps -ef|grep kafkakill -9# 获取zk信息
# 检查集群的topic信息
cd /usr/local/services/kafka_2.11-1.1.1
zkxx.xx.xx.xx:2181/kafka
bin/kafka-topics.sh --zookeeper $zk --describe|grep __consumer_offsets继续测试test5的数据生产和消费此时test5无法消费数据
2.3 修复parition
由于__consumer_offsets的partition:41test5的消费记录保存在该paritition中单副本并且对应的节点已经宕机因此不能通过调整副本的方式进行修复。需要调整zk中的元数据重新给__consumer_offsets的partition:41配置isr和leader让它恢复正常
# 获取zk信息
cd /usr/local/services/kafka_2.11-1.1.1
zkxx.xx.xx.xx:2181/kafka# 登录zk节点并进入zk
cd /data/zookeeper-3.4.14/bin
./zkCli.sh# 获取__consumer_offsets的partition:41的配置信息
get /kafka/brokers/topics/__consumer_offsets/partitions/41/state# 调整__consumer_offsets的partition:41的配置信息选择0作为leader
set /kafka/brokers/topics/__consumer_offsets/partitions/41/state {controller_epoch:15,leader:0,version:1,leader_epoch:177,isr:[0]}get /kafka/brokers/topics/__consumer_offsets/partitions/41/state# 登录0号kafka节点进一步调整replica信息调整为0
cd /usr/local/services/kafka_2.11-1.1.1vim replication-factor.json
{version:1,partitions:[{topic:__consumer_offsets,partition:41,replicas:[0],log_dirs:[any]}]}
# 执行调整命令
./bin/kafka-reassign-partitions.sh --zookeeper $zk --reassignment-json-file replication-factor.json --execute# 查看调整进度
./bin/kafka-reassign-partitions.sh --zookeeper $zk --reassignment-json-file replication-factor.json --verify说明调整完成此时应该是leader:0 ,replica: [0], isr: [0]
# 获取zk信息
# 检查集群的topic信息
cd /usr/local/services/kafka_2.11-1.1.1
zkxx.xx.xx.xx:2181/kafka
bin/kafka-topics.sh --zookeeper $zk --describe|grep __consumer_offsets2.4 修复完成验证生产消费是否恢复
继续验证topic的生产和消费已经恢复正常
# 控制台1创建数据消费者
./bin/kafka-console-consumer.sh --topic test5 --group test5 --bootstrap-server localhost:9092 --from-beginning# 控制台2创建数据生产者
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test53. 疑问和思考
3.1 kafka在进行数据消费时如果有partition的leader-1进行数据生产和消费时kafka是否会自动剔除对应的parition
不会。
在这里将kafka的topic-parition设置成2种类型。
业务topic业务数据进行生产和消费内置topic __consumer_offsets记录业务topic的消费的offset信息
两者逻辑相同。
数据进行生产时会通过的方式 hash(key) / partition数量也可以指定partition到对应的partition 消费者跟对应的paritition对应才能保证数据在paritition内有序。
如果kakfa在进行hash时需要考虑partition的leader-1的情况对应的hash规则会发生调整对应的数据消费端也需要进行调整整体的影响较大因此kafka没有进行这样的考虑。而是要求在创建topic时能够进行要求多副本并且通过监控运维等手段及时发现leader-1的partition并及时修复。
4. 参考文档
暂无