00:00
好,同样的,我们还是把头一天所讲的东西做一个回顾啊,那一天呢,我们主要讲的是这个架构这块的内容,也就是说更多的是一些原理型的东西,那这样这次复习的时候呢,我觉得不是说按照这个顺序来啊,按顺序我直接就这样来跟大家说一下,大家一直记,也不是说你把文档背下来,因为那时候我们上课的一个思路是这样,呃,第一个还是一样的,把整个的东西呢,分为什么?三大模块来记对吧?啊三大模块这是我们所说的,最前面这个叫生产者这块中间的是。卡法集群brook吧啊broke,那后面这个呢,消费者吧啊消费者consumer啊,就produce这个broke,还有一个consumer,好,那我们回想一下生产者这块我们要关注的有哪些事情。嗯。对吧,生产者这块我们要关注的就是我们上课讲的有哪些东西,第一个就是我们所讲的生产者这边他的一个分区策略问题。
01:12
对吧,啊,分区的一个策略问题,就是说这块呢,因为你涉及到后面存储的时候,那这样我们不应该从这开始,应该从波克这块来。啊,从博这块开始聊啊,那博是我们所说的存储数据的一个地方。呢,是我们所讲的一台一台的什么。机器一台一台的服务器,实际上呢,这个博是一个卡不卡的一个进程,对吧,你启动卡卡进程那个东西呢,叫博啊那个东西叫博,OK好,那这个存东西,我们所讲的它应该是存在。他里面的。对吧,现在topic,但是我们还讲了一个问题,Topic呢,它只是一个逻辑上的概念。物理上的概念是谁呀,分区,因为我们看到的那个内容是不是主题杠零杠一主加分区的这种方式,对吧,所以第一个这个主题啊,它要分区。
02:10
啊,它是分区的,他这个A有零,它A还有什么。一还有一好,那你是一个集群在工作的,那有可能某一台机器会挂掉,对吧,那为了防止挂掉对我们整个产生的影响。我们对于这个topic还有一个什么进展?副本对吧?啊,那你一聊套表这两个东西聊出来,好,那我们再回头想一下,分区有什么好处。提高了第卡卡进行一个整个的负载能力,对吧?啊,因为你卡卡呃卡卡整个topic与topic之间,可能它这个数据差异比较大,所以呢,我们想着把每一个topic里面的数据都给它分机器放,对吧?啊那就分。区啊,分区第二方面是给我们生产和消费,就读写可以提高它的一个什么。
03:05
便度对吧,啊,读写数据都可以提高他的一个必因度啊,更重要的其实侧重于消费者这边啊,消费者的一个消费速度,因为我们所讲的生产速度这块的话。我们之前所讲的,如果两边速度不对等。两边速度不对等,一般是谁速度比较小的时候容易出问题。消费速度吧,伸展速度如果过小无所谓的,因为你在生产环境当中,你像那个凌晨凌晨的时候,那那个时候几乎很少人访问你网站,那你这边伸展速度就相当于是什么。是零对吧?啊,生产速度相当于零,那这个没关系,这个没关系,但是它带来的问题就是有可能会告诉资源对吧,浪费的,但是你也没办法,你说呃,到了晚上把这个机器撤起来,然后早上又把它起起来,没必要做这个事吧,啊我们做这个事是在什么时候做的,类似于什么双十一六幺八这种。对吧,那一天的访问量将会非常的高,你现在的这根本不可能了啊,全年可能也就这个三五天的时间,对吧,总共加起来三五天的时间,那这个你说全年我都把机器弄成100台,这个也没必要啊,平时的话我们就可能弄十台就够了吧,就这意思啊,临时的做这个地方的一个处理啊,做这个么处理,OK,这是我们所聊的它的一个分区的一个作用。
04:21
分区这个作用好,那接下来是副本。副本的作用很简单吧,副本的作用很简单,副本什么作用?就是做备份的对吧,简单的做备份的,但是他这个备份啊,跟我们之前所提到备份他不一样。对吧,因为它这个备份里边有leader和follow之分,对吧?啊有leader跟follow之分,就是说所有的东西呢,斜写到利的消费呢,也是找利的。啊,同样的也是找力的,但这个follow呢,仅仅是做备份的作用。好,那之后我们所聊的,如果他做备份,主要就是问题在于leader挂掉了,它是不是替代leader的工作呀,对吧?啊替代leader的工作,那我们所讲的中间会引出来,当时说的有一个什么概念啊,Isr的一个概念法啊,S的个概念,当leader挂掉了,他在IR里面去选择一个。
05:18
那谁哪些副本可以进到SR看什么东西啊?同步时间对吧,老版本当中还看同步的数据量啊,就是他们之间的差值啊,差值小的可以进来,差值大的不能进来,但是我们所说的在高版本的时候,是不是我们大家看了0.9版本的之后,那块有一个change,到时大家大家看了文档对吧,他说把那个。条数的那个内容给它去掉了,对吧,也跟大家说了,是具体什么原因啊,这是R,好,那接下来有个问题,你leader挂掉了,我follow起来,那里边会不会丢数据呢?对吧?啊会不会丢数据呢?或者会不会重复数据呢?对吧,这个时候是不是跟生产者这边AC有关系啊,对吧,跟生产者A,那记住这个点我们要去啊,留意一下还有一个问题,这个SR当中还有两个概念。
06:09
一个我们所说的,还有一个是O是。同一个分区里边多个副本之间,每一个副本里边最后一个叫IO对吧啊。Log end outside啊,这这的一个end outside,因为它它卡不卡里边,现在大家应该知道他把实际的数据叫做什么。叫做log对吧?啊,这个L是log的意思,Log and outside,最后一个ET,那这个高水位指的是。最小的那个对吧?啊,最小的这个IO,那它其实指的是消费者可见的最大的啊,这里面有个最大值,一个最小值,不要这个应该。不会不会混乱对吧?啊,它指的是最小的这个off,但是它指的是消费者可见的最大的一个什么,那这个东西它保证了HW的一个存在,保证了什么内容啊。
07:08
消费者消费数据的一致性问题吧,消费一致性问题还有一个就存储一致性,就是心理的选取出来之后。统一一下吧啊,多退什么少补相当于这个,其实他做了两个事,第一步呢,发送那个命令啊,发送命令呢,你先截到SW的水位对吧,然后从我这边去获取新的数据啊,获取新的数据是这样的啊,获取新的数据他先要去截一下啊,先要去截一下,也就这意思啊,他是因为每个人呢,自己这都保留了一个HW啊,每一个那个副本里边都保留了一个HW,所以呢,先截掉,截掉之后呢,去跟新的leader去请求下载。最新的数据啊,就是我们所讲的,那你要统一的句话,就是所有人按照新leader的这个标准把数据对齐,对吧?啊,你多了就给他干掉,少了就给它补起来,其实他做了两个事啊,第一个呢,先解到什么高水位,然后之后再干什么。
08:06
补起来啊,再补起来,这个是保证了我们存储数据的一致性,那这两个我们所说的一个消费,一个存储,它只是保证数据一致性,它并不能保证。重复重复或者丢不丢的问题,它不能解决这个问题吧,啊,它解决不了啊,这个要注意一下,好,那其实我们所讲的它这个。存储这块不这块呢,就两个点,一个是分区,一个副本,然后你要往往细了聊,如果在没什活当中,对吧,你要把它往细了聊就OK了啊,那之后呢,这是我们所谓存储,那接下来是我们所说的一个。生产者生产者第一个事情就我们聊到分区对吧,分区它是一个方法,三个规则啊,应该是在三个方法里边,其实他看你呃有没有给它,其实是一样的,它调用的是一个方法,因为你很多东西传到nu里面去了,假如说你没有指令,它都传到一个now,它根据这个闹呢来决定那个内容,那还记得这个分区的一个规则吗?
09:02
优先级最高的是指定了分区号的,对吧?啊,指定了分区号就进到具体的哪个分区啊,你指定的分区里边啊,如果说你没有指定。分区号对吧?啊,看你有没有指定K,如果说你没有指定分区号,但指定的K的话,默认的是按照K的什么哈希啊哈希来了,但是当然这块呢,我们等会要写那个自定义什么。分区啊,既然他有哈希分区,那我们可以自定义啊,可以自定义练一次,好,那最后一个什么都没指定的话。轮学先第一步随机选一个吧,不是说他每次非得从零开始啊,这个不一定有可能从一,有可能从二,这个都有可能对吧?啊都有可能,他就随意选一个,然后之后第一轮下来之后,再接下来干什么,一直按照这个顺序去轮询啊,去轮询这个意思啊,所以说他你你不要想着,哎,他第一个一定是零,这个不一定,这个不一定,它随机生成一个数字,第一步呢是随机的,后面是允许的啊,只要我们确定了,假如说我们两个分区。
10:08
A跟B2个分区,那第一先发到A,再发到B,然后之后就确定了吧,就ABAB一直是这个顺序了啊是这个意思,这个是我们所讲的它的一个围群啊,第一个是生产者这边分区的一个问题。那第二个我们所聊的是什么事?就生产者这边还有什么东西啊。我们聊的就是它了,A对吧,啊A如果保证这个数据丢不丢失的一个问题。对吧,啊,就是这个AC,那这个A呢,有也有三种,刚才跟分区一样三种对吧,这个又有三种。第一个零,第二个一,第三个负一,对吧,零表示不等待任何的一个返回值就不重试了,你丢六出率,我不管你接不接到我也不管了啊,那AC等于一的时候,只要保证你leader能接收到就行了吧,啊只要你leader,只要你leader返回直接说哎,接收到了我就不重试了吧,啊就不用重试了,好,那接下来是以负一。
11:18
负一指的是ii当中的所有的副本,对吧,或者你说叫leader和is SR当中的所有的follow也可以,或者说是isr当中所有副本也可以,因为我们所说的副本是包括leader和什么follow啊follow,因为你想想看嘛,你当时建立。整个主题的时候。你先拎了两个副本,你是不是写的relic杠,Factor是V2,但其实是一个leader和一个follow宝宝啊,Leader也是其中的一个副本,只不过说这个副本呢,比较特殊一点,它提供服务了,就相当于这个意思啊,那我们可以叫is SR当中的所有副本,或者你叫leader和is SR当中的所有的follow也可以,对吧?啊,讲的其实是一个意思啊,简单一个意思,好,那在三种情况下,零。
12:07
容易丢失数据,嗯。啊,容易丢出去啊,那一呢在那个。也可能会丢失数据啊,也可能会丢数据,丢数据就是我写完了也给那个也给那个生产者发送完消息了。对吧,但是leader挂掉了啊,Leader挂掉了这个时候会干什么啊,就入数据对吧?啊就数据那还有一个等于负一的时候,更多的我们聊的是它的重复数据问题对吧?啊,其实他的有一种特殊情况下也会丢出据,当isr这个副本队列里边只剩下leader的时候。对吧,啊,那就退化,其实相当于它退化到了一的情况,那跟一就一样了,它也可能会丢出去,那更多的呢,我们聊的是它重复出去问题,因为他要等待所有的人的一个返回值,当我们leader写完了,但是follow没有写完的时候,甚至还没有写的时候,对吧,你写了十条数据,我一条都还没写成功啊,一条都没写进去,那你这个时候你挂掉了。
13:14
我只能选一个follow到leader啊,选的时候因为你方没写完,那此时伸产者并没有接收到。返回值消息对吧?啊,应答应答机制啊,应答码那没有接入到,他要干什么,再发一次,那这个时候呢,就是我们说的导致数据重复的一个问题啊,就是假如说某一个follow呢,接收了。呃,Leader呢,写了十条,你这边呢写了八条,写了八条你不能给他说返回,直接说写完了啊,对吧,那接下来十条又重发,这八条是不是重复了呀,对吧?啊八条是重复的,所以呢,它可能会导致这个数据重复问题啊,而且更多的是导致数据重复问题啊,这是AC一个问题,好,那之后呢,其实我们生产者在写代码之前还聊了一个事情,首先第一个你要知道它是异步发送的。
14:03
对吧,这个就不是在我们理论那块,是我们最终写代码那块聊的,这个就整个的真正的生产者这边发送一个数据流啊,对吧?啊第一个事情呢,就是说发送过程当中它是异步的。它是异步的,那有的同学我之前提到了这块呢,有一个不好理解的地方,我们今天所讲的A要等待应答机制,然后你这边又说E步的。对吧,啊,这个AC呢,主要的是为同事准备的啊,为重事准备的,不是说他非得在这阻塞的,是这意思啊,啊,那它是A步的,它有两个线程,一个是主线程对吧,你自己写的马的线程,还有一个是三个线程,他们中间的有一个共享变量。叫occul对吧,啊,就是A行数据的一个累加器啊,加器三器,就是说呢,通过这个组件来把它们俩两个线能结合到一块的啊,结合到一块了好之后呢,这是两个线程,你要关注一下这个事情就差不多了,那之后呢,是我们所聊的它真正生产顺序当中还有三个组件,可你要。
15:03
三个组件的顺序,第一个是拦截器,对吧?我们所说的只要有拦截器,一定是拦截器先走。对吧,因为你要是设计架构的时候,其实三个设计先后顺序,谁先掉谁勾掉,结果没差,结果没差对吧,但是你先把它拦截了,这更好吧,啊,因为你要过滤,你要过滤数据,就像我们所说的,呃,其实这种思想在道路的时,我们之前所讲的为要条件先走不是也这种思想。先把数据集过滤下来对吧,那你想想,如果说我先把查询查出来,然后再过滤,是不是结果也对啊,但你做的事情就多了吧,啊是这意思,所以呢,他先走来电器,然后呢。序列化啊之后呢,分区器啊,之后呢,是分区器啊,是这个意思啊,这三个点就够了啊,这是我们所讲的这个是拦截器啊,序列化器,还有一个分区器对吧?啊三三个点型的就来,然后partition啊,排三个器啊,这个东西呢,你要关注一下,就生产者这块呢,我们要关注的就是这个点,而最重要的就是中间的一个A。
16:08
他会怎么问你呢?他不会限面试过程当中问你说,呃,你给我说一下AC生产者卡不卡生产者AC的一个机制,他不会这样,他问的问题是他如何保证生产数据不丢失。其实就问的什么A啊,A是这个里边最重要的一个点啊,最重要的一个点,其他的说么,关于两个线程对吧,还有那个三个气,这个东西呢,你要会写,自定义连截器,还有自定义分析器,这个东西会写,但是你说非得把这个顺据记得多牢,也也还好啊,也还好,这个东西还好啊好,这个是我们组织生产者,那接下来是我们聊的什么。消费者啊,是我们所聊的这个消费者。啊,是我们所聊的这个消费者,那消费者这块我们所关注的有一个事情叫叫消费者组。
17:02
对吧,啊叫消费者组是这个意思,那消费者组有一个概念,我们所提到的消费者组里边的。不同的消费者不能够同时消费同一个分居,这个就不对了,对吧,啊这条线就不对了,是这个意思,那主要的其实消费者呢,主要的就是这个点。啊,主要是这点,那还有呢,我们写代码的时候还要去聊,就是这个off怎么提交的一个问题。它也有多种方式,同步提交、异步提交。啊,而且因为他的奥赛的保存的比较复杂,其实对于消费者来说,一个消费者组,还有一个就是消费者这边的一个奥赛的一个存储问题,是我们最关注的。因为老版本存在VK,新版本呢存在本地。对吧,那都是按什么来存的。按照组主题再加分区这三个条件唯一确定什么了,对吧?啊,由这三个内容来确确定的,那其实这个一个好处就在于你可以按照主基金消费。
18:07
对吧,你一个组去关注某一个主题,那你主题三个分区,我用三个人来提高现场如果说你是按消费者来保存的,这个事情就不好做了。因为你消费者保存了,你消费者当年这个消费者挂掉了,其他人拿不到你上一次消费的吧,但如果你是大家统一的都拿组名去拿,那你挂掉了我就能拿到,是这个意思啊,所以呢,他可以接着去中消费,给消费者组提供了一个可能,按照组来。保留的,按照所料保留的是这一点,那之后呢,是我们所聊的,既然你组。说的你不能够同时消费同一个分区,那你到底如何去消费,是不是我们提到了一个叫什么。分区的分配的一个策略问题吧。对吧,啊,分区分配的一个策略问题,那这里边呢有两种,一个呢是range,一个呢是red Robin啊Ruby默认的呢,是这个range,其实我们也看到,虽然我们没有找到具体的说参数指向那个,在在那个文档当中,在官方文档当中去找,但是其实我们昨天啊,不是前天做那个测试的时候。
19:14
两个分区写了两个消费者,当我增加第三个消费者的时候,他是报了一个警告,说有一个消费者没有分区可消费啊,最后他过了一号一个累了。一个全类名对吧,是不是看到了range对吧?啊,默认的他用的是range,因为range这种的符合任何的一种情况。啊,所有情况它都能应对,但是你read Robin呢,它比较有局限性,它必须要求你这个组干什么,订阅,大家订阅的主题是一样的,因为它是按照组来进行划分的啊,按照组来进行划分的是这个意思啊好,那这个是我们所聊的消费者当中的一个点,刚才我们所提到的到底这个消费者的O是同步提交,异步提交。对吧,还是说呃,我等这个数据处理完了之后再提交,还是说你这边边处理我边提交等等都是一些问题的啊,其实他们每一种策略呢都有。
20:08
每一种策略都有,每种策略都有。但是其实每一种策略呢,都会有一些问题啊,都会有一些问题啊,啊这其实是我们那天所讲的课程当中的一些点啊,我直直接对着这个整个的架构这个层次来说的话,就是说它这个存储,然后生产跟消费,那你在纸上你自己去这样写写,不要就对着那文档,然后这样去记啊,不好记的啊,不好记的记住当中的核心点就够了。
我来说两句