初识kafka集群

kafka常见的集群部署模式算法

1. Hub架构。一个中心的kafka集群作中央调度,对应多个本地的kafka集群。数据结构

变种是一个关键的kafka集群对应一个非关键的跟随者
  • 优势:只有本地用到的数据就在本地使用,多个数据中心须要用到的数据就放在中央,从本地同步到远程的次数也就只有一次,这样读取的时候,须要本地的就本地读,不然远程读,也就是消费者只须要从一个集群读数据便可
  • 缺点:一个数据中心的不能访问另外一数据中心的

2. 双活架构。 多个集群之间保持数据同步。
架构

  • 优势:一个集群挂掉能够直接转向另一个,并且能够就近的提供服务
  • 缺点:集群之间同步数据如何避免冲突,保证数据一致性

3. 主备架构。有两个集群,日常只用主集群, 另一个集群只有当主集群出了问题才用。
code

  • 优势:不须要担忧数据访问和冲突问题
  • 缺点:有一个集群的资源浪费,同时须要考虑备份的量的问题,以及恢复的过程当中是否能够重复数据或者丢失部分数据

4. 延展集群。单个数据中心故障的时候,从新定位到另外一个数据中心 。
对象

  • 优势:有必定的灾备能力,一个中心挂了,使用另外一个,延展集群不是多个集群而是一个集群,使用的方式是kafka内部的复制机制,把数据放到其余的broker,而不是集群之间的复制与同步
  • 缺点:kafka自己出了问题没法避免


新节点的新建与关闭

  1. 新建节点;每一个broker都有一个惟一的标识符,新的broker启动的时候,会建立一个临时节点,把本身的ID注册到zk,若是zk中已经有一个同样的ID存在,会获得错误,注册失败。若是注册成功,且集群中有着一个与新ID同样的旧ID副本,那么新的broker会当即加入集群,并拥有与旧broker相同的分区和主题
  2. 节点异常/关闭;启动时穿件的临时节点会从zk上自动移除,监听broker列表的kafka组件会被告知该broker已经移除,broker对应节点消失,可是它的ID会继续存在于其余数据结构中
好比主题副本列表

什么是副本?

分区数据的拷贝。分为两种类型:
1. 首领副本。负责分清那个跟随者状态与本身一致。每一个分区都有一个,全部生产者和消费者请求都会通过它。
2. 跟随者副本。首领之外的副本。不处理客户端的请求。仅从首领复制消息,若是首领崩溃,他们中的同步副本会被提高为新首领。

首领与跟随者之间的消息同步

在有新消息到达时,跟随者会向首领发送获取数据的请求。一个跟随者副本首先请求消息1,而后消息2,而后消息3;若是没有收到这3个消息的响应,不会再次请求消息4。  资源

持续请求最新消息的副本也被称做同步的副本

若是跟随者发送了请求消息4,,那么知道消息被同步了,若是跟随者10s内没有请求消息,或者没有请求最新的消息,此跟随者被当作不一样步。部署

没有同步的副本是不可能成为新的首领的

首选首领

建立主题时候选定的首领即分区首选首领。若是首选首领不是当前首领,而且该副本是同步的,就会触发首领选举,使得首选首领称为当前首领kafka

如何对消息进行分区?

kafka具有默认的分区器。若是key没有,就经过Round robin算法将消息发送到各个可用的分区上,若是key存在,就对键进行散列同步

只有主题分区数不可变的时候,映射才有用

如何分配分区?

建立主题的时候,kafka先决定broker的分配。它的总原则是:broker之间平均分步分区副本;每一个分区的副本分布在不一样的broker上it

轮询,好比broker0是首领,那么1是跟随者,类推。若是有机架信息,会尽量使得副本分配到不一样机架上。
分配好副本以后,选择数据存储目录,每一个分区会有单独的目录,新的分区总被添加到分区数小的目录里面

假设有新磁盘,那么新分区会在新磁盘上。注意这里没有考虑分区的大小,仅仅看数量

控制器与集群的关系

控制器自己是一个兼具分区首领选举的broker

1. 集群中第一个启动的broker经过在zk中建立一个临时节点 /controller 使本身成为控制器。其它节点启动时一样会进行这个操做,但只会收到 节点点存在 的异常,其它节点只会在 控制器节点上建立zk watch对象接收节点的变动通知
确保集群只有一个控制器
2. 控制器关闭或者异常时,watch对象告知各个broker,他们进而尝试成为控制器,第一个成功的会成为控制器,其它则建立watch对象。新的控制器会得到更大的controller epoch,其它broker获知当前的epoch以后,若是发现比当前要小的epoch则忽略


3. 有节点退出时,若是broker包含首领,则控制器遍历分区肯定新首领,而后向包含新首领或现有的跟随者发请求消息,告知谁是新首领和谁是分区跟随者。新broker加入时,检查broker ID是否有现成的分区副本,有的话变动消息发送给新的broker和其它broker,新broker上副本开始从首领复制消息

分区新增时,消费者如何处理?

新增分区会发生分区重分配。

消费者群组新加入消费者怎么处理?

1. 新加入的消费者它读取的消息是本来属于其它消费者读取的消息,一个消费者关闭或者崩溃则离开群组,本来应该被它读取的消息由其它消费者接受。
2. 再均衡。即分区的全部权从一个消费者转移到另外一个消费者。这个过程当中,消费者群没法处理消息。
3. 分区的全部权则经过消费者向被指派的 群组协调器 的broker发送心跳来维持,同时消费者的心跳行为也用来维持和群组的从属关系。若是消费者中止发送心跳的时间足够长,会话会过时,群组协调器认为它已经死亡,触发再均衡

第一个加入消费组的是群组。负责给每个消费者分配分区

能不能不要消费组?

能够。一个消费者能够本身订阅主题并加入消费组,或者为本身分配分区

不能同时作这两件事

不过度配分区若是主题添加了新的分区,消费者不会收到通知,须要周期性的调用consumer.partitionsFor方法或者重启。

本身分配分区后是不会发生再均衡以及手动查找分区,其他同样


消费者与消费分区是如何对应的?

消费者从属于一个消费群组,一个群组里的消费者订阅同一个主题,每一个消费者接受主题一部分分区的消息。消费者的数量应该小于等于分区的数量,若是消费者的数量超过度区数,那么超过部分会被闲置。不一样消费组群互相不影响,若是一个应用要处理多个主题,可让多个主题公用一个消费者群组

相关文章
相关标签/搜索