(5)Kafka原理和高可用介绍

专栏目录

(1)大数据和应用场景介绍

(2)大数据技术综述总结

(3)HDFS原理与高可用技术原理介绍

(4)Yarn架构、资源管理原理和运维技术介绍

(5)Kafka原理和高可用介绍

1.Kafka介绍


(1)基本概念

    Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者的所有动作流数据。 这种动作如:
  • 活动数据:网站用户行为数据,例如PV(页面浏览量),UV(用户访问量)
  • 运营数据: 监控系统性能指标(cpu利用率、负载,内存使用率,磁盘利用率,IO性能)
    这些 数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决,特性如下:
  • 海量数据不可变
  • 实时处理
    对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。 Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消费。

(2)常用应用场景

    作为一个 消息队列,Kafka避免了交叉信息传递中消息传递混乱的现象,作为一个中间数据收集、汇总层,对多种消息传递场景进行解耦,并且自身具有相当优越的冗余机制和高扩展性。
  • 解耦:在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。 消息队列在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。将Kafka作为整个系统的中枢,负责在任意两个系统之间传递数据。
  • 冗余如果数据处理失败,除非数据被持久化,否则将造成丢失。消息队列把数据进行持久化直到它们已经被完全处理,这样规避了数据丢失风险。许多消息队列所采用的"插入-获取-删除"范式中, 在把一个消息从队列中删除之前,需要系统明确指出该消息已经被处理完毕,从而确保数据被保存直到使用完毕。
  • 扩展性:因为消息队列解耦了处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。不需要改变代码、不需要调节参数。扩展就像调大电力按钮一样简单。
  • 灵活性 & 峰值处理能力浏览突发场景并不常见,但如果时刻处理峰值比较浪费资源。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。
  • 顺序保证:大部分消息队列本来就是排序的,Kafka能保证一个Partition内的消息的有序性。
  • 异步通信:消息队列提供了异步处理机制, 允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

2.Kafka结构概念


(1) Broker(代理)
    一个Broker就是Kafka集群中的 一个节点,多个Broker组成了Kafka集群。
(2)  Topic(主题/表)
  • Kafka 把同一类数据进行汇总,每一类数据的集合就是一个Topic, 相当于表
  • 生产者Producer将同一类型的数据写入同一个Topic,消费者Consumer从同一个Topic中消费该同类数据。
  • Topic逻辑上的概念,使用者只用知道Topic即可,无需关系数据存于何处。
(3) Partition(分区)
  • Topic有多个分区,相当于数据分成多份,存放在不同分区中。
  • 分区是 物理概念,每个分区对应一个文件夹,存储分区的数据和索引文件。
  • 分区是有序、不可修改的消息队列, 每个分区内消息是有序的
(4) Replication(副本)
     分区的副本,每个副本存储在不同的Broker中。
(5) Producer(消息生产者)
     向Broker发布消息的客户端
(6) Consumer(消息消费者)
      消费Broker中信息的客户端
(7) Consumer Group(CG,消费者组)
       将多个消费者作为一个群体
(8)  Zookeeper
  • Zookeeper负责保存Kafka的元数据
  • 负责Kafka的集群管理,包括配置管理、动态扩展、Broker负载均衡、Leader选举、以及CG变化时重新平衡
(9) Message
    消息是Kafka通讯的基本单位, 有一个固定长度的消息头和一个可变长度的消息体(payload)构成。在Java客户端中又称之为记录(Record)。 
    消息结构各部分说明如下: 
  • CRC32: CRC32校验和,4个字节。
  • magic: Kafka服务程序协议版本号 ,用于做兼容。1个字节。
  • attributes: 该字段占1字节,其中低两位用来表示压缩方式,第三位表示时间戳类型(0表示LogCreateTime,1表示LogAppendTime),高四位为预留位置,暂无实际意义。
  • timestamp: 消息时间戳,当magic>0 时消息头必须包含该字段。8个字节。
  • key-length: 消息key长度,4个字节。
  • key: 消息key实际数据。
  • payload-length: 消息实际数据长度,4个字节。
  • payload: 消息实际数据 在实际存储一条消息还包括12字节的额外开销(LogOverhead):
    • 消息的偏移量: 8字节,类似于消息的Id。
    • 消息的总长度: 4字节

3.Kafka工作原理


(1)工作机制

    一些Producer向Kafka集群发布消息,之后由多个Consumer从Kafka集群中消费消息,Zookeeper为Kafka集群提供了相应的协调服务。

(2)存储过程

    消息在Broker中按照Topic进行分类,并且在每个Topic中有多个分区,分区又可以有多个Replication副本,这些副本存放在不同的Broker中。

(3)写入过程

  • Kafka中分区是一个FIFO队列,所以写入某个Partition中的消息是采用在队列末尾追加的形式,而消费消息是从队列头部来顺序进行读取。

  • 一个Topic可分为多个Partition,仅保证同一分区内消息有序存储,不保证Topic整体(多个分区之间)有序

(4)读取过程

  • CG消费者组是为了加快消费的读取速度的一个模型,一个消费者组中的多个消费者可以并行消费同一个Topic中的数据

  • 多个CG可以消费同一个Topic,这些消费者组之间是平等的,即同一条消息可同时被多个消费者组消费

  • 同一个CG消费者组中的多个Consumer消费者之间是竞争关系,也就是说同一条消息在一个消费者组中只能被一个消费者所消费

4.数据存储


(1)Partition(分区)

  • Partition是一个物理结构,它的实际存储在一个文件夹目录内,目录中包含若干个Segment文件(见下)。

(2)Segment(段文件)

  • Segment文件时Kafka中的最小存储单元

  • 它是由以消息在分区中的起始偏移量命名的数据文件(*.log)和索引文件(*.index, *.timeindex)组成

 

(3)Offset(偏移量)

    偏移量是定位消息在分区队列中位置的分区编号。也是消息在分区队列中的唯一标识,它是由Zookeeper来负责维护的。

5.索引机制


(1)索引设计

  • 提高消息写入和查询速度

  • 为每个partition创建索引,索引文件存储在partition文件夹下

(2)两类稀疏索引

    ①偏移量索引

  • 它是由Offset偏移量作为文件名称,以.index作为后缀的一个文件。其文件内部的内容格式是offset,position的形式。该偏移量索引采用了稀疏存储的存储方式。

    ②时间戳索引

  • 该文件是以.timestamp作为后缀的文件,内容格式是timestamp,offset的形式。该文件同样采用了稀疏存储的存储方式。

    

(3)索引过程

  • 首先按照偏移量查询数据,会查找Kafka偏移量索引,缩小要查找数据的范围,然后在小范围中进行快速扫描,即可加快查询的速度。

  • 时间戳索引也是一样,缩小要查找的范围,然后在小范围中进行查询。

6.高可用原理(待补充)


(1)可靠性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值