kafka 副本集设置和理解
最近在做集群高可用验证的时候,遇到了一个kafka 副本集高可用的问题,在这里分析总结一下。
当前的部署情况是kafka集群有三个节点;在做集群高可用验证的时候,先shutdown一个服务器实例之后,再验证服务相关的高可用,当shutdown一个实例之后,发现kafka 有的topic可以正常发送和接收消息,而有的topic 却不能。
报错的关键日志:
org.apache.kafka.common.errors.TimeoutException: Expiring 53 record(s) for TWAMP_LINK_TOPIC-0: 120000 ms has passed since batch creation
再经过层层排查之后,通过以下命令,找到了关键点。
kafka-run-class kafka.admin.TopicCommand --describe --topic TUNNEL_STATE_TOPIC --bootstrap-server kafka2:9092
注意将 --topic 之后的topic 换成不同的topic进行查看,具体显示如下:
根据提供的两个Topic的描述信息,可以得出以下结论:
再切换了之后,发现有的topic 存在正常的leader、 而有的topic 却不存在leader。 而kafka 发送消息是通过leader去发送的,没有leader就会异常。
输出结果详解:
第一行:Topic 级别的概要信息
Topic: TWAMP_LINK_TOPIC TopicId: iw-DWE9jSBKsxT7NJwQBzQ PartitionCount: 1 ReplicationFactor: 1 Configs:
第二行:分区级别的详细信息
Topic: TWAMP_LINK_TOPIC Partition: 0 Leader: none Replicas: 3 Isr: 3
此处需要注意两个配置容易误解:
1、ReplicationFactor: 1
(副本因子:1)
-
这是最重要的配置!它意味着Kafka只会为这个分区的数据创建1个副本。这是数据的冗余度,决定了容错能力。
-
1
表示 “没有冗余”。就像只把文件打印了一份。
2、Replicas: 3
(副本所在Broker ID:3)
-
这个字段只是告诉你:那唯一的一个副本,被放置在了Broker ID 为 3 的服务器上。
-
它不是说有三个副本。这里的
3
是一个Broker编号,不是数量。 -
如果把
Replicas: 3
换成Replicas: 1
,意思就是那唯一的一个副本在Broker 1上。
解决方法:
重新创建topic,并设置topic的副本因子的数量大于1;从而保证高可用
kafka-topics.sh --create --topic TWAMP_LINK_TOPIC \
--partitions 1 \
--replication-factor 3 \ # 关键!必须设置为 3,为每个分区创建3个副本
--bootstrap-server kafka1:9092
将副本因子设置为2 之后再查看配置如下:
第一行:Topic 概要
第二行:分区详情
文章转载自:香吧香
原文链接:kafka 副本集设置和理解 - 香吧香 - 博客园
体验地址:JNPF快速开发平台