文章目录

  • Leader和Follower
  • 生产者分区写入策略
    • 轮询分区策略
    • 随机策略(不用)
    • 按key分配策略
      • 乱序问题
    • 自定义分区策略
  • 消费者组Rebalance机制
  • 消费者分区分配策略
    • Range 范围分配策略
    • RoundRobin轮询策略
    • Stricky粘性分配策略
  • 副本机制
    • ACKS配置为0
    • ACKS配置为1
    • ACKS配置为-1或者all

Leader和Follower

在 Kafka 中,每个 topic 都可以配置多个分区以及多个副本。每个分区都有一个 leader 以及 0 个或者多个 follower,在创建 topic 时,Kafka 会将每个分区的 leader 均匀地分配在每个 broker 上。我们正常使用kafka是感觉不到leader、follower的存在的。但其实,所有的读写操作都是由leader处理,而所有的follower都复制leader的日志数据文件,如果leader出现故障时,follower就会被选举为leader。所以,可以这样说:

Kafka中 的 leader 负责处理读写操作,而 follower 只负责副本数据的同步。
如果 leader 出现故障,其他 follower 会被重新选举为leader。
follower 像一个 consumer 一样,拉取 leader 对应分区的数据,并保存到日志数据文件中。

生产者分区写入策略

生产者写入消息到topic,Kafka将依据不同的策略将数据分配到不同的分区中。

  1. 轮询分区策略
  2. 随机分区策略
  3. 按key分区分配策略
  4. 自定义分区策略

轮询分区策略

  • 即就是默认的策略也是使用最多的策略,可以最大限度保证所有消息平均分配到一个分区。
  • 如果在生产消息时,key 为 null,则使用轮询算法均衡地分配分区。

轮询就是根据字面意思的循环的意思

随机策略(不用)

随机策略,每次都随机地将消息分配到每个分区。在较早的版本,默认的分区策略就是随机策略,也是为了将消息均衡地写入到每个分区。但后续轮询策略表现更佳,所以基本上很少会使用随机策略。

按key分配策略

根据key的hash码求余来计算找到对应的位置

但按key分配策略,有可能会出现数据倾斜,例如:某个key包含了大量的数据,因为key值一样,所有所有的数据将都分配到一个分区中,造成该分区的消息数量远大于其他的分区。

乱序问题

在上面的轮询策略、随机策略都会导致一个问题,生产到 Kafka 中的数据是乱序存储的。而按 key 分区可以一定程度上实现数据有序存储——也就是局部有序,但这又可能会导致数据倾斜,所以在实际生产环境中要结合实际情况来做取舍。

自定义分区策略

  1. 创建自定义分区器
public class KeyWithRandomPartitioner implements Partitioner {private Random r;@Overridepublic void configure(Map<String, ?> configs) {r = new Random();}@Overridepublic int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {// cluster.partitionCountForTopic 表示获取指定topic的分区数量return r.nextInt(1000) % cluster.partitionCountForTopic(topic);}@Overridepublic void close() {}
}
  1. 在 Kafka 生产者配置中,自定使用自定义分区器的类名
props.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, KeyWithRandomPartitioner.class.getName());

消费者组Rebalance机制

定义:Kafka中的 Rebalance 称之为再均衡,是Kafka中确保Consumer group下所有的 consumer(消费者) 如何达成一致,分配订阅的 topic 的每个分区的机制。

Rebalance触发的时机有:

  1. 消费者组中 consumer 的个数发生变化。
    例如:有新的consumer加入到消费者组,或者是某个consumer停止了。

  2. 订阅的topic个数发生变化
    消费者可以订阅多个主题,假设当前的消费者组订阅了三个主题,但有一个主题突然被删除了,此时也需要发生再均衡。

  3. 订阅的topic分区数发生变化

Rebalance的不良影响:

  • 发生Rebalance时,consumer group下的所有consumer都会协调在一起共同参与,Kafka使用分配策略尽可能达到最公平的分配。
  • Rebalance 过程会对 consumer group 产生非常严重的影响,Rebalance 的过程中所有的消费者都将停止工作,直到Rebalance完成。

消费者分区分配策略

消费者去的分配策略都有:

  1. Range 范围分配策略
  2. RoundRobin轮询策略
  3. Stricky粘性分配策略

Range 范围分配策略

Range范围分配策略是Kafka 默认的分配策略,它可以确保每个消费者消费的分区数量是均衡的。

注意:Rangle范围分配策略是针对每个Topic的。

配置消费者的partition.assignment.strategy为org.apache.kafka.clients.consumer.RangeAssignor。

算法公式

 n  = 分区数量 / 消费者数量m = 分区数量 % 消费者数量前m个消费者消费n+1个剩余消费者消费n个

RoundRobin轮询策略

RoundRobinAssignor 轮询策略是将消费组内所有消费者以及消费者所订阅的所有 topic 的 partition 按照字典序排序(topic和分区的hashcode进行排序),然后通过轮询方式逐个将分区以此分配给每个消费者。

配置
配置消费者的partition.assignment.strategy为org.apache.kafka.clients.consumer.RoundRobinAssignor。

Stricky粘性分配策略

从Kafka 0.11.x开始,引入此类分配策略。主要目的:

  1. 分区分配尽可能均匀。
  2. 在发生 rebalance 的时候,分区的分配尽可能与上一次分配保持相同。

没有发生rebalance时,Striky 粘性分配策略和 RoundRobin 分配策略类似

我们明显的可以发现,Striky 粘性分配策略,保留 rebalance 之前的分配结果。这样,只是将原先 consumer2 负责的两个分区再均匀分配给consumer0、consumer1。这样可以明显减少系统资源的浪费,例如:之前consumer0、consumer1之前正在消费某几个分区,但由于rebalance发生,导致consumer0、consumer1需要重新消费之前正在处理的分区,导致不必要的系统开销。
(例如:某个事务正在进行就必须要取消了)

副本机制

副本的目的就是冗余备份,当某个Broker上的分区数据丢失时,依然可以保障数据可用。因为在其他的Broker上的副本是可用的。

producer的ACKs参数可以为:0、1、-1/all。

Properties props = new Properties();
props.put("bootstrap.servers", "node1.itcast.cn:9092");
props.put("acks", "all");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

ACKS配置为0

ACK 为0表示,不等待broker确认,直接发送下一条数据,性能是最高的,但是及有可能造成数据丢失的情况。

ACKS配置为1

当生产者的ACK配置为1时,生产者会等待leader副本确认接收后,才会发送下一条数据,性能中等。

ACKS配置为-1或者all

需要等待所有的副本将数据同步完成后,生产者才会发送下一条数据,最安全,但是也是性能最慢的。

测试:

指标 单分区单副本(ack=0) 单分区单副本(ack=1) 单分区单副本(ack=-1/all)
吞吐量 165875.991109/s 每秒16.5W条记录 93092.533979/s 每秒9.3W条记录 73586.766156 /s 每秒7.3W调记录
吞吐速率 158.19 MB/sec 88.78 MB/sec 70.18 MB
平均延迟时间 192.43 ms 346.62 ms 438.77 ms
最大延迟时间 670.00 ms 1003.00 ms 1884.00 ms

Kafka的分区和副本机制相关推荐

  1. Kafka从入门到精通(七)分区和副本机制

    1. 分区和副本机制 1.1 生产者分区写入策略 生产者写入消息到topic,Kafka将依据不同的策略将数据分配到不同的分区中 轮询分区策略 随机分区策略 按key分区分配策略 自定义分区策略 1. ...

  2. kafka 消息分发机制、分区和副本机制

    一.消息分发机制 1.1 kafka 消息分发策略 消息是 kafka 中最基本的数据单元,在 kafka 中,一条消息由key.value两部分构成,在发送一条消息 时,我们可以指定这个key,那么 ...

  3. 2021年大数据Kafka(七):Kafka的分片和副本机制

    全网最详细的大数据Kafka文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 Kafka的分片和副本机制 一.分片机制 二.副本机制 三. ...

  4. Kafka架构篇 - 多副本机制

    多副本机制 副本是分布式系统中对数据和服务提供的一种冗余方式.为了对外提供可用的服务,往往会对数据和服务进行副本处理. 数据副本:在不同的节点持久化同一份数据,当某个节点存储的数据丢失时,可以从副本中 ...

  5. Kafka topic分区增加副本

    Kafka中topic的每个分区可以设置多个副本.如果副本数为1,当该分区副本的leader节点宕机后,会导致该分区不可用.故需要设置多副本来保证可用性. 实际项目中,存在项目初期创建了副本数为1的t ...

  6. 2021年大数据Kafka(十一):❤️Kafka的消费者负载均衡机制和数据积压问题❤️

    全网最详细的大数据Kafka文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 Kafka的消费者负载均衡机制和数据积压问题 一.kafka ...

  7. kafka:topic为什么要进行分区?副本机制是如何做的?

    kafka为什么要在topic里加入分区的概念?如果没有分区,topic中的segment消息写满后,直接给订阅者不是也可以吗? Kafka可以将主题划分为多个分区(Partition),会根据分区规 ...

  8. kafka分区副本机制

    Kafka为分区引入了多副本(Replica)机制,通过增加副本数量可以提升容灾能力.同一分区的不同副本中保存的是相同消息(在同一时刻,副本之前并非完全一样),副本之间是"一主多从" ...

  9. kafka 分区和副本以及kafaka 执行流程,以及消息的高可用

    1.Kafka概览 Apache下的项目Kafka(卡夫卡)是一个分布式流处理平台,它的流行是因为卡夫卡系统的设计和操作简单,能充分利用磁盘的顺序读写特性.kafka每秒钟能有百万条消息的吞吐量,因此 ...

最新文章

  1. Win7和VS2013上使用Intel的TBB
  2. boost::container模块实现默认初始化的程序
  3. map端join和reduce端join的区别
  4. 附件文件无法保存到服务器,可能是目录属性设置问题,请与管理员联系,Discuz不能上传过大文件的解决办法...
  5. javaScript学习笔记之break 和 continue 语句对比
  6. php 两个符号怎么打,怎么打出圈2符号
  7. 实例讲解Nginx下的rewrite规则 来源:Linux社区
  8. Windows下编译DCMTK
  9. (转)亚马逊创始人贝佐斯:前进路上,善良远比聪明重要
  10. [android] android下文件访问的权限
  11. TurboC 2.0下载及使用方法
  12. 姚前:新型货币战争才刚刚开始
  13. 【c语言】【inline】鸡肋关键字?inline-函数调用的加速器
  14. AirPlay无线技术研究
  15. Android 老生常谈之MVC与MVP
  16. 基于SpringBoot的校园快递代取管理系统
  17. Baumer工业相机堡盟相机如何使用自动曝光功能(自动曝光优点和行业应用)(C++)
  18. 西门子1500与SMC EX260总线阀岛通讯组态
  19. 基于JSP动漫论坛的设计与实现(论文+PPT+源码
  20. Iterator patten 读书笔记

热门文章

  1. aliddns ipv6_Python实现阿里云域名DDNS支持ipv4和ipv6-阿里云开发者社区
  2. python编程:判断输入的边长能否构成三角形 如果能则计算出三角形的周长和面积
  3. 惊爆GitHub!腾讯T14级SQL首席专家开源分布式数据库架构实践手册
  4. Win10系统如何设置护眼模式?
  5. C语言程序——变量的赋值
  6. 工具化、产品化、运营化—「美团点评」运维的故事
  7. 低成本无线射频通信芯片选型
  8. 方言――水(上) K}[V mxzw
  9. 中科创达 测试 面经 (一面+hr面)
  10. Kodi中AirPlay 和 DLNA 无线串流投影以及开启方法