Kafka

作者: 笔头还没烂 | 来源:发表于2022-08-13 11:04 被阅读0次
    定义

    Kafka 是一个开源的分布式事件流平台。
    分布式的基于订阅发布模式的高吞吐高性能的实时消息队列系统。

    功能

    功能一:分布式流式数据实时存储:分布式消息队列系统【工作中主要使用的场景】;
    功能二:分布式流式计算:分布式计算:KafkaStream

    应用场景

    大数据实时计算的架构中,实现实时数据缓存的场景
    目前只要做实时大数据,都必用 Kafka 或者 Pulsar

    特点

    1、高性能:实时的对数据进行高性能的读写【内存+磁盘】
    2、高并发:分布式并行读写
    3、高吞吐:使用分布式磁盘存储
    4、高可靠:分布式主从架构
    5、高安全性:数据安全保障机制
    (1)数据安全:存储在Kafka的数据是相对安全的;
    (2)传输安全:从理论上能保证数据生产和消费满足一次性语义:不丢失不重复。
    6、高灵活性:根据需求,随意添加生产者和消费者

    小结

    Kafka 在大数据中专门用于实现实时的数据存储,实现大数据实时的数据计算。

    相关概念
    1. 生产者:实时采集工具:如 Flume

    2. 消费者:实时计算引擎:如 Flink、Spark

    3. Broker: Kafka 的集群我们叫 Broker 集群。Kafka 是一个分布式集群,多台机器构成,每台 Kafka的节点就是一个 Broker。
      (1)Kafka节点:Broker
      (2)Kafka进程:Kafka
      (3)多台机器启动 Kafka进程,构建了多个 Broker 的 Kafka 集群

    4. Producer:生产者
      (1)功能:负责往 Kafka 中写数据的客户端
      (2)本质:写数据的客户端

    5. Consumer:消费者
      (1)功能:负责从 Kafka 中读取数据
      (2)本质:读数据的客户端

    6. Consumer Group:消费者组,可以任意多个消费者所构成。
      规则:
      (1)Kafka 的订阅发布模式中必须以消费者组的形式从 Kafka 中消费数据;
      (2)任何一个消费者必须属于某一个消费者组
      (3)一个消费者组中可以有多个消费者:
      多个消费者共同并行消费数据,提高消费性能;
      消费者组中多个消费者消费的数据是不一样的;
      整个消费者组中所有的消费者消费的数据加在一起是一份完整的数据。

    7. Topic:数据主题,用于区分不同的数据,对数据进行分类
      (1)Topic 是 Kafka 中分布式的数据存储对象,类似于数据库中表的概念,但是 Topic 是分布式的(类似于 HDFS 中文件的概念,不同的数据存储在不同的文件中,Kafka 中不同的数据存储在不同的 Topic 中)
      (2)Kafka 是分布式存储,所以 Kafka 中的 Topic 也是分布式的概念,写入 Topic 的数据会分布式地存储在 Kafka 中(类似于 HDFS 中每一个文件会被拆分成 Block ,每个 Block 会分散在不同的节点上存储)

    8. Partition: 数据分区,用于实现 Topic 的分布式存储,对 Topic 的数据进行划分
      (1)每个 Topic 都可以对应多个分区,每个分区存储在不同的 Kafka 节点 Broker 上
      (2)写入 Topic :根据一定的规则决定写入哪个具体的分区

    Topic 与 Partition 的关系.png

    类比 HDFS


    image.png

    小结:我们写数据是写到 Kafka 集群中的某一个 Topic 中,Kafka 集群会根据分区规则,将该数据存储到某个 Partition 上。而这个分区被存储在某一台 Kafka 的节点上(Broker)。

    实施:
    (1)一个分区有多个副本,读写这个分区数据的时候,到底读写哪个分区副本呢?
    Kafka 将一个分区的多个副本,划分为两种角色:
    Leader 副本:负责对外提供读写,生产者和消费者只对 leader 副本进行读写;
    Follower 副本:与 Leader 同步数据,如果leader 故障,从follower 中选出新的leader 副本对外提供读写。
    设计:方式类似于 ZK 中节点的设计,但是这里不是做节点的选举,而是分区副本的选举。
    实现:由 Kafka 的主节点根据机器的健康状态、数据的完整性来选择 Leader 和 Follower 副本。

    1. Segment
      Q:我们知道数据最终是写入某个Topic的某个Partition中,那数据在Partition中是如何存储的呢?
      Kafka的存储结构:
      Topic 会划分若干个 Partition ,每个Partition内部还会划分不同的Segment。每个Segment文件用该Segment内最小偏移量来命名。
      (1)Segment 本质:对每个分区的数据进行了更细的划分,用于存储 Kafka 中的数据文件并记录索引;
      (2)规则:先写入的数据会先生成一对 Segment 文件【一对Segment对应三个文件,两种文件】,存储到一定条件以后(达到一定的数据量后),后面数据写入另外一对 Segment 文件对。(数据都是写入.log文件,当第一个.log文件写满之后,会再生成第二个.log文件继续写,同时也会生成对应的索引文件存储数据的索引。当需要读取文件的时候,是先将索引文件加载到内存,通过索引文件就可以快速找到我们要的数据在哪个.log文件中。)
      (3)实现:每个Segment 对应两种【三个】文件
      xxxx.log : 存储数据
      xxxx.index/xxxx.timeindex :对应 .log 的文件的索引
      .index 文件的意义:标记请求的数据在.log文件中对应的位置,以便获取数据的时候可以直接加载到对应的位置读取数据。
      (4)设计:为了加快数据检索的效率
      将数据按照规则写入不同文件,以后可以根据检索规则快速地定位数据所在的文件;
      读取对应的小的Segment文件,不用读取所有的数据文件
      (5)数据的检索规则:
      消费者消费数据是根据offset进行消费的;根据每个分区的偏移量【offset】来划分,每个文件的名字就是这个分区所存数据的最小偏移量。

    每一个segment之所以用最小偏移量来命名,原因有两点:
    (1)加快查询效率:当消费者要查找数据的时候,会根据文件名找到想要的segment(即会拿offset与该文件的最小偏移量进行比较,如果比该最小偏移量还小,则说明数据不在该segment中,会往前面找该数据),以此达到加快查询效率的目的。
    (2)因为消费者必须根据offset 来消费。也因为这样的设计,才能达到消费既不丢失,也不重复。

    1. Offset
      定义:Offset是每条数据在自己分区中的偏移量
      写入分区的顺序就是offset偏移量,offset是分区级别的,每个分区的offset独立管理,都从0开始。
      生成:生产者往Kafka 中写入数据,数据写入某个分区,每个分区单独管理一套Offset【分区】。Offset 从0 开始对每条数据进行编号。
    数据的消费规则:

    生产者往Topic 写入数据的时候,会自动地给每一条数据前面加上分区级别的offset,即每一条数据在分区内部严格按照offset 来进行排序。
    kafka中,offset只保证分区内部有序,无法保证全局有序,除非只有一个分区。但是只有一个分区同样也会带来弊端,只并行度低、性能差。
    每一个消费者消费分区数据的时候,第一次消费都是从当前segment为0的位置开始消费。消费后会立马记住当前的offset,即会记录当前的消费位置。当下一次消费启动的时候,会将这个offset加1,会从该位置开始第二次消费。第二次消费完之后,同样也会记录当前的消费位置offset。依此类推。

    offset存在的意义:

    (1)可以让消费者按照分区级别的offset的顺序来消费;(Offset 用于标记分区中的每条数据,消费者根据上一次消费的offset对分区继续进行消费,保证顺序。)
    (2)可以保证消费数据的时候,既不丢失也不重复。

    小结:
    (1)只要消费者严格按照offset来消费数据,就可以做到消费既不丢失,也不重复。
    (2)每个消费者会自己维护offset,如果该消费者故障导致offset丢失,则消费者就不知道下一次消费要从什么位置开始消费了。于是会出现消费数据丢失或者重复的问题。

    附录:
    Kafka 官网:https://kafka.apache.org/

    相关文章

      网友评论

          本文标题:Kafka

          本文链接:https://www.haomeiwen.com/subject/ayacgrtx.html