00:00
呃,那么咱们呢,呃,因为上午我带着大家总结过,所以说呢,关于我们上午内容呢,我就不带着大家再花钱,这个花时间呢,去我们这个把回顾了,无非就是去虫,以及呢把数据保存ES里边,然后现在咱们直接呢,带着大家去回顾我们这卡夫卡内容,那么卡夫卡呀,除了一些我们的快速的一些入门之外,那么接下来来带大家看一看关于我们的卡普卡架构,它的一个深入啊,看普卡卡这的深入啊,呃,那么咱们现在呢,首先啊,看一看卡夫卡他的一个我们的工作流程,那么具体咱们这卡不卡对吧?那么他是怎么来工作的,其实这个呢,也很容易理解,对吧,一共有这么几个重要的角色,生产者,然后呢,咱们那个消费者,然后以及呢,我们的卡卡它这个集群对吧,那么生产者生产数据,然后发送到咱们这个对应的主题上,那么主题呢,为了提高它的并行度,那么它有它的一个分区,然后接。
01:00
进来,那么为了提高高可用性对吧?每个分区呢,都有我们对应的一个副本啊,都都有对应的副本,然后接下来那么生产者生产消息对吧?那么生产消息,然后接下来咱们现在呢,这个集群呢,接入到消息之后呢,他要把咱们这数据对吧?从我们这个leader同步到我们这个foer啊从leader然后同步到我们这foer,然后接下来由我们现在他的一个消费者组中的消费者来对我们数据啊来进行一个消费,那每次在消费的时候呢,咱们根据什么呢?是根据我们这个opposite偏移量,然到底该从哪消费对吧?那么其实呢,是根据我们偏量来进行消费的,那么整体大概就这样的流程对吧?那么咱们现在呢,这个大家如果觉得这个流程对吧,还是比较陌生的话,那么还是啊,回去把这描述看一看,那么咱们这里呢,给大家说说这个吧,对吧,就是关于我们这卡夫卡呀,它本身文件存储的机制,对吧,上午也让大家看了一下。
02:00
对吧,比如说我们现在呢,要想去我们这个对吧,看一看卡卡的一个存放的一个数据的位置,对吧?在这c do BT model,然后接下来我们这个卡夫卡,那么到卡卡里面去呢,你们改了,你们这里应该有一个date对吧?那是因为你们把这个目录改了,那我如果没改的话,那么咱默认的它其实存在我们这个logs里边,那么在咱们logs里边,那你可以看到除了我这些日志之外,是不是还有我当前对吧?那我哪一个主题,哪一个分区,它的一个内容啊对吧?你可以进到我们这里来看一看,比如说进贸,然后呢大呃进到这里边,那么进到这里边呢,你可以看到我现在这里的数据什么呀,是不是一个log,一个indexcel,对吧?那么这个是怎么回事呢?对吧?那就是我们现在给大家介绍内容卡不卡文件,它的一个存储机制,对吧,那么一个topic里边呢,那么咱们有多个分区对吧,那么分区呢,咱们在存储的时候呢,对吧,其实是。
03:00
存到我们这long下面,那么每一个log下面呢,那应该对吧,其实又分我们的segment对吧,每一个segment呢,包括两个内容,一个呢是我们这个index文件,那么另外一个呢,是log文件,那目前咱们现在呢,在这里我们看到的同学们,我们看到的在我这里看的这两个实际物理存在的东西啊,那其实就是我们现在它的一个segment对吧?包含啊有有我们现在这两个组成,一个是index,一个呢是我们这个log对吧,一个index,一个log,那么接下来,那么咱们现在呢,注意啊,他为什么这么设计啊,为什么这么设计,因为我们说我们现在呢,这个生产者啊,他要不断的去生产消息,对吧?那我的消息越来越大对吧?那么防止说我现在如果不分文件的话,把所有数据都放在一个log里边,那么这个时候这个log文件呢,太大了对吧,那么如果太大的话,从这里边去找消息,说明它的效率比较低呀,所以说呢,咱们现在采用了我们这分片和索引,对吧,那么这两个一个是。
04:00
存放数据的一个呢,是存放索引的,这个索引呢,可以帮助你快速的去定位某些文件在哪里,比如说我现在呢,要去查找,查找谁呢。我现在啊,想查找我们某一个段这个数据,对吧?假如说我先查找我们消息段,或者off outside于三的对这样一个数据在哪对吧?那么首先呢,在咱们这里边,它底层对我们这个数据啊,做了一个我们这个分片啊,Segment啊,然后接下来那么咱们现在这个分片数据呢,它在哪存的啊,其实呢,是在我们这个,呃,数据呢,本身在los里面存着,但是呢,同学们,那我现在呢,这个每一个不同的log文件中,它存放的一个这个消息啊,是不是也是范围也是不一样的呀,对吧?然后接下来,那比如说啊,我当前这里边对吧,这个消息从零开始啊,一直到五,这个消息呢,从六开始,一直到11,然后接下来除了log文件之外,那么其实还有还有一个隐ex文件对吧,那么在它隐ex文件里边呢,它也记录着我当前这个里边的,它所这个对应的我们的消息的索引,比如说我现在是从零开始的,这个从六开始的,那么假如说啊,你现在想查找谁呢?
05:11
就想查找我现在offet为短三的这样一个message,那么这个时候首先呢,它并不会直接去这里查找,它首先呢,要去咱们索引文件中,对吧?来找一找索引为三的这个这个这这这个偏移量应该在哪个音代里存的,那我现在这个名称注意的不是随便取的,这个是不是我现在从零开始啊,这是不是从六开始,那你说我现在所以为三的是不是应该在咱们当前这个index里边来,对吧?所以说呢,它可以找到我们现在呢,诶,它这个对应的index,然后在index里边呢,找到我们现在OUTSIDE3它所对应的一个地址,然后根据这个地址找到咱们现在在log里,在log文件里边,它对应的一个我们的一个路径对应的个地址是谁啊,就找到我对应的数据,对,这其实是个地址,然后呢,到我这个地址,然后到到里边来找到咱们数据对吧,其实整体呢,它的一个存储过程是这样的。
06:08
啊,整个存试过成这样的,那么这块呢,这个大家呢,可能呃,在面试的时候会跟你聊对吧,聊什么呢?就是关于我们现在卡夫卡它本身对一个这个架构,把这架构呢,那必区对吧,把它这几部分生产者,消费者主题分区副本对包括主keepper把这个说一下,然后呢,他肯定会聊我们这个工作机制,文件存储机制对吧,那么这个文件存储机制的,那你应该知道我们底层呢,是以我们segment端来性存储的,那每segment呢,那其实它包括两部分内容,一个是index,一个呢是我们这个log,而且index和log他们文件在命名的时候,对吧,是以我们当前框它第一条消息对吧,它的opposite outside来进行命名的,对吧?所以说看到这个东西的最后这块,它其实表示什么呀,它表示的是我们偏移量啊,表示偏量,那么去哪找这文件呢?对吧,那么去我们真正啊卡卡存放数据的目录,然后呢,这个文件的格式应该是。
07:09
我们这个主题名,然后再加上分区的序号往下去找啊,那么这块呢,是比较基本的内容啊,这是比较基本内容,这是关于我们现在呢,这个文件的存储机制对吧?文件存储机制,然后接下来那么再往下走呢,那么咱们呀,就到了我们这卡夫卡的生产者这块了,对吧?这里边呢,也有好多同学们对吧?这个困惑的地方什么呢?说我们现在啊,这个生产者他本身呢是生产数据对吧?那么生产数据呢,那么咱们的要发送到我们的卡卡不同的一个topic上面去,那我们现在呢,Topic呀,它为了去提升我们的一个必行度,对吧,那么它呢,会有我们一些我们的分区对吧?它会有对很多分区,那么如果说我现在一个topic里有很多分区的话,那么你当前生产者生产的数据,那么到底应该放到哪个分里面去呢?对吧,那这零二分区,这一号分区,这是二号分区,我生产数据我到底往哪个分区里面放都。
08:09
啊,那么这块呢,它有一个原则对吧,那我们现在呢,注意啊,本身我们这里如果要发送消息的话,我们呢有一个producer对吧,然后接下来他会把咱们producer啊去的这个调我们这个散的方法对吧?那么他呢,会把咱们数据的封装成一个producer record这样的一个对象对吧?那么咱们再去调算的方法的时候呀,那么其实呢,你可以啊,去给他传一个product对象啊对象过去对吧?那么再去创建对象的时候,注意,那么这个里边呢,有这么一些我们这个呃,重载的形式对吧?那么上面这些呢,它可以直接指定你要把咱们这消息发送到哪一个主题的哪一个分区中,像这个啊同学们,他是不是可以直接指定我们现在分区呀,对吧?那么如果说如果指明分区的话,直接就将咱们现在这个数据,然后呢,放到我们这分区里面去了,你可以指定分区,那么如果没有指定分区的话,那么这个时候呢,那么。
09:09
你可以指定什么,你可以指定K对吧,就是我现在到底往哪一个分区里边放对吧,就是你现在这里把这这这个value是什么,这value就是咱们要发送的消息对吧,这个value就是咱要发送的消息,看一下吧,同学们,呃,来到这里啊,来到这里我可以怎么看呢?对吧?那么咱们现在这里面应该有一个卡夫卡,然后呢,应该有一个producer对吧,然后接下来那么咱们现在呢,去new一个卡卡producer对吧,这个对象然它里边传的是吧?在这里啊,它里边是不是有一个散的方法,这个send里面传的什么呢?是不是有一个叫producer record呀,对吧,那么咱们就一个对吧,这个叫producer record啊叫record对吧,那么你现在在创建的对象的时候呢,这里对吧,其实就是我刚才所看到的这个对,像这些呢,是直接指定分区了啊,像这些呢,是直接指定分区,对,然后像这个呢,是指定K对这个K呢。
10:09
就是说我现在要把这个数据这这个value代表代表我当年的消息,你要把这消息放到哪个分区里边来,它要根据我的K的哈希值对吧?拿到K的一个哈希值对吧?然后对谁呢?和我们的分居数来做某运算,比如说我现在呢,这里边我分居数是四个呀,对吧?那么它做某运算得到的结果应该是零、一、二、三分别代表几号分区对吧?那么如果是零二分区的话啊,那就把零二分区放,如果是二分区的话,就往二号分区放,对吧?这个是指定K的形式,那么如果没有指定K的话,那么只有一个value,那么这个时候它怎么做的呢?对吧?如果说既没有part的值又没有K值的情况下,那么咱们在第一次调用的时候呢,它生成一个随机的一个整数,然后呢,每次在调这个这个这这这个这个方法的时候,它这个整数的值呢,为自增对吧?然后接下来也是用这个值和我们可用的分区数来进行一个模一算对吧?那么咱们这种算法呢,其实就是我们所说的轮型算法,对吧?Round round Rubin的这样的一个算法。
11:09
对吧?哎,那么一共呢这几种形式,所以说大家注意啊,那么这块呢,也有可能有人跟你聊说我现在我生产的数据对吧,到底放到哪个分区里面去对吧?那么和谁有关系数不是就和我们现在它封装的我们这个producer record里头参数有关系啊,对吧?你可以直接指定分区对吧,你如果不指定的话,它帮你生成一个随机整数对吧,然后再以后再往这里再调这方法的时候呢,这个随机整数的值对吧,会自增,你也可以给我指定一个K,会根据咱们的K它的一个哈希值对吧,来决定来放到我们这哪一个分区里面来,那么大家注意这几种形式,你们哪种用的多,这三种你们在这个发送数据的时候,你们一般用哪种,一般你们说就忽略它的存在来了,对吧,我管它放哪分区的放就行了,对吧,那你得知道我现在啥也没写它其实底层怎么做的,这会你要知道啊,这你要知道对吧?好了,那么咱们把这个完事之后呢,那相当于你现在又聊了一个东西对吧,就是生产者生产数据往哪放。
12:09
所你能跟你聊一块去了,对吧,然后接下来再往下走对吧,再往下走,很重要的东西对吧,稍微停一下。
我来说两句