kafka常见的集群部署模式算法
1. Hub架构。一个中心的kafka集群作中央调度,对应多个本地的kafka集群。数据结构
变种是一个关键的kafka集群对应一个非关键的跟随者
2. 双活架构。 多个集群之间保持数据同步。
架构
3. 主备架构。有两个集群,日常只用主集群, 另一个集群只有当主集群出了问题才用。
code
4. 延展集群。单个数据中心故障的时候,从新定位到另外一个数据中心 。
对象
好比主题副本列表
在有新消息到达时,跟随者会向首领发送获取数据的请求。一个跟随者副本首先请求消息1,而后消息2,而后消息3;若是没有收到这3个消息的响应,不会再次请求消息4。 资源
持续请求最新消息的副本也被称做同步的副本
若是跟随者发送了请求消息4,,那么知道消息被同步了,若是跟随者10s内没有请求消息,或者没有请求最新的消息,此跟随者被当作不一样步。部署
没有同步的副本是不可能成为新的首领的
建立主题时候选定的首领即分区首选首领。若是首选首领不是当前首领,而且该副本是同步的,就会触发首领选举,使得首选首领称为当前首领kafka
kafka具有默认的分区器。若是key没有,就经过Round robin算法将消息发送到各个可用的分区上,若是key存在,就对键进行散列同步
只有主题分区数不可变的时候,映射才有用
建立主题的时候,kafka先决定broker的分配。它的总原则是:broker之间平均分步分区副本
;每一个分区的副本分布在不一样的broker上it
轮询,好比broker0是首领,那么1是跟随者,类推。若是有机架信息,会尽量使得副本分配到不一样机架上。分配好副本以后,选择数据存储目录,每一个分区会有单独的目录,新的分区总被添加到分区数小的目录里面
假设有新磁盘,那么新分区会在新磁盘上。注意这里没有考虑分区的大小,仅仅看数量
控制器自己是一个兼具分区首领选举的broker
确保集群只有一个控制器2. 控制器关闭或者异常时,watch对象告知各个broker,他们进而尝试成为控制器,第一个成功的会成为控制器,其它则建立watch对象。新的控制器会得到更大的controller epoch,其它broker获知当前的epoch以后,若是发现比当前要小的epoch则忽略
3. 有节点退出时,若是broker包含首领,则控制器遍历分区肯定新首领,而后向包含新首领或现有的跟随者发请求消息,告知谁是新首领和谁是分区跟随者。新broker加入时,检查broker ID是否有现成的分区副本,有的话变动消息发送给新的broker和其它broker,新broker上副本开始从首领复制消息
新增分区会发生分区重分配。
1. 新加入的消费者它读取的消息是本来属于其它消费者读取的消息,一个消费者关闭或者崩溃则离开群组,本来应该被它读取的消息由其它消费者接受。
2. 再均衡。即分区的全部权从一个消费者转移到另外一个消费者。这个过程当中,消费者群没法处理消息。
3. 分区的全部权则经过消费者向被指派的 群组协调器 的broker发送心跳来维持,同时消费者的心跳行为也用来维持和群组的从属关系。若是消费者中止发送心跳的时间足够长,会话会过时,群组协调器认为它已经死亡,触发再均衡
第一个加入消费组的是群组。负责给每个消费者分配分区
能够。一个消费者能够本身订阅主题并加入消费组,或者为本身分配分区
不能同时作这两件事
不过度配分区若是主题添加了新的分区,消费者不会收到通知,须要周期性的调用consumer.partitionsFor方法或者重启。
本身分配分区后是不会发生再均衡以及手动查找分区,其他同样
消费者从属于一个消费群组,一个群组里的消费者订阅同一个主题,每一个消费者接受主题一部分分区的消息。消费者的数量应该小于等于分区的数量,若是消费者的数量超过度区数,那么超过部分会被闲置。不一样消费组群互相不影响,若是一个应用要处理多个主题,可让多个主题公用一个消费者群组