Kafka的partions和replication-factor参数的理解和调优设置
Topic在Kafka中是主题的意思,生产者将消息发送到主题,消费者再订阅相关的主题,并从主题上拉取消息。
在创建Topic的时候,有两个参数是需要填写的,那就是partions和replication-factor。
partions
主题的分区数。kafka通过分区策略,将不同的分区分配在一个集群中的broker上,一般会分散在不同的broker上,当只有一个broker时,所有的分区就只分配到该Broker上。
消息会通过负载均衡发布到不同的分区上,消费者会监测偏移量来获取哪个分区有新数据,从而从该分区上拉取消息数据。
分区数越多,在一定程度上会提升消息处理的吞吐量,因为kafka是基于文件进行读写,因此也需要打开更多的文件句柄,也会增加一定的性能开销。
如果分区过多,那么日志分段也会很多,写的时候由于是批量写,其实就会变成随机写了,随机 I/O 这个时候对性能影响很大。所以一般来说 Kafka 不能有太多的 Partition。
replication-factor
用来设置分区的副本数。每个分区可以有多个副本,副本位于集群中不同的broker上,也就是说副本的数量不能超过broker的数量,否则创建主题时会失败。
partions数目与replication-factor是在创建一个topic时非常重要的两个参数,这两个参数的取值会直接影响到系统的性能与稳定性。
尽量在第一次创建一个topic时就指定这两个参数,因为:
- 如果partions数目在之后再次做调整,则会打乱key的顺序保证(同样的key会分布到不同的partition上)
- 如果replication-factor在之后再次增加,则会给集群带来更大的压力,可能会导致性能下降
partions和replication-factor参数的调优设置
一个已被业界接受的准则是:
一个broker不应该承载超过 2000 到 4000 个partitions(考虑此broker上所有来自不同topics的partitions)。同时,一个Kafka集群上brokers中所有的partitions总数最多不应超过20,000个。
此准则基于的原理是:在有broker宕机后,zookeeper需要重新做选举。若是partitions数目过多,则需要执行大量的leader elections。
另外几个常规原则有:
如果集群中需要更多的partitions,则优先考虑增加brokers
如果集群中需要20,000 个以上的partitions,则可以参考Netflix的模型,创建更多的 Kafka 集群
最后需要注意的是:不要为一个topic创建超过1000个的partitions。我们也并不需要1000个partitions才能达到很高的吞吐。在开始的时候,选择一个更合理的partition数目,然后测试性能,根据测试结果再调整partitions 数目。