Kafka

文章目录

  • [1. Kafka简介](#1. Kafka简介)
  • [2. 分区和副本机制](#2. 分区和副本机制)
    • [2.1 生产者分区写入策略](#2.1 生产者分区写入策略)
    • [2.2 乱序问题](#2.2 乱序问题)
    • [2.3 消费者组Rebalance机制](#2.3 消费者组Rebalance机制)
    • [2.4 消费者分区分配策略](#2.4 消费者分区分配策略)
    • [2.5 副本的ACK机制](#2.5 副本的ACK机制)
  • [3. Kafka原理](#3. Kafka原理)
    • [3.1 leader和follower](#3.1 leader和follower)
    • [3.2 leader选举](#3.2 leader选举)
    • [3.3 Kafka读写流程](#3.3 Kafka读写流程)
    • [3.4 Kafka的消息不丢失](#3.4 Kafka的消息不丢失)

1. Kafka简介

  • 异步处理
  • 系统解耦
  • 流量削峰
  • 日志处理

2. 分区和副本机制

2.1 生产者分区写入策略

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

  1. 轮询分区策略
  2. 随机分区策略
  3. 按key分区分配策略:按key分配策略,有可能会出现「数据倾斜」,例如:某个key包含了大量的数据,因为key值一样,所有所有的数据将都分配到一个分区中,造成该分区的消息数量远大于其他的分区。
  4. 自定义分区策略

2.2 乱序问题

乱序问题

在Kafka中生产者是有写入策略(轮询),如果topic有多个分区,就会将数据分散在不同的partition中存储,当partition数量大于1的时候,数据(消息)会打散分布在不同的partition中,如果只有一个分区,消息是有序的

2.3 消费者组Rebalance机制

  • 再均衡:在某些情况下,消费者组中的消费者消费的分区会产生变化,会导致消费者分配不均匀,Kafka Consumer Group就会启用rebalance机制,重新平衡这个Consumer Group内的消费者消费的分区分配。
  • 触发时机
    • 消费者数量发生变化
      • 某个消费者crash
      • 新增消费者
    • topic的数量发生变化
      • 某个topic被删除
    • partition的数量发生变化
      • 删除partition
      • 新增partition
  • 不良影响
    • 发生rebalance,所有的consumer将不再工作,共同来参与再均衡,直到每个消费者都已经被成功分配所需要消费的分区为止(rebalance结束)

2.4 消费者分区分配策略

分区分配策略:保障每个消费者尽量能够均衡地消费分区的数据,不能出现某个消费者消费分区的数量特别多,某个消费者消费的分区特别少

  • Range分配策略(范围分配策略):Kafka默认的分配策略
    • n:分区的数量 / 消费者数量
    • m:分区的数量 % 消费者数量
    • 前m个消费者消费n+1个分区
    • 剩余的消费者消费n个分区
  • RoundRobin分配策略(轮询分配策略)
    • 消费者挨个分配消费的分区
  • Striky粘性分配策略
    • 在没有发生rebalance跟轮询分配策略是一致的
    • 发生了rebalance,轮询分配策略,重新走一遍轮询分配的过程。而粘性会保证跟上一次的尽量一致,只是将新的需要分配的分区,均匀的分配到现有可用的消费者中即可
    • 减少上下文的切换

2.5 副本的ACK机制

口述:::要往某个Topic中写数据,Topic包含很多个分区,每个broker就先当于一个服务器,存储一个分区的leader,在其他的broker中存储分区的副本,目的就是当分区的leader挂了后,选举副本为leader,这样这个分区信息就不会丢失了,客户端访问的都是分区的leader,lader提供读写的功能,follower(也就是分区的副本)不提供读写功能,只作为副本存在,就是防止leader挂了,自己可以顶上去

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

  • acks = 0:生产者只管写入,不管是否写入成功,可能会数据丢失。性能是最好的
  • acks = 1:生产者会等到leader分区写入成功后,返回成功,接着发送下一条,注意:此时follower还没有备份
  • acks = -1/all:确保消息写入到leader分区、还确保消息写入到对应副本都成功后,接着发送下一条,性能是最差的

3. Kafka原理

3.1 leader和follower

  • Kafka中的leader和follower是相对分区有意义,不是相对broker
  • Kafka在创建topic的时候,会尽量分配分区的leader在不同的broker中,其实就是负载均衡
  • leader职责:读写数据
  • follower职责:同步数据、参与选举(leader crash之后,会选举一个follower重新成为分区的leader
  • 注意和ZooKeeper区分
    • ZK的leader负责读、写,follower可以读取
    • Kafka的leader负责读写、follower不能读写数据(确保每个消费者消费的数据是一致的),Kafka一个topic有多个分区leader,一样可以实现数据操作的负载均衡

3.2 leader选举

口述:如果分区的leader挂了,controller(可以理解为master,管理broker的,)会负责分区leader的选举,controller读取到当前分区的ISR,ISR就表示当前有几个follower是存活的,然后选择一个作为分区的leader,这样的话这个分区就能提供读写服务了,因为只有leader才能读写。

  • 在Kafka集群启动的时候,每个broker都会尝试去ZooKeeper上注册成为Controller,但只有一个竞争成功,其他的broker会注册该节点的监视器
  • Controller是通过ZK来进行选举的,controller决定分区leader的选举,通过ISR来进行快速选举

3.3 Kafka读写流程

  • 写流程
    • 通过ZooKeeper找partition对应的leader,leader是负责写的
    • producer开始写入数据
    • ISR里面的follower开始同步数据,并返回给leader ACK
    • 返回给producer ACK
  • 读流程
    • 通过ZooKeeper找partition对应的leader,leader是负责读的
    • 通过ZooKeeper找到消费者对应的offset
    • 然后开始从offset往后顺序拉取数据
    • 提交offset(自动提交------每隔多少秒提交一次offset、手动提交------放入到事务中提交)

3.4 Kafka的消息不丢失

  • broker消息不丢失:因为有副本relicas的存在,会不断地从leader中同步副本,所以,一个broker crash,不会导致数据丢失,除非是只有一个副本。
  • 生产者消息不丢失:ACK机制(配置成ALL/-1)、配置0或者1有可能会存在丢失
  • 消费者消费不丢失:重点控制offset():保证offset的可靠性,只有成功消费了消息才跟新zookper中的offset。
    • At-least once:一种数据可能会重复消费
    • Exactly-Once:仅被一次消费
相关推荐
Pota-to成长日记2 小时前
Redisson 看门狗机制深度解析:分布式锁的守护者
分布式·wpf
wangtianlang09125 小时前
深入理解Java多线程编程中的锁机制与性能优化策略
分布式
熊文豪6 小时前
Windows安装RabbitMQ保姆级教程
windows·分布式·rabbitmq·安装rabbitmq
Amy1870211182317 小时前
分布式光纤传感:照亮每一个角落的“温度感知神经”
分布式
Jabes.yang18 小时前
Java求职面试:从Spring Boot到Kafka的技术探讨
java·spring boot·面试·kafka·互联网大厂
玉石观沧海20 小时前
高压变频器故障代码解析F67 F68
运维·经验分享·笔记·分布式·深度学习
小马爱打代码21 小时前
分布式锁:原理算法和使用建议
分布式·算法
一叶飘零_sweeeet1 天前
从 “黑盒“ 到 “透明“:SkyWalking 实战指南 —— 让微服务问题无所遁形
分布式·微服务·skywalking·分布式链路追踪
ArabySide1 天前
【ASP.NET Core】分布式场景下ASP.NET Core中JWT应用教程
分布式·后端·asp.net core
还是大剑师兰特1 天前
Kafka 面试题及详细答案100道(91-95)-- 问题排查与解决方案1
kafka·大剑师·kafka面试题·kafka教程