kafka学习笔记(二)-架构分析

  Kafka学习笔记(一)-名词解释模块,我们简单的提到了kafka的一些相关名词和它们之间的关系。这一章将详细的记录kafka的架构组成

kafka架构图

单节点架构

在这里插入图片描述
  在kafka集群中,一个运行kafka服务的节点,我们称之为Broker,它负责接收producer发送的消息,并存储在磁盘上。
  Kafka中消息的生产者被称为Producer,生产者在生产消息时,并非逐条发送,而是按照设定的参数进行批量发送:如batch.size,表示多少数据时进行发送,默认16k;linger.ms表示批量发送的等待时间,超过多少秒,进行发送;buffer.memory客户端缓冲区,满了也会触发消息发送。
  在消息中间件中,消费者获取消息的方式有两种:pull和push。pull是指消息存储在broker上,消费者需要时去拿。push指broker拿到消息之后立即发送给消费组,存储在消费者的服务器上。Kafka用的Pull,RabbitMQ两种方式都有,但主要是用Push。Consumer和producer通过指Topic进行关联。
  一个Borker节点上会有多个Topic,它可以理解为文件夹,用来表示一组相关的消息。需要注意的是,Topic只是一个逻辑概念,在磁盘上,消息并非按照Topic进行存储。
  Partition是Topic的基础组成部分,它将一个topic拆分成多个逻辑单元。是一个有序的不可变的消息队列。一个Topic上会有若干个partition。是生产者和消费者操作的最小单位。
  一个partition中包含多个segment。一个segment是物理存储消息的最小单元,每个segment包含一定量的消息数据。配置文件中log.segment.bytes就定义了segment文件的最大值。segment文件的文件名,是根据下一条消息的偏移量命名的,从而实现了消息的有序性。消息数据会依次、按顺序的追加写入文件,不需要在磁盘上寻址,保证了kafka的高吞吐量。
在这里插入图片描述

集群架构

Leader-Follower模型

在这里插入图片描述

  为提高数据可用性和容错性的目的,kafka集群用了和Redis类似的主从复制。不过,Kafka的复制粒度是Partition,每个Partition都有一个Leader和若干个Follwer。通过异步的方式机制复制,只是采用了简单的备份策略。而Redis的复制粒度是Redis整个节点,采用同步复制机制,且具有复杂的高可用策略。
  当消息写入时,topic会根据预定义的消息分区策略,将消息分配到不同的Partition中。Kafka提供了三种默认的消息分区策略:

1.RoundRobinPartitioner(轮询分区策略):该策略会按照轮询的方式将消息均匀地分配到可用的分区上。这意味着每个分区都会依次被分配到一个消息,然后再循环分配。
2.UniformStickyPartitioner(粘性因子分区策略):该策略引入了一种sticky factor(粘性因子)的概念。该因子可以在配置中进行设置,默认为0.5。当计算哈希值进行分区时,除了使用键的哈希值外,还会加入一个随机数,并将粘性因子作为权重进行加权。这样一来,即使有多个消息具有相同的键,它们也有一定的概率分配到不同的分区上,从而实现负载均衡。
  可以在保持消息有序性的同时,分散负载,提高吞吐量。但需要注意的是,如果使用该分区策略,消息的键必须具有较好的均匀性,以确保哈希值的分布均匀,从而避免出现分区热点的情况。
3.DefaultPartitioner(默认分区策略):该策略根据消息的键(key)进行分区。如果消息带有键,那么会根据键的哈希值来选择分区。如果消息没有键,则使用轮询的方式将消息分配到可用的分区上

  也可以自定义消息分区策略,只需要实现Partitioner接口即可。自定义消息分区策略可以应用于特定的业务场景,比如需要把一些特定的消息分配到指定的partition中,或者需要根据特定的业务逻辑进行分区选择。通过在Kafka生产者的配置中设置partitioner.class属性来使用这些分区策略。

Leader的选举

  Leader的选举是通过一个Broker进行的,Kafka会先在集群中选出一个Broker作为Controller,由这个Controller执行选举的流程。并使用ZooKeeper来协调Leader选举过程。ZooKeeper是Kafka选举的重要保障,因为它保证了选举算法的正确性和一致性。

partition对消费者访问的分配

  partition不允许同一个Consumer Group中的两个消费者同时消费。如果想要实现一个partition的消息被重复消费,只能另外建一个消费组。且消费者和生产者只会对Leader进行操作。
  通过设置消费者的partition.assignment.strategy是用来指定Partition分配策略的参数。要注意,该分配策略是对一个消费组中的各消费者进行分区分配。

1.RangeAssignor:该分配器将Toic中所有的Partition的id范围均匀分配给各个Consumer Group中的Consumer,以实现负载均衡。
2.RoundRobinAssignor:该分配器将Topic中所有Partition依次分配给各个Consumer Group中的Consumer,以实现轮询分配。保证消息的顺序性。
3.StickyAssignor:该分配器将在RangAssignor和RoundRobin之间权衡,以实现当某个Consumer Group发生增删时,尽可能减少Partition的重分配。

  以上是kafka提供的三种默认策略,用户也可以通过实现org.apache.kafka.clients.consumer.ConsumerPartitionAssignor接口来定义自己的分配策略。
  Partition中被消费的数据不会被删除,所以 ,需要维护一个消费者和其读取数消息的offset的数据。早期,该数据被保存在zookeeper中,后来,Kafka直接将数据保存在了Broker上。
在这里插入图片描述
  kafka会将groupID的hash值对50取模,获得存储的文件分区。将当前消费者的相关消费信息存入。

Kafka中Zookeeper的作用

Kafka中Zookeeper的作用主要有以下几个方面:

  1. 管理Kafka的元数据:Zookeeper维护了Kafka集群的元数据,包括Kafka broker的列表、分区的分配方案、消费者的消费位置、各个主题的配置信息等,这些信息对Kafka集群的正常运行至关重要。

  2. 协调Kafka集群中的各个节点:Kafka集群中的每个节点通过Zookeeper协调彼此之间的工作,例如Kafka broker的加入、离开、分区分配、leader选举等等,这些都需要Zookeeper来协调。

  3. 提供可靠的消息存储:Zookeeper本身也是一个分布式系统,它提供了可靠的数据存储和读写保持一致的机制,这一特性也被Kafka利用来存储消息的生产者和消费者的偏移量。

综上所述,可以看出Zookeeper在Kafka集群中扮演了非常重要的角色,它是Kafka集群的中枢神经系统。

  • 25
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值