(5)Kafka原理和高可用介绍
1.Kafka介绍(1)基本概念Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者的所有动作流数据。 这种动作如:活动数据:网站用户行为数据,例如PV(页面浏览量),UV(用户访问量)运营数据: 监控系统性能指标(cpu利用率、负载,内存使用率,磁盘利用率,IO性能)这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决,特性如下:海量数据不可变实时处理对于像Hadoop的一
专栏目录
1.Kafka介绍
(1)基本概念
-
活动数据:网站用户行为数据,例如PV(页面浏览量),UV(用户访问量)
-
运营数据: 监控系统性能指标(cpu利用率、负载,内存使用率,磁盘利用率,IO性能)
-
海量数据不可变
-
实时处理
(2)常用应用场景
-
解耦:在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。 消息队列在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。将Kafka作为整个系统的中枢,负责在任意两个系统之间传递数据。
-
冗余: 如果数据处理失败,除非数据被持久化,否则将造成丢失。消息队列把数据进行持久化直到它们已经被完全处理,这样规避了数据丢失风险。许多消息队列所采用的"插入-获取-删除"范式中, 在把一个消息从队列中删除之前,需要系统明确指出该消息已经被处理完毕,从而确保数据被保存直到使用完毕。
-
扩展性:因为消息队列解耦了处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。不需要改变代码、不需要调节参数。扩展就像调大电力按钮一样简单。
-
灵活性 & 峰值处理能力: 浏览突发场景并不常见,但如果时刻处理峰值比较浪费资源。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。
-
顺序保证:大部分消息队列本来就是排序的,Kafka能保证一个Partition内的消息的有序性。
-
异步通信:消息队列提供了异步处理机制, 允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
2.Kafka结构概念
-
Kafka 把同一类数据进行汇总,每一类数据的集合就是一个Topic, 相当于表。
-
生产者Producer将同一类型的数据写入同一个Topic,消费者Consumer从同一个Topic中消费该同类数据。
-
Topic逻辑上的概念,使用者只用知道Topic即可,无需关系数据存于何处。
-
Topic有多个分区,相当于数据分成多份,存放在不同分区中。
-
分区是 物理概念,每个分区对应一个文件夹,存储分区的数据和索引文件。
-
分区是有序、不可修改的消息队列, 每个分区内消息是有序的。
-
Zookeeper负责保存Kafka的元数据
-
负责Kafka的集群管理,包括配置管理、动态扩展、Broker负载均衡、Leader选举、以及CG变化时重新平衡
-
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)可靠性
更多推荐
所有评论(0)