分区
num.partitions 参数指定了新创建的topic将包含多少个partition。自动创建的topic默认的partition数为该值。
kafka集群通过partition对topic进行横向扩展,所以当有新的broker加入到集群时,可以通过partition个数来实现负载均衡。partition数量不一定比broker数量多,两者之间没有必然联系。
分区数量的选择
为主题选择partition数量并非可有可无,在选择数量时需要考虑如下因素:
1、主题需要达到多大的吞吐量?例如,是希望每秒钟写入100KB还是1GB?
2、从单个分区读取数据的最大吞吐量是多少?每个分区一般都会有一个消费者,如果你知道消费者将数据写入数据库的速度不会超过每秒50MB,那么你也该知道,从一个分区读取数据的吞吐量不需要超过每秒50MB。
3、可以通过类似的方法估算生产者向单个分区写入数据的吞吐量,不过生产者的速度一般比消费者快得多,所以最好为生产者多估算一些吞吐量。
4、每个broker包含的分区个数、可用的磁盘空间和网络带宽。如果消息是按照不同的键来写入分区的,那么为已有的主题新增分区就会很困难。
5、单个broker对分区个数是有限制的,因为分区越多,占用的内存越多,完成首领选举需要的时间也越长。
增加分区
topic基于partition进行伸缩和复制,增加partition的主要目的是为了扩展topic的容量或者降低单个partition的吞吐量。
基于key的topic增加partition会导致一些问题,因为数据写入时会对key做hash,然后对分区数取模,如果增加partition的话,会导致对于同一个key会
减少分区
理论上是不能减少partition个数的。如果想让topic的partition数比num.partitions小,那么需要手动创建该topic。
如果删除了分区,那么该分区中的数据也会被删除,导致数据不一致。无法将这些删除的数据分配给其他分区。如果一定要减少分区数量,只能删除整个topic,然后重建。
副本
1个分区从属于1个broker,该broker被称为分区的首领。1个分区可以分配给多个broker,这个时候会发生复制。kafka通过分区复制来冗余消息。
复制系数
kafka的默认复制系数为3。
首领副本与跟随者副本
首领副本:每个分区都有一个首领副本。为了保证一致性,所有生产者和消费者的请求都会经过这个副本。
跟随者副本:首领以外的副本都是跟随者副本。跟随者副本不处理来自客户端的请求,他们唯一的任务就是从首领那里复制消息,保持与首领状态一致。如果首领崩溃,那么其中一个跟随者会被提升为首领。