`

Kafka 原理、消息存储机制、Message学习(ISR)

 
阅读更多
Topic中的所有数据分布式的存储在kafka集群的所有机器(broker)上,以分区(partition)的的形式进行数据存储;每个分区允许存在备份数据/备份分区(存储在同一kafka集群的其它broker上的分区)。

每个数据分区在Kafka集群中存在一个broker节点上的分区叫做leader,存储在其它broker上的备份分区叫做followers;只有leader节点负责该分区的数据读写操作,followers节点作为leader节点的热备节点,从leader节点备份数据;当leader节点挂掉的时候,followers节点中会有一个节点变成leader节点,重新提供服务

Kafka集群的Partition的leader和followers切换依赖Zookeeper

Kafka分布式保证的第一个特性就是:Kafka的Replication

Kafka的Replication指的是Partition的复制,一个Partition的所有分区中只有一个分区是leader节点,其它分区是follower节点。

Replication对Kafka的吞吐率有一定的影响,但是极大的增强了可用性

Follower节点会定时的从leader节点上获取增量数据,一个活跃的follower节点必须满足一下两个条件:

1.所有的节点必须维护和zookeeper的连接(通过zk的heartbeat实现)
2.follower必须能够及时的将leader上的writing复制过来,不能“落后太多”; “落后太多”由参数{replica.lag.time.max.ms}{replica.lag.max.messages}决定。

Kafka分布式保证的第二个特性就是:Kafka Leader Election

Kafka提供了一个in-sync replicas(ISR)来确保Kafka的Leader选举,ISR是一个保存分区node的集合,如果一个node宕机了或数据“落后太多”,leader会将该node节点从ISR中移除,只有ISR中的follower节点才有可能成为leader节点

Leader节点的切换基于Zookeeper的Watcher机制,当leader节点宕机的时候,其他ISR中的follower节点会竞争的在zk中创建一个文件目录(只会有一个follower节点创建成功),创建成功的follower节点成为leader节点

一个Topic分为多个Partition来进行数据管理,一个Partition中的数据是有序、不可变的,使用偏移量(offset)唯一标识一条数据,是一个long类型的数据。

Partition接收到producer发送过来数据后,会产生一个递增的offset偏移量数据,同时将数据保存到本地的磁盘文件中(文件内容追加的方式写入数据);Partition中的数据存活时间超过参数值(log.retention.{ms,minutes,hours},默认7天)的时候进行删除(默认)

Consumer根据offset消费对应Topic的Partition中的数据(也就是每个Consumer消费的每个Topic的Partition都拥有自己的offset偏移量)

注意:Kafka的数据消费是顺序读写的,磁盘的顺序读写速度(600MB/sec)比随机读写速度(100k/sec)快。

一个Kafka的Message由一个固定长度的header和一个变长的消息体body组成。

header部分由一个字节的magic(文件格式)和四个字节的CRC32(用于判断body消息体是否正常)构成。当magic的值为1的时候,会在magic和crc32之间多一个字节的数据:attributes(保存一些相关属性,比如是否压缩、压缩格式等等);如果magic的值为0,那么不存在attributes属性

body是由N个字节构成的一个消息体,包含了具体的key/value消息

存储在磁盘的日志采用不同于Producer发送的消息格式,每个日志文件都是一个“log entries”序列,每一个log entry包含一个四字节整型数(message长度,值为1+4+N),一个字节的magic,四个字节的CRC32值,最终是N个字节的消息数据。每条消息都有一个当前Partition下唯一的64位offset,指定该消息的起始下标位置,存储消息格式如下:



这个“log entries”并非由一个文件构成,而是分成多个segment file(日志文件,存储具体的消息记录)和一个索引文件(存储每个segment文件的offset偏移量范围)。 结构如图所示:



转自:http://www.cnblogs.com/liuming1992/p/6425536.html

  • 大小: 18.7 KB
  • 大小: 226.5 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    大数据Kafka入门--理论+实践

    Kafka消息的格式具有一定的规范,message length记录了消息的总长度,magic值用于标识消息格式版本,而crc值提供了消息内容的校验。消息的大小被限制在了1M以内,且可以配置。消息的格式还包括了消息体payload的大小...

    kafka研究和文档阵整理

    - **存储**:消息按Topic进行存储,且Kafka会根据设定的时间或大小保留已发布的消息。 - **格式**:消息通常以字节数组的形式在网络上传递。 3. **Partition** - **定义**:是Topic的物理分片,用于提高并发...

    Kafka知识汇总 18道

    消息(Message)是Kafka中最基本的数据单元,由Producer推送至Broker。Producer使用Push模式发送消息,而Consumer则使用Pull模式从Broker中获取消息。Kafka还支持消息的批量发送,以提高效率。此外,Kafka的消息可以...

    kafka培训.pptx

    【Kafka 入门到精通】的讲解涵盖了多个关键知识点,包括消息系统的优点、Message Queue 的对比、Kafka 的架构及特性。以下是这些内容的详细阐述: 1. **为何使用消息系统** - **数据持久化**:消息系统能够确保...

    四十万字数总结三大主流MQ的底层实现原理以及实战问题解决方案

    与RabbitMQ不同,Kafka更专注于实时数据流处理,它的核心是发布/订阅模型,消息以日志形式存储在主题(Topic)中,每个主题可以分为多个分区,确保高吞吐量。Kafka的特点在于其强大的消息持久化能力,可以实现毫秒级...

    面试题得物1

    7. **Kafka消息可靠性**:Kafka通过消息持久化、多副本、ISR机制等确保消息不丢失。Kafka可以调整offset来重置消息位移点。 8. **RocketMQ消息不丢失**:RocketMQ通过Producer确认机制、Broker冗余、MessageId和...

Global site tag (gtag.js) - Google Analytics