Kafka 消息存储及检索

原创 2016-02-29 杜亦舒 性能与架构

Kafka是一个分布式的消息队列系统,消息存储在集群服务器的硬盘

Kafka中可以创建多个消息队列,称为topic,消息的生产者向topic中发布消息,消息的消费者从topic中获取消息

消息是海量的,为了消息的读写性能,topic被分为多个部分,称为partition,kafka把每个topic的每个partition均匀的分布在集群中的不同服务器上

所以从整体来看,Kafka的逻辑关系就是:生产者向topic中的某个partition发送消息,消费者从partition获取消息



实际的存储结构中,partition并不是存放消息的物理文件,而是一个目录,命名规则是topic名称加上partition序号,其中包含了这个partition的N个分段存储文件segment

分段存储也是因为partition内容非常多,分成小文件更便于消息的写入和检索



segment也不是一个文件,是由两个物理文件构成:

.index索引文件、.log消息内容文件

这两个文件是成对出现,名称一样,只是后缀不同

实际的存储结构就是这样的



消息是按照顺序产生的,所以每个消息都有一个序号,称为offset,表示partiion的第多少个message,从0开始

每个segment存储了一段offset区间内的消息

segment文件以offset区间的起始值命名,长度固定20位,不足的位用0填充

例如存储了第0-20条的消息,segment文件就是:

00000000000000000000.index
00000000000000000000.log

index文件结构很简单,每一行都是一个key,value对

key 是消息的序号offset

value 是消息的物理位置偏移量



1,0
3,299
6,497
...

说明的就是第几个消息的物理位置是哪儿

log文件中保存了消息的实际内容,和相关信息

如消息的offset、消息的大小、消息校验码、消息数据等

消息检索过程示例

例如读取offset=368的消息

(1)找到第368条消息在哪个segment

从partition目录中取得所有segment文件的名称,就相当于得到了各个序号区间

例如有3个segment

00000000000000000000.index
00000000000000000000.log
00000000000000000300.index
00000000000000000300.log
00000000000000000600.index
00000000000000000600.log

根据二分查找,可以快速定位

第368条消息是在00000000000000000300.log文件中

(2)从index文件中找到其物理偏移量

读取 00000000000000000300.index

以368为key,得到value,如299,就是消息的物理位置偏移量

(3)到log文件中读取消息内容

读取 00000000000000000300.log

从偏移量299开始读取消息内容

完成了消息的检索过程

Kafka 消息存储及检索(作者:杜亦舒)的更多相关文章

  1. Kafka 快速起步(作者:杜亦舒)

    Kafka 快速起步 原创 2017-01-05 杜亦舒 性能与架构 主要内容:1. kafka 安装.启动2. 消息的 生产.消费3. 配置启动集群4. 集群下的容错测试5. 从文件中导入数据,并导 ...

  2. Kafka消息存储原理

    kafka消息存储机制 (一)关键术语 复习一下几个基本概念,详见上面的基础知识文章. Broker:消息中间件处理结点,一个Kafka节点就是一个broker,多个broker能够组成一个Kafka ...

  3. kafka消息存储与partition副本原理

    消息的存储原理: 消息的文件存储机制: 前面我们知道了一个 topic 的多个 partition 在物理磁盘上的保存路径,那么我们再来分析日志的存储方式.通过 ll /tmp/kafka-logs/ ...

  4. OpenResty 作者章亦春访谈实录

    [软件简介] OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器.它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. 通过众多 ...

  5. kafka 消息存储分析

    kafka 可以支持海量数据发送,轻轻松松QPS过十万,如果JVM内存存储这一块如果不够优秀,根本无法支持这么庞大的QPS. 存储架构(这里这是落地数据,并木有涉及到序列化发送数据到broker) R ...

  6. Kafka 消息存储机制

    Kafka 消息以 Partition 作为存储单元,那么在 Partition 内消息是以什么样的格式存储的呢,如何处理 Partition 中的消息,又有哪些安全策略来保证消息不会丢失呢,这一篇我 ...

  7. Kafka 快速起步

    Kafka 快速起步 原创 2017-01-05 杜亦舒 性能与架构 性能与架构 性能与架构 微信号 yogoup 功能介绍 网站性能提升与架构设计 主要内容:1. kafka 安装.启动2. 消息的 ...

  8. Kafka 高可用设计

    Kafka 高可用设计 2016-02-28 杜亦舒 Kafka在早期版本中,并不提供高可用机制,一旦某个Broker宕机,其上所有Partition都无法继续提供服务,甚至发生数据丢失对于分布式系统 ...

  9. Mysql 压力测试工具 mysqlslap

    转载至文章作者:杜亦舒 链接:https://www.sdk.cn/news/4512 来源:SDK.cn 摘要:mysqlslap 是 Mysql 自带的压力测试工具,可以模拟出大量客户端同时操作数 ...

随机推荐

  1. C#中进行单元测试

    首先创建一个项目,写一段待测的程序: namespace ForTest { public class Program { static void Main(string[] args) { } pu ...

  2. DailyReport自动保存工具

    PS:自己初学C#,SharePoint时做的一个小tool. Friday, November 28, 2014 ​这个tool编译出来以后可以把部门的daily report保存到本地,数据库,和 ...

  3. MySQL中删除重复数据的简单方法,mysql删除重复数据

    MYSQL里有五百万数据,但大多是重复的,真实的就180万,于是想怎样把这些重复的数据搞出来,在网上找了一圈,好多是用NOT IN这样的代码,这样效率很低,自己琢磨组合了一下,找到一个高效的处理方式, ...

  4. WPFの单例模式

    版本一: /// <summary>/// A simple singleton class implements./// </summary>public sealed cl ...

  5. Wpf再次学习,分享给入门的朋友

    一.WPF介绍 先说下WPF,她的简称是Windows Presentation Foundation,注意到Presentation这个单词了吧,展现的意思,后面那个是基础,展现基础,WPF是一种展 ...

  6. HDU4549 M斐波那契数列 矩阵快速幂+欧拉函数+欧拉定理

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  7. Android-图片按钮汇总

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  8. Socket重叠IO

    1.为什么到现在才弄懂这个 不知道这个Socket重叠IO这种模型是不是socket IO完成端口的基础,不过我感觉,学习一下这个再去学习socket IO完成端口是比较有好处的. 这个Scoket重 ...

  9. DataTables warning : Requested unknown parameter '5' from the data source for row 0

    在该项目中我使用了jquery.dataTables.js来作为我的前端数据表格. 表格的官网地址:https://www.datatables.net/ 一.jsp部分代码片段如下: <tab ...

  10. CurlSharp

    https://github.com/masroore/CurlSharp clone版本库之后,在本地使用,会遇到找不到dll的情况 编译EasyGet项目之后,进行调试,会提示 System.Ba ...