00:00
好,接下来呢,我们来看一下卡不卡文件的一个存储,肯定呢,会有很多同学好奇,说海哥发过来一个数据存到卡卡集群当中,那它到底在底层当中是怎么存储的呢?那接下来我们就来解决一下这个问题哈。打开。打开之后,首先第一个说topic是一个逻辑上的概念,而分区是物理上的概念,那这句话怎么理解?首先啊topic啊,其实我们就叫一个名字,比如说是浏览日志。知道吗?那它在底层怎么存呢?由谁来决定呢?哎,由他一个分区来决定,你看比如说这个topic是100T的数据。那未来我希望呢,把它分散到每一个分区里面,比如说它33T,它33T,诶它33T这样进行一个存储,比如说在硬盘上是以分区的形式进行存在的。但是呢,外部的叫法上呢,哎,都叫topic主题,所以说要区分这两个概念啊,Topic呢是逻辑上的,那分区呢,是物理上实实在在存储数据的。
01:03
那下面下一个问题,说每个分区对应一个log文件,说在这个分区下面呢,有对应的log,记住这个log文件也是一个虚拟的概念,其实啊,它在底层的时候,你看不到这个log的文件夹。那为什么还这么叫呢?哎,主要是还记得咱们配置卡夫卡存储数据的时候,是不是叫log什么DR啊,哎,所以说这里面有一个log文件的概念哈。那在这个log文件下面存储的什么呢?哎,存储的数据是以S文件的形式进行存储的,因为啊,假如说你到一个分区里的数据是33T。那这个大小还是非常非常大的,就不利于我们进行一个查看的,比如说打开一个33T的文件,那我估计啊,你得等着一天也不一定能打得开,对吧,咱之前打开过,比如说一个100兆的文件,启动的时候都需要很长时间呢,啊所以说这里面那怎么办呢?那33T这么大的文件,我肯定要把它再进行一个切割,那下面再切割的物理单元,哎,就是对应的叫segment。
02:03
那这个一个S的大小呢,就是一个G,哎,给你再切割成一个G,一个G的文件啊,进行存储啊,是这个意思啊。那行。那一个topic呢,可以分为多个分区,这是第一个切割。那接下来一个分区可以分为多个segment,比如说一个分区呢,我再切割成诶多个segment。往下走,那S呢,它默认大小呢是一个G,同时它是由这些内容进行组成。一个STEM包含点文件,也就是存储实实在在数据的地方。那么一个G的数据量其实还是蛮大的,我要想快速定位我这一个G当中任何一个数据的位置,那我们还需要对它进行一个创建索引,那这个索引文件就是点index。那下面呢,还有一个叫点time index,那这个有啥用呢。大家有没有思考这样一个问题啊,说海哥这个数据进到卡瓦集群之后。
03:03
咱们说消费者消费完毕之后,不会删除这里面的数据。那既然消费者不会删除这里面数据,那集群当中数据什么时候删呢?我不能一直不删吧,哎,总得有一个删除机制啊,其实是这样的哈,卡巴里的数据呢,默认的是七天,比如说保存七天,七天之后就会删除里面对应的数据。那么怎么判断有没有超过七天呢?那在里面这个点time index。就起到了这个判断,这个日志保存多久啊,就起到这样一个作用哈,当然了还有一些其他文件啊,那后面我们再说啊。行,那往下看,那下面的底层呢,就是以这样的文件形式进行存储的,那你会发现这个文件存储的名字是不是有点意思啊。啊,有点什么意思。其实呢,它这里面啊,Index和log的文件是以当前segment第一条信息的offset啊命名的,啥意思呢?啊,比如说我现在呢,这是4096,那就说明前一个文件最大的那个索引呢,是4095。
04:06
那这个呢,它的一个最后一个文件内容呢,就是16383啊是这样,就是他们之间是连着的啊,连着一个挨一个啊。啊,那这里面还有一些小的问题啊啊给大家看一下啊,第一个说生产者啊的数据会被不断的追加到log文件的末尾,比如说这个segment文件呢,它是一行一行往里面追加的。那追加代表什么含义呢?追加代表的是历史的数据,无进行修改。你看来一条历史的我不改,那这样的话呢,它这个读写速度就要快一些是吧,你要修改历史的,那你要改起来首先得查到,查到之后再进行一个修改,那这样呢是要慢一些啊,所以说这里面采用追加的方式呢,呃,也是卡普卡作为高效读写的其中一个非常重要的原因,后面呢,会给大家总结卡卡如何做到高效读写有哪几个方面啊,这是其中一个啊,要记住。
05:01
那接下来说为了防止这个文件过大啊,定位效率低下好不好呢?采用了分片和索引,所以刚才也说了啊,就是采用这个segment,那每个segment文件呢,包含这么多啊,那这些文件放在一个文件夹下,该文件夹的命名规则。这个要注意一下啊,它是采用主题加上对应的分区号,那我们创建了一个负二主题,那零号分区,哎,那这下面存储的就是负二式的主题,零号分区对应的一个数据。这个呢,就是淘宝的文件存储机制,那下面我们来验证一下它到底是不是这样存储的好吧。那下面呢,有对应的一个命令啊。首先呢,这里面呢,我们可以启动一个生产者印象里面发送对应的数据,其实这个我们分主题有对不对,哎,那有的话你就不用这个创建了哈。那接下来往下看,那看一下我这个数据存储在什么路径上啊,这里说是卡卡date斯啊,然后呢,First杠一杠零杠二,好吧,那我们找一下。
06:00
PWD。CD date。进来进来之后呢,你看这里面是不是有这个first杠零啊,那进去。进来之后你会发现啊,确实有这么多文件,你看I有0INDEX啊,点log.time in time啊,另一个呢是快照啊,以及其他的一些信息,这也不用管了,那好同学肯定说,那海哥见到这个文件我就想看一下对不对,那咔看。看看行不行啊行。Index。哎,发现这里面没数啊,那我看另一个。看谁呢?我看点唠,看行不行。发现这个看不了啊,看不了,看到这个文件大家有没有想起点啥,之前在看high洞的文件的时候,它底层是不是也是这样的。那这个是什么文件呢?哎,它是序列化之后的文件,那我看不到,我感觉心里有点痒痒啊,我就想看一下,那怎么办呢?哎,这里面给大家提供了一个它系统的命令啊。在哪里呢?在这里面。
07:00
它有一个系统工具啊,叫这个呃,叫卡run class.sh啊,对应的脚本,然后卡tools啊,然后点D这个东西啊,然后杠S,然后对应的指定这个文件的名称就可以了,我们试一下啊好吧。啊,那指定对应的文件。我先看一下index。哎,你看index里面其实就存储了一条数据,UPET0 position0。好同学有点诧异了,说,海哥,你存储了那么多数据,这里面只记录一条索引,这是咋回事呢?哎,先买一个伏笔,一会儿呢给大家解释。那我来看一下这个log走。哎,现在呢,这个love文件呢,我们就能查看了,那查看了这么多,那这里面啥意思呢。搂眼啊,往下看。说这里面有这个base off啊,零啊,然后last of0,然后COUNT1啊,然后之后这边还有一个position。
08:02
这POSITION0啊,POSITION0也是零号位子,然后呢是这个啊,Base off1,然后LAST5,然后POSITION75 position211 position287,哎,也就这里面是实实在在存储数据的地方。嗯,好。那我们把这个给他定出来啊。上面的这个是INDEX0。另一个。嗯,先放在这儿,那下面呢,再定一条这里面的日志。那有了这个日志之后呢,下面呢,给大家详细解释一下。看里面的数据。那双击这个PPT打开啊,先把这个。打开之后啊,这里面给大家解释一下log文件和index文件到底怎么进行存储的哈,首先介绍一下这里面的是S格零对吧?哎,对应的是index log,那这个呢是S1,它对应的是off outside,所以呢是从522开始的啊,然后呢,Index log,那下面呢,这还有一个S2对应的。
09:08
那每一个S的大小呢,哎,都是一个G啊一个G。那么一个G,下面首先看这一问题。有大学好奇,说这个index里面只记录一条,按理说你这个索引应该对每一条数据进行创建,索引是这么理解的吧?哎,那这个呢,卡普卡呢,还不是这么设计的,它怎么设计呢?它叫这么设计。就说index为稀疏。所以。这个名词一定要记住啊,面试的时候考哈,那大约每网log文件里面写入4KB的数据,那我们往index文件里面写入一条索引,比如说这个里面啊,存入4KB的数据,我才会记录一条索引,那很显然我们这里存储的数据是不是没有到4KB啊啊,所以说只记录一条。好,那参考这个文件默认这个参数啊,这个参数呢,就是4KB行。
10:00
那么既然它这么纯,那下面我比如说我要找一个什么呢?我要找一个offset为600的。这么一个文件的位置,那我怎么找啊。好,那你是600,首先他看这个。你看这是啥?六百六百是不是大于它小于它呀,那你既然小于它,你说这个文件在哪?哎,那是不是应该是在这个缩音里面,哎,对,那就这么着好定位到这,定位到这儿之后,那它下面进一步的进行一个定位啊,进行一个定位来找600。啊,看一下这个位置,那你既然是600,我这是522,它实际底层存的是按相对路径进行存储的,比如说65啊,65加上它啊,那多少啊。65加上它呢,就是587对吧,那587,那这个呢,117加上522是不是600多了呀,那是不是它应该是在这个索引往下找这个位置啊,对吧?哎,那你看一下这个位置。
11:01
你看我这里只存了一个off塞零啊OFFET0,那相当于只存了一个相对off塞,记住啊,这个绝对off塞呢,是我给你加的,方便你进行一个理解哈,那你看那这里面有一个注意事项。说index文件中保存的offset为相对offset,比如保存的是这个。这样呢,能保证up的值所占用的空间不会过大,因为你一直保存这个绝对up,那是一直往上增加,那会增加的啊,非常非常大啊,所以说呢,它采用了呃优化的手段啊,纯的是这个相对奥赛糖。好,那再往下找啊,往下找来看。那找到这个up,你说定位到这条之后,那接下来的position它的起始位置是不是6410啊,哎,那position是630,那接下来它怎么办呢?哎,它这样去找你这是6410,那我这面是不是也有对应的呢?你看这里面。这里面是不是有对应的一个位置,POSITION0 position75 position211啊,哎,那好,那他就往这找,那我现在呢,这是赶巧了,这是6410,这是6410,那如果我这是6415呢。
12:09
那是不是也在这里面啊啊,因为它小于它大于它是吧?哎,从这往下找啊。那往下找,直到定位到它对应的存储位置就可以了,啊,就是这样一套过程啊,所以这个呢,就是稀疏索引,这里面这个呢是一定要记住的,面试的时候有些面试官会问说卡好,这个存储日志的时候,它的索引是按照什么方式进行存储的,那这里面就是按照稀疏索引进行存储,那怎么个原理呢?哎,就是log日志,每存储4KB的文件。我在这个index里面才会记录一条索引日志。就这么一个面试题啊,大家要知道。
我来说两句