kafka知识整理系列二

kafka分区策略

什么情况下会分区

  1. 同一个Consumer Group内新增了消费者
  2. 消费者离开当前所属的Group(包括主动离开或者宕机等原因被迫离开)
  3. 定于的topic新增了分区

分区方式有哪些

kafka有2种默认的分区分配策略。Range和RoundRobin

Range Strategy(也是默认的使用策略)

首先,对于同一个主题里的分区按照序号进行排序,对于消费者按照字母顺序排序。
假设有10个分区

类别名称
分区0,1,2,3,4,5,6,7,8,9
消费者线程c1-0,c2-0,c3-0

那么每个线程会分配到多少个分区呢?
假设分区数量有m个,消费者有n个,每个线程分配到的个数有c个
公式:

// 如果有余数,那么按照消费者的序号顺序,依次给每个消费者分区数+1
c=m/n 

那么本例有10个分区,3个消费者,最终分区状况为:

消费者分到的分区
c1-00,3,6,9
c2-01,4,7
c3-02,5,8

备注:消费者可以通过设置参数:partition.assignment.strategy来设置分配策略
但是此策略有个缺点:
这个例子当中,c1-0是不是多了一个分区,这是一个topic的情况,那么假设有1000个topic,那么同理,c1-0会多1*1000个分区需要消费,者会造成严重的不均衡。

因此还有第二个分区策略RoundRobin Strategy

RoundRobin Strategy

用这个分区策略有两个前提:

  1. 同一个Consumer Group中的所有num.streams需要相等
  2. 每个Consumer消费的topic需要相同

实现原理用两句话概括:

  1. 将所有分区的消费者列出来,求hashcode,并根据值进行排序
  2. 通过轮询分配进行分配分区。

kafka的Rebalance

Rebalance也就是重新平衡:意思是将分区的所有权从一个消费者转移到另一个消费者。
触发rebalance的条件:

  1. 同一个Group中的消费者数量进行了改变
  2. topic的分区数量进行改变
  3. Consumer主动取消订阅,也就是unsubcribe()

谁负责执行Rebalance操作呢,又由谁来管理?

Coordinator

当一个Consumer Group 中的第一个Consumer启动的时候,他就会和kafka Server去确定Group中的哪一个broker(节点)作为Coordinator,而一旦确认了,之后的其他Group中的组员,都会与该Coordinator进行通信。

Rebalance的步骤:

第一步-----JoinGroup:
确定好Coordinator(注意加粗),所有的Consumer会向Coordinator发送一个JoinGroup请求(一旦启动就会发送的请求),Coordinator会从Group中选取一个Consumer作为leader,并将组员的信息以及订阅情况发送给其他的Group。
这里用一张网上的图:
在这里插入图片描述
第二步-----Synchronizing Group State:
主要就是leader将分配方案同步给Group中所有的Consumer
在这里插入图片描述

kafka的日志清除策略

kafka的日志清除策略有俩:

  1. 根据消息的保留时间来清除(配置log.retention.hours)默认七天
  2. 根据topic存储的数据大小(配置log.retention.bytes)

重点来了,以上条件,任意一个到达要求,kafka就会执行日志的清除。

万一数据量巨大,或者需要保留时间长,那么怎么办?
kafka有日志压缩的一个功能,类似于Redis的一个日志压缩。
开启后

  1. 服务端在后台启动Cleaner线程池
  2. 定期将相同的key进行合并,并且保留最新的value值
    在这里插入图片描述

kafka的TCP链接管理

kafka生产者和消费者之间,使用TCP协议来连接,那么在什么情况下,会创建或者关闭TCP呢?

生产者创建TCP的3种情况

1.创建kafkaProducer实例的时候,生产者会在后台启动一个send线程,该线程开始运行的时候会创建与broker的连接。

2.更新元数据时,又有两种情况

  1. Producer给一个不存在的topic发送消息时,broker会告知这个topic不存在,producer会发送一个metadata请求给kafka,去获取最新的元数据信息。(此时创建了TCP)
  2. Producer根据metadata.max.age.ms参数,定期更新元数据信息(默认五分钟)

3.发消息的时候,毫无疑问是需要打开TCP的

生产者/消费者关闭TCP的2种情况

  1. Producer.close();/consumer/close();
  2. kafka自动关闭。
    可以在Producer端设置一个参数:connections.max.idle.ms(默认9分钟,如果有个TCP链接没有流过任何请求,则关闭该TCP)

消费者创建TCP的3种情况

  1. 发起FindCoordinator请求(集群中负载最小的broker作为Coordinator)
  2. 链接Coordinator的时候
  3. 消费消息的时候。

注意:创建KafkaConsumer的时候不会创建TCP,而是调用poll()方法的时候才会创建。

kafka控制器组件Controller

什么是Controller:(kafka里的Controller)
集群中的任意一台broker都能够充当Controller的角色。但是只有一个能成为,Broker启动的时候,会尝试去zookeeper中创建一个/Controller的节点,而第一个成功创建这个节点的broker会成为Controller。

Controller 的作用

  1. topic管理,创建、删除topic等,增加分区。
  2. 分区重分配。
  3. Preferred选举:解决部分broker负载过重而提供的换leader方案。
  4. 集群成员管理:如broker的增加、宕机、关闭等。
  5. 数据服务:Controller上保存了完整的集群元数据信息,其他broker则定期接受来自Controller的元数据更新请求,从而更新缓存数据。

Preferred replica:
举个例子:
如果一个分区有3个副本:0,1,2.那么副本0就是Preferred replica
也就是通常副本列表中的第一个。
Preferred leader选举:
将指定分区的leader调整回Preferred replica的过程
(主要是为了避免同一个broker上的leader过多,leader压力大)

例子:
在这里插入图片描述
如果此时关闭broker2以及broker3,那么会导致每一个分区的leader都会落在broker1上(正常情况下)
在这里插入图片描述

那么如果我们进行一个配置,再来测试会怎样?
在这里插入图片描述
结果:可以看出来没有向上文一样,Leader全部为1.
在这里插入图片描述
这就避免了broker1上有3个leader而导致压力过大。这就是所谓的Preferred 选举

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zong_0915

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值