文档章节

Apache Kafka源码剖析:第6篇 日志存储系列1-基本概念

强子哥哥
 强子哥哥
发布于 2017/08/13 16:04
字数 965
阅读 145
收藏 0
点赞 0
评论 0

下面开始将日志存储相关。

1 基本概念

kafka使用日志文件来保存生产者发送的消息。

既然是文件,就有偏移量,在kafka中,我们用术语offset来表示这个偏移量。(逻辑值而非物理值)

那么每条记录就有一个自己唯一的offset,

本质都是一样的!

既然是唯一,那么就可以跟mysql中的主键类比起来,也就是说,offset唯一确定了分区中的一条消息,

这个很简单,没啥好说的。

 

注意:上面明确说了是确定分区中的一条消息,因为消息会入到一个topic的其中1个分区里,一个topic会包含多个分区,单一分区内消息有序,分区之间不保证有序,这一点一定要注意了!

 

可能很多人用过redis,对redis的快很有体验,那么对kafka的磁盘操作是否可以这么快表示怀疑,

真相只有1个,那就是顺序IO操作,顺序IO操作到底嘛意思?就是磁盘不用花时间去寻道寻址了,否则读写磁头换来换去,把磁头累的不行了,效率还低。。。得不偿失,所以顺序IO!!!避免了随机写入带来的性能问题。

 

我们知道,topic分成多个分区partition,每个分区分成多个副本,

小贴士:
想一想mongodb和elasticsearch的存储机制,是不是很熟悉,
这就对了,技术的解决方案都是类似的。

存储一定是有状态的,只有涉及到网络的才是无状态的。

当1个分区的副本被指定到某个broker上,自然就要创建相应的文件夹了,文件夹里放日志log文件!

---

kafka中一般存储了海量数据,为了避免日志文件太大,Log不是只写成1个文件

想一想,如果只有1个文件,那得多大。。。怎么写,怎么删除?
管理都不好管理!!!

既然不是写成1个文件,那是啥?对应到磁盘上的一个目录,目录的命名规则是

topic_partitionid, log和分区是一一对应的,对应分区里的消息全部存储在这个分区目录下的日志文件里。

 

刚才说了,一个分区对应一个目录,目录里不是放一个文件,就是多个文件,每个文件我们称之为segment,分段,也就是把一个大文件拆分成多个小文件。

每个文件称之为 segment. 一个segment对应着一个日志文件和一个索引文件。

这就比较清楚了,不需要解释了!

日志文件用于记录具体的真实的消息,索引自然是为了加速,想想mysql的索引,一个意思。

随着消息的写入,段文件越来越大,到达一个阈值后,就创建新的日志文件和索引文件继续写

其实也就是产生了新的段segment文件!

 

文件名的规则是baseOffset.log,怎么理解 baseOffset?

就是本文件包含的第一条消息的offset,我们之前说了分区内消息是绝对有序的,拆分成多个segment后

单个segment也是绝对有序的,这个不需要解释了!

 

为了提高查询效率,每个日志文件对应了一个索引文件,但是,这个索引文件没有为每条消息都创建索引项,而是采用稀疏索引的方式为部分消息创建索引!

这样,找的时候,先通过二分法快速找到大致区域,然后在小范围内快速遍历,搞定!

下一节开始讲解代码!

© 著作权归作者所有

共有 人打赏支持
强子哥哥

强子哥哥

粉丝 856
博文 551
码字总数 647493
作品 8
南京
架构师
apache kafka技术分享系列(目录索引)

目录索引: Kafka使用场景 1.为何使用消息系统 2.我们为何需要搭建ApacheKafka分布式系统 3.消息队列中点对点与发布订阅区别 kafka开发与管理: 1)apachekafka消息服务 2)kafak安装与使用 ...

dannyhe ⋅ 2015/09/06 ⋅ 1

Kafka文章索引(入门)

目录索引: 1)apache kafka消息服务 2)kafka在zookeeper中存储结构 3)kafka log4j配置 4)kafka replication设计机制 5)apache kafka监控系列-监控指标 6)kafka.common.ConsumerRebala...

阿莱倪士 ⋅ 2014/11/27 ⋅ 0

分布式消息系统 Kafka 简介

Kafka是分布式发布-订阅消息系统。它最初由LinkedIn公司开发,之后成为Apache项目的一部分。Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务。它主要用于处理活跃的流式数据。 ...

xrzs ⋅ 2014/08/19 ⋅ 0

kafka系列文章索引

apache kafka在数据处理中特别是日志和消息的处理上会有很多出色的表现,这里写个索引,关于kafka的文章暂时就更新到这里,最近利用空闲时间在对kafka做一些功能性增强,并java化,虽然现在已...

Gaischen ⋅ 2013/03/25 ⋅ 7

分布式消息kafka

Kafka是分布式发布-订阅消息系统。它最初由LinkedIn公司开发,之后成为Apache项目的一部分。Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务。它主要用于处理活跃的流式数据。 ...

qq592fbb5b34ad7 ⋅ 2017/06/06 ⋅ 0

分布式消息系统:Kafka

Kafka是分布式发布-订阅消息系统。它最初由LinkedIn公司开发,之后成为Apache项目的一部分。Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务。它主要用于处理活跃的流式数据。 ...

qq58edeba279279 ⋅ 2017/04/27 ⋅ 0

Java后端工程师学习大纲

之前自己总结过的Java后端工程师技能树,其涵盖的技术点比较全面,并非一朝一夕能够全部覆盖到的。对于一些还没有入门或者刚刚入门的Java后端工程师,如果一下子需要学习如此多的知识,想必很...

JackFace ⋅ 2016/07/08 ⋅ 0

kafka系列文章索引(结束)

apache kafka在数据处理中特别是日志和消息的处理上会有很多出色的表现,这里写个索引,关于kafka的文章暂时就更新到这里,最近利用空闲时间在对 kafka做一些功能性增强,并java化,虽然现在...

老先生二号 ⋅ 2017/05/28 ⋅ 0

源码圈 365 胖友的书单整理

🙂🙂🙂关注微信公众号:【芋道源码】有福利: RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表 RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址 您对于源码的疑问...

芋道源码掘金Java群217878901 ⋅ 2017/09/21 ⋅ 0

大数据和云计算技术周报(第9期)

写在第9期周报 坚持是一种品格!社区祝大家新年快乐! “大数据” 三个字其实是个marketing语言,从技术角度看,包含范围很广,计算、存储、网络都涉及,知识点广、学习难度高。 #大数据和云...

znzqhb07nr ⋅ 01/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 32分钟前 ⋅ 0

VS2015配置并运行汇编(一步一步照图做)【vs2017的链接在最后】

前言 我是上学期学的汇编,因为有vs又不想用课上教的麻烦的dosbox以及masm32,但是一直没找到高亮插件和能调试的(难在运行不了而找不到答案上,出现的错误在最后放出,还请先达们不吝指点)...

simpower ⋅ 41分钟前 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 44分钟前 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 51分钟前 ⋅ 0

你真的明白RPC 吗?一起来探究 RPC 的实质

你真的明白RPC 吗?一起来探究 RPC 的实质 不论你是科班出身还是半路转行,这么优秀的你一定上过小学语文,那么对扩句和缩句你一定不陌生。缩句就是去除各种修饰提炼出一句话的核心,而不失基...

AI9o後 ⋅ 53分钟前 ⋅ 0

z-index设置失效?

今天碰到了一个问题,就是在给li设置提示框的时候,有用到遮罩效果,本来想把对应的出现在最顶层,可是不管将li设置的z-index值设为多大,li都没有出现在遮罩层之上。 我在网上查了z-index设...

IrisHunag ⋅ 今天 ⋅ 0

CyclicBarrier、CountDownLatch以及Semaphore使用及其原理分析

CyclicBarrier、CountDownLatch以及Semaphore是Java并发包中几个常用的并发组件,这几个组件特点是功能相识很容易混淆。首先我们分别介绍这几个组件的功能然后再通过实例分析和源码分析其中设...

申文波 ⋅ 今天 ⋅ 0

Java对象的序列化与反序列化

Java对象的序列化与反序列化

Cobbage ⋅ 今天 ⋅ 0

Sqoop

1.Sqoop: 《=》 SQL to Hadoop 背景 1)场景:数据在RDBMS中,我们如何使用Hive或者Hadoop来进行数据分析呢? 1) RDBMS ==> Hadoop(广义) 2) Hadoop ==> RDBMS 2)原来可以通过MapReduce I...

GordonNemo ⋅ 今天 ⋅ 0

全量构建和增量构建的区别

1.全量构建每次更新时都需要更新整个数据集,增量构建只对需要更新的时间范围进行更新,所以计算量会较小。 2.全量构建查询时不需要合并不同Segment,增量构建查询时需要合并不同Segment的结...

无精疯 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部