一、生产者角度
说明:
1、每个topic可以创建多个分区,分区可以在启动kafka server时,通过config/servder.properties配置分区数(默认1),也可以在topic启动时配置分区数。
2、同属一个topic的多条消息会根据均衡算法平均放到多个分区。
3、生产者发送消息时,也可以指定发送到某个分区。
二、kafka服务端
说明:
1、partitionX-Y,X代表分区编号,Y代表副本编号。
2、每个分区的消息在每个副本上保留一份备份,而每个副本在不同的kafka服务上。也就是不同分区的内容是不同的,而不同副本的内容是相同的。消费者消费每个分区的消息时,会优先从主副本取,如果失败,才会从其他副本取。
3、Isr指示同步状态的服务副本,Leader变量指示主副本,不同分区的主副本会再次负载均衡到不同的kafka服务。
4、如果某个kafka服务挂掉,Repliticas展示的副本不会发生变化,但是Isr会变化。
5、topic1配置了3个分区,每个分区配置3个副本。topic2是kafka服务挂掉一个的情况,也可以理解为3分区2副本的场景(此时会有一个服务分配了2个主副本)。
6、kafka服务挂掉又重启之后,分区的主副本可能不均衡,可以执行主副本再平衡命令。
7、不同主题之间是相互独立的,相互不影响。
三、消费者角度
说明:
1、两个分区P0、P1,3个消费者归属两个消费者组(C0单独成组,C1、C2分为一组)。
2、消费者组订阅了某个topic,意味着该topic下所有分区,都能被这个消费者组下的消费者消费。
3、为了保证每个分区的消费顺序,每个分区只能从属于消费者组下的一个消费者,不能出现同一个消费者组下多个消费者负责一个分区的情况。
4、如果消费者组下的消费者个数超过分区个数,就会有消费者一直监听不到消息,处于空闲状态,是多余的。
5、如果消费者组下的消费者个数小于分区个数,就会出现一个消费者监听多个分区的情况。
6、每个topic可以被多个消费者组订阅,每个消费者组也可以订阅多个topic。
7、至于消费者组中的每个消费者负责哪个分区,这个分配关系有专门的分配策略,保证均衡。
四、分区数、副本数、kafka服务个数配置优化
说明:
1、需求 = 副本数 * 分区数
2、供给 = 分区数 * 服务节点个数
3、副本节点分配的最大个数,也就是副本节点出现次数的最优值 = 需求 / 服务节点个数。如果不能整除,出现次数的最大值需要+1,最小值为该值。
五、参考链接