首页 > 其他分享 >Kafka 集群工作原理

Kafka 集群工作原理

时间:2024-03-01 17:47:49浏览次数:24  
标签:消费者 分区 默认 节点 集群 原理 Kafka 数据 Leader

Broker 集群工作原理

Kafka Broker 集群工作原理图解

  • broker 启动后,会向 zookeeper 注册,并记录在 Kafka 配置节点下的 /brokers/ids 节点下,之后抢占 /controller 节点,率先注册的节点的 Controller 就会负责 Leader 的选举
  • 选举节点会监听 /brokers/ids 节点的变化,之后根据选举规则选举出 Leader,并将 Leader 信息记录在 /borkers/topics 节点对应主题下的对应分区的 /state 节点下
  • 其他节点会读取 /borkers/topics 下的 Leader 信息并同步给自己的 Controller 用来在选举节点意外下线后重新抢占 /controller 节点以保证服务的正常运行
  • 当生产者给 broker 集群的 Leader 节点发送消息后,集群中的 Follower 会主动向 Leader 同步信息,从而将信息存储在磁盘上(数据以 segment 形式存储,多个 segment 逻辑上统称为 log,每个 segment 除了本身的 .log 文件外还有采用稀疏索引方式记录索引编号范围的 .index文件)
  • 当 Leader 意外下线时,选举节点会监听到 /brokers/ids 节点的变化,选举节点的 Controller 会从 /borkers/topics 节点下拉取对应的 Leader 信息和 ISR 信息,选举出新的 Leader 并将新 Leader 的信息和 ISR 信息写入到 /borkers/topics 节点对应主题下的对应分区的 /state 节点下

Producer(生产者)工作原理

生产者初始化流程图解

  • main 线程调用 send() 方法发送数据,期间经过拦截器(如果有配置)对数据进行处理
  • 数据处理完毕后,会经过序列化器进行序列化
  • 序列化完毕后会把数据传给分区器,由分区器来决定数据发往哪个分区
  • 分区器会把数据分成多批次(默认16k)存储在一个缓存队列(双端队列,默认32m)中,等待 sender 线程读取
  • sender 线程会创建一个网络客户端,在每批次数据到达 batch.size(默认16k) 或等待时间到达 linger.ms(默认0毫秒) 后读取缓存队列中的数据来准备发送给 Kafka 集群,最多缓存5批次
  • 在发送给 Kafka 集群之前,会先由选择器打通输入输出流,之后再将数据发送给 Kafka 集群
  • 当 Kafka 集群收到数据后会进行应答,有以下三种应答级别:
  • 0:接收到数据后,无需落盘即可应答
  • 1:接收到数据后,Leader 落盘完毕后即可应答
  • -1(all):接收到数据后,Leader 和 ISR(可以理解为和 Leader 保持同步的所有副本的集合) 队列里所有节点落盘完毕后才可以应答
  • 如果数据发送成功,sender 线程会清除网络客户端中缓存的已发送的数据,之后通知缓存队列清除已发送的数据
  • 如果发送不成功,sender 线程会进行重试(重试次数默认为 int 的最大值,即 2147483647)

Consumer(消费者)工作原理

消费者原理图解

  • broker 集群先选出一个 coordinator(辅助实现消费者组的初始化和分区的分配) 节点
  • coordinator 节点选取是先通过 groupid 的 hashcode 值与 _consumer_offset 的分区数量(默认50)进行取余所得的值假设为 5,那么 _consumer_offset 主题的 5 号分区在哪个 broker 节点上,那么这个节点的 cooreinator 就作为消费者组的老大,消费者组中的所有消费者提交 offset 时都往这个分区提交()
  • 消费者组中的所有消费者会向选出来的 coordinator 发送连接请求
  • coordinator 会随机选择其中一个消费者作为 Leader,并把消费的 topic 相关信息发送给 Leader
  • Leader 会根据分区分配策略制定一个消费方案,并把制定好的消费方案返回给 coordinator
  • coordinator 会把收到的消费方案分发给消费者组中的每个消费者
  • 每个消费者会和 coordinator 保持心跳(默认3秒)一旦超过 session.timeout.ms(默认45秒)没有没有发送心跳或消费者处理消息时间超过 max.poll.interval.ms(默认5分钟)都会触发再平衡,至此消费者初始化完毕
  • 当消费者准备消费数据时,会先调用 sendFetches() 方法创建一个 ConsumerNetworkClient(消费者网络客户端)对象
  • ConsumerNetworkClient 会根据 Fetch.min.bytes(默认1 byte)、Fetch.max.wait.ms(默认500毫秒)、Fetch.max.bytes(默认50m)三个参数调用 send() 方法发送发送请求,broker 收到请求后,会把数据通过 onSeccess() 回调方法把数据传给消费者
  • 消费者会把数据放在消息队列中,消费者每次读取 Max.poll.records(默认500)条消息进行消费
  • 消费消息首先会经过反序列化器对数据进行反序列化
  • 接着会经过拦截器(如果有配置)对数据进行相关处理
  • 之后会把数据交给下游服务来对数据进行处理

补充说明

Consumer Group:消费者组,简称 CG 是由多个 groupid 相同的 Consumer(消费者)组成

  • 消费者必须存在消费者组内,哪怕这个消费者组中只有一个消费者
  • 消费者组内每个消费者负责消费不同分区的数据,一个分区的数据只能被同一消费者组中的一个消费者消费,但一个消费者可以消费多个分区的数据
  • 消费者组之间互不影响,即消费者组是逻辑上的订阅者

标签:消费者,分区,默认,节点,集群,原理,Kafka,数据,Leader
From: https://www.cnblogs.com/ljzy666/p/18047576

相关文章

  • 关于pacemaker-集群-token-网络心跳检测时间的修改
    在笔者操作系统Redhat8.8中,pacemaker默认的token时间为3000毫秒,也可以理解成心跳检测时间这样根据默认的规则,consensus有时间如果没有特别指定的话,将是token*1.2,即3600毫秒[root@azdb01qq-5201351]#corosync-cmapctl|grep'totem.token\|consensus'runtime.config.tote......
  • Vue源码解读:响应式原理
    Vue一大特点就是数据响应式,数据的变化会作用于视图而不用进行DOM操作。原理上来讲,是利用了Object.defifineProperty(),通过定义对象属性setter方法拦截对象属性的变更,从而将属性值的变化转换为视图的变化。在Vue初始化时,会调用initState,它会初始化props,methods,data,......
  • kafka节点故障恢复原理
    Kafka的LEO和HWLEOLEO是Topic每一个副本的最后的偏移量offset+1HW(高水位线)HighWaterMark是所有副本中,最小的LEOFollower副本所在节点宕机由于数据同步的时候数据是先写入Leader,然后Follower副本向Leader同步只要Leader和其他的Follower副本继续往前存储数据,挂掉的节点在......
  • 预算有限,资源冗余?DWS集群缩容如何帮你解决烦劳
    本文分享自华为云社区《GaussDB(DWS)华为云数仓使用实践–预算有限,资源冗余?华为云数仓集群缩容帮你解决烦劳》,作者:OneToOne。一、为什么要做缩容?在使用GaussDB(DWS)数仓时,在业务不同的时段,对数仓的计算资源大小有不同的需求。在业务繁忙、流量高峰的时候需要对DWS集群节点扩容,......
  • 云原生:使用HPA和VPA实现集群扩缩容
    1背景我们之前介绍过,随着业务流量上涨之后,我们的系统需要适时的进行扩容。数据存储层我们也介绍过MySQL的扩容ScaleUP(纵向扩展)和ScaleOut(横向扩展)垂直拆分(ScaleUp纵向扩展):包括垂直分库、垂直分表水平拆分(ScaleOut横向扩展):包括库内分表、分库分表详细可以参考笔者......
  • 置换群 / Polya 原理 / Burnside 引理 学习笔记
    置换群/Polya原理/Burnside引理学习笔记在GJOI上做手链强化,经过长达三小时的OEIS和手推无果后开摆,喜提rnk12,故开始学习置换群相关内容。笔记主要以Polya原理和Burnside引理的应用为主,所以会非常简单,很大一部分的群论概念和证明不会写,因为我不会。基础群论定......
  • JAVA基础:数组在计算机中的执行原理 多个变量指向一个数组
    程序都是在计算机中的内存中执行的,java程序编译之后会产生一个class文件,这个class文件是提取到内存中的JVM虚拟机中执行的。java为了便于虚拟机这个java程序,也即这个class文件。将虚拟机这块内存区域进行了划分:方法区,栈,堆,  本地方法栈,程序计数器方法区:放编译后的class文件的......
  • Redis部署-集群
    基本原理Redis集群是一个提供在多个Redis节点间共享数据的程序集,可以支持多个Master。作用支持多个Master,每个Master可以挂载多个Slave,可以支持读写分离、数据的高可用、海量数据的存储支持故障迁移机制,不需要单独的Sentinel节点客户端与Redis的节点连接时,不需要要连接所有......
  • Nacos集群部署
    Nacos集群部署使用背景在当下微服务时代,微服务治理平台层出不穷。随着Netflix相关包进入了仅维护状态,不进行新性能的开发,导致Eureka逐渐退出主流市场。相比较下Nacos同时支持注册中心和配置中心,Nacos致力于发现、配置和管理微服务。它提供了一组简单易用的特性集,帮助快速实现动......
  • Vue学习笔记19--key的原理
    react、vue中key的作用(key的原理?):虚拟DOM中key的作用:key是虚拟DOM对象的标识,当张贴中的数据发生变化时,vue会根据--新数据,生成新的虚拟DOM,随后vue进行新虚拟DOM与旧虚拟DOM的差异比较。比较规则如下:对比规则旧虚拟DOM中找到了与新虚拟DOM相同的key若虚拟DOM中内容没......