Kafka的partions和replication-factor参数的理解

今天同事发现创建 kafka 的时候出现错误

1
WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 1329 : {test-hxf=UNKNOWN_TOPIC_OR_PARTITION} (org.apache.kafka.clients.NetworkClient)

解决这个问题首先需要判断问题出错的地方

首先定位是否 kafka 的集群不健康,检查所有日志。发现 kafka 中会报错 kafka 的 host not found。重启直到 kafka 成功不报错。

第二步解决报错的日志,这次报错的日志是

WARN [ReplicaFetcher replicaId=2, leaderId=0, fetcherId=0] Received INCONSISTENT_TOPIC_ID from the leader for partition test-1. This error may be returned transiently when the partition is being created or deleted, but it is not expected to persist. (kafka.server.ReplicaFetcherThread) 删除掉这个 topic。 删除命令行

1
kafka-topic.sh  —bootstrap-server localhost:9092 —delete --topic  test

删除 topic,但是继续进行自动创建 kafka 的命令

1
 kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test123

但是依然报错 选择手动进行 kafka 的 topic 创建

1
topicbin/kafka-topics.sh --create --topic topicname --replication-factor 1 --partitions 1 --bootstrap-server localhost:9092

发现这种情况下,可以正常进行。 那么问题应该出现在自动化创建 topic 的设置问题,重新查看 kafka 的配置文件,发现是 kafka 的自动创建 topic 被关闭了

1
KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE

设置为 true 时,可以支持自动创建了。

Topic 在 Kafka 中是主题的意思,生产者将消息发送到主题,消费者再订阅相关的主题,并从主题上拉取消息。

在创建 Topic 的时候,有两个参数是需要填写的,那就是 partions 和 replication-factor。

partions

主题分区数。kafka 通过分区策略,将不同的分区分配在一个集群中的 broker 上,一般会分散在不同的 broker 上,当只有一个 broker 时,所有的分区就只分配到该 Broker 上。

消息会通过负载均衡发布到不同的分区上,消费者会监测偏移量来获取哪个分区有新数据,从而从该分区上拉取消息数据。

分区数越多,在一定程度上会提升消息处理的吞吐量,因为 kafka 是基于文件进行读写,因此也需要打开更多的文件句柄,也会增加一定的性能开销。

如果分区过多,那么日志分段也会很多,写的时候由于是批量写,其实就会变成随机写了,随机 I/O 这个时候对性能影响很大。所以一般来说 Kafka 不能有太多的 Partition。

下图设置 topic-1 的 partions 为 3,会自动分配在不同的 broker 上,采用均匀分配策略,当 broker 和 partions 一样时,就均匀分布在不同的 broker 上。

replication-factor

用来设置主题的副本数。每个主题可以有多个副本,副本位于集群中不同的 broker 上,也就是说副本的数量不能超过 broker 的数量,否则创建主题时会失败。

比如 partions 设置为 20,replicationFactor 设置为 1. Broker 为 2.可以看出,分区会均匀在 broker

上进行分配。

Licensed under CC BY-NC-SA 4.0
最后更新于 Jan 06, 2025 05:52 UTC
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
Caret Up