• kafka介绍及常见问题解答


    kafka介绍及常见问题解答

    1.1 主要功能

    根据官网的介绍,ApacheKafka®是一个分布式流媒体平台,它主要有3种功能:

    1:It lets you publish and subscribe to streams of records.发布和订阅消息流,这个功能类似于消息队列,这也是kafka归类为消息队列框架的原因

    2:It lets you store streams of records in a fault-tolerant way.以容错的方式记录消息流,kafka以文件的方式来存储消息流

    3:It lets you process streams of records as they occur.可以再消息发布的时候进行处理

    1.2 使用场景

    1:Building real-time streaming data pipelines that reliably get data between systems or applications.在系统或应用程序之间构建可靠的用于传输实时数据的管道,消息队列功能

    2:Building real-time streaming applications that transform or react to the streams of data。构建实时的流数据处理程序来变换或处理数据流,数据处理功能

    1.3 详细介绍

    1.3.1 消息传输流程

    Producer即生产者,向Kafka集群发送消息,在发送消息之前,会对消息进行分类,即Topic,上图展示了两个producer发送了分类为topic1的消息,另外一个发送了topic2的消息。

    Topic即主题,通过对消息指定主题可以将消息分类,消费者可以只关注自己需要的Topic中的消息

    Consumer即消费者,消费者通过与kafka集群建立长连接的方式,不断地从集群中拉取消息,然后可以对这些消息进行处理。

    从上图中就可以看出同一个Topic下的消费者和生产者的数量并不是对应的。

    1.3.2 消息存储

    数据存储

    • 压缩与解压缩
      • 消息压缩指两块,一是单条数据的压缩,二是批量数据的压缩
      • 单条数据的压缩指将数据序列化为二进制
      • 批量数据的压缩指将多条消息合并为1个消息集,共享消息头(比如消息数量,压缩格式等),提高吞吐量
      • 压缩式发生在生产者端,生产者通过缓存机制和批量提交机制,一次性发送多条消息给kafka
      • 当生产者压缩格式与服务端需要的压缩格式不一致时,服务端会发生解压缩和重压缩的步骤,带来的影响是服务端需要使用jvm内存来完成这一步操作,影响写入效率
      • 解压缩的步骤发生在消费者端
    • 存储形式是什么样的?
      • 以文件的方式存储,数据文件是.log结尾
      • 数据内容为原封不动的生产端压缩过后的数据
      • kafka通过mmap+write的形式,写系统缓存(page cache),由系统控制刷入磁盘,一致性及可用性由副本和ack机制保证
    • 是否可更改?
      • 与其他消息队列不同,kafka不允许对已有数据进行更改,消息消费过后也不会被删除
    • 日志文件多了怎么办?
      • 通过配置过期删除策略,删除过期的文件
    • offset机制
      • offset即位移,指的是消息在文件中的位置,每个分区内单独递增,主要用于副本同步和消费者消费位置管理
    分区

    • 什么是分区?
      • 分区指的是消息保存在服务端的不同位置,单机下是分文件,集群下是分机器
    • 为什么需要分区机制?
      • 分区是为了做负载均衡和横向扩容
    • 分多少个合适?
      • 一般而言,分区需要根据数据量决定,数据越多,分区越多,一般而言,日均百万级的数据,3个分区就够了
    • 消息会发到哪个分区去?
      • 跟分区策略相关,包括指定分区,hash分区,轮循分区(默认),自定义分区
      • 消息发送到哪个分区是由生产者决定的,每个生产者会缓存所有的分区信息
    副本

    • 什么是副本?
      • 副本是kafka为了保证数据不丢失引入的机制
    • 一个topic有几个副本?
      • 一个topic的每个分区都有多个副本,由创建topic时的参数replicationFactor决定
    • leader与follower机制
      • 一个topic内的多个副本中,一个为leader,其他的都为follower,基于zookeeper的节点加锁,成功创建节点的为leader
      • leader副本控制整个集群的读写请求,生产者端缓存了该topic下所有分区及副本的信息,只会往leader发,如果发到了follower节点,会重新找leader节点
      • follower定时向leader发起同步请求,同步的依据是offset
    • 怎么判断follower与leader同步上了
      • 通过ISR(IN-SYNC-REPLICA)副本机制,实际上是存储在zk里面的节点数据
      • replica.log.max.messages,最大消息位置差距,follower副本通过offset同步数据,判断该offset和当前leader节点的结尾offset可得
      • replica.log.time.max.ms,最大同步时间,follower上次发起同步的时间和当前时间比较可得
    • 什么时候选leader?
      • 分区数量变化
      • 原leader宕机
    • 哪些副本可以作为leader?
      • ISR中的所有服务都可作为leader,谁先往zk中写入数据,谁就是leader
      • ISR副本全挂了怎么办?unclean选举,带来的问题是数据丢失
    • 为什么不能主写从读?
      • 主写从读机制存在的目的就是为了负载均衡和分流,比如,终端管理平台的终端交互侧作为主库,后台管理测用从库
      • 主写从读带来的问题就是数据的延迟和不一致,比如连到A从库时有数据,A宕机,连到B从库(还未同步到),发现没有那条数据
      • 分区机制带来的负载均衡比主写从读更有效
    索引
    • kafka索引是什么
      • kafka索引是一个文件,以.index结尾
      • kafka索引有两种,offset索引和timestamp索引
      • kafka索引是稀疏索引,类似于数组的结构,每个索引项指向日志中的一条记录,通过二分查找找到区间,再遍历日志记录找到数据

    2.1 生产者

    • 怎么算写入成功?
      • 因为批量提交的存在,调用producer的send方法后并不说明发送成功,需要注册回调方法判断是否成功
      • ack机制,producer端可配置acks, 0:消息发出去了就成功,1:leader写入了就成功,all:所有ISR写入成功才成功

    3.1 消费者

    • 消费分组
      • 消费者以组为组织结构,不同group的消费者隔离
      • 在一个group中,一个分区只能给一个消费者消费,一个消费者可以消费多个分区
    • 怎么决定我该消费哪个分区?
      • 同一个组中,第一个连接到kafka集群(joinGroup)的消费者自动成为消费者组的leader
      • kafka把所有的topic分区及消费者信息都发送给这个leader,这个leader会把分区分配信息发送给kafka
      • 其他消费者syncGroup时会获取到自己应该消费的分区信息
    • 消费到哪了?
      • 消费者通过offset维护当前消费的位置
    • offset保存位置?
      • 老版本offset保存在zk中,一个topic节点下有一个group,一个group下有每个分区的offset
      • 新版本offset保存在_consumer_offsets这个topic下
      • 手动管理,druid就是手动管理,自己保存在数据库
    • 什么时候提交offset?
      • autoCommit,消费端默认每隔100ms提交一次offset,存在重复消费的可能性
      • 手动管理,可以根据消费进度,保证精确一次,flink里的kafka连接器就是这样的

    4.1 kafka为什么这么快

    • 日志格式:二进制格式,发送端压缩,接收端解压缩
    • 顺序IO:只追加写,尤其指mmap(日志文件映射到内存),操作系统一次性刷新到磁盘
    • 批量提交: 提高吞吐量,不需要那么多线程处理
    • 批量压缩:减少数据量
    • 廉价的消费者:主要指通过offset读取,不更改日志文件
    • 未刷新的缓冲写入,指mmap
    • 客户端优化:分区策略,压缩,生产者直接发给主节点
    • 零拷贝:主要指数据文件发送给消费者时,通过sendfile调用直接发给网络socket,不用加载到jvm用户空间
    • 避免垃圾收集(通道,原生缓冲区,页面缓存,直接内存的使用之类)
    • 分区机制
  • 相关阅读:
    1834. 单线程 CPU sort+优先队列 过了,学习vector<vector<int>>排序
    552. 学生出勤记录 II 力扣(困难) 记忆化搜索/dp 不会做,学习记忆化搜索转dp的学习
    526. 优美的排列 力扣(中等) dfs暴搜/ 状压dp是没想到的
    576. 出界的路径数 力扣(中等) 路径dp/记忆化搜索 都不会做
    1583. 统计不开心的朋友 力扣(中等) 模拟,思考一下
    233. 数字 1 的个数 力扣(困难) 数位dp/数学 不会做
    516. 最长回文子序列 力扣(中等) 区间dp,不会做
    446. 等差数列划分 II
    7.14 数据结构板子
    7.13 树上问题
  • 原文地址:https://www.cnblogs.com/hei12138/p/14663618.html
Copyright © 2020-2023  润新知