kafka集群中会有一个或者多个broker,其中只有一个broker会被选为控制器(kafka controller),其负责管理整个集群中所有分区和副本的状态。当某个分区的leader副本出现故障时,由控制器负责为该分区选举新的leader副本。当检测到某个分区的ISR集合发生变化,控制器将通知所有的broker更新其元数据信息。
控制器的选择时通过向zookeeper中写入临时节点/controller进行实现的,创建成功的broker将会成为控制器。zookeeper另一个与控制器有关的节点是:/controller_epoch节点,用来记录控制发生变更的次数,每产生一个新的控制器这个值就i会增加一。kafka也是通过controller_epoch来保证控制器的唯一性。
leader副本选举
分区副本的选举是由控制器负责具体实施,基本的思路是:按照AR集合所有副本的顺序进行查找第一个存活的副本,并且这个副本在ISR集合中。一个分区中的AR集合在分配的时候就被指定了,只要不发生重分配,那么集合内部的副本的顺序是保持不变的,而分区中ISR集合中副本的顺序是有可能发生改变的。
服务端参数
-
broker.id是broker启动前必须设定的参数,kafka集群就是使用它进行唯一标识的。如果meta.properties文件中broker.id与server.properties中broker.id不一致时候,将会抛InconsistentBrokerIdException
kafka服务端重要参数
参数名称 默认值 参数释义 zookeeper.connect localhost:2181 kafka使用的zookeeper集群地址,多个采用","分隔 auto.create.topics.enable true 是否开启自动创建主题的功能 auto.leader.rebalance.enable true 是否自动leader再均衡功能 compression.type producer 消息压缩类型。默认值标识跟生产者使用相同的类型 log.retention.hours 168(7天) 日志文件的留存时间,单位为小时 log.roll.hours 168(7天) 经过多长时间后会强制新建一个日志分段 log.roll.ms null 同上,单位为ms,但是优先级比上面的要高 log.segment.bytes 1G 日志分段文件的最大值,超过这个值后会强制创建一个新的日志分段。 num.partitions 1 主题中默认的分区数