00:00
好,那接下来第二个讲的是生产者这边数据可靠性的一个。保证刚才第一步是不是我们已经知道了,将来这个数据发到哪一个分区啊,对吧,但是有一个问题,这个数据啊。我是在山楂表发过去了,但是你卡夫卡有没有接到?是不是个问题啊,对吧,我可以由于网络传输我没接到那类似于这种情况。怎么办?对吧,啊,有同学说重发,那重发之前那是不是我生产者这边要知道有没有接到是吧,给他一个返回值啊,啊,如果说返回值收到了,我就不重发,没收到干什么。就重发吧,啊做这个事儿好,那么问题来了,这个返回值。因为你有多个副本是吧,那这个返回值到底应该怎么发呢?
01:00
因为我正常的我生产者是不是跟leader的打交道的,那是leader的写成功之后就发送这个返回值,还是说我要等所有的方都。成功之后。对吧,我怎么能保证这个数据不丢失啊。对吧,也就这个意思啊,就是我们看一下这个PPT里面所讲的一个点啊,来思考一下这个问题,因为人家在设计这个内容的时候,你会去思考这个问题,到底选择怎么样的一个策略,对吧?啊发送消息啊,这边正常的确认收到,收到之后呢,可以继续发送,如果说没有确认收到,我可以重新发送。这个没问题吧,啊,你要保证这个消息能正常的不丢失吗?啊,不丢失你要做这个事情啊,这个没问题啊,那接下来的问题来了。因为我正常的是给leader发送消息的。对吧,刚才呢,我们是对整个主题帕认理来说的,但是我们知道帕认里假如说三个副本是不是一个力的两个方。
02:04
正常的生产者是跟leader打交道啊,然后呢,Follow网,去leader去获取数据,那这个时候问题就来了。对吧,什么时候发送AK,也就是说这个什么时候呢,就是我们所讲的你是leader接受完成还是要等到follow。对吧,假如说必须要等到follow落,你是要等待全部的follow,还是说半数以上的follow落,是不是这个都是我们之前不是有一个半数机制的问题吗?是不是都要考虑的点啊。对吧,啊,都要考虑的点,就这意思啊,还是全部的,还是半数以上的啊,还是半数以上的好,那我们就分析一下这两种策略有什么不同,对吧?第一个叫半数以上完成的就发送AK。返回消息。A。确认消息叫acl,就这个啊,就是确认消息,就是我们刚才所说的这个返回值,说确认收到这个内容叫ACKOK吧啊好,那第一个就是半数以上的这种。
03:10
他延迟低,他肯定比这个延迟低吧,因为半数就够了,但是他有一个问题,选举新的leader的时候。假如说你希望容忍N台节点故障,就是说选举力的时候有N台挂掉,你一定要有,至少有多少个?二加一个副本,想一下这个问题能不能想通?必须是半数以上完成同步,那我2N加一台总共有这么个多个副本,我是不是能保证N台挂掉了,是不是还有N加一台啊,N加一台里面至少有一台完成了了。能理理明白这个数字关系了啊,想一想啊,这个问题好,接下来我们来思考一下这个如果说全部完成发送的话。
04:00
啊,它缺点是颜值高,因为你要全部等待完成了,但是它有一个优点就是选重新选取leader的时候,假如说你允许N台故障,是不是只要N加一台副本就够了。对吧,因为你有N加一个副本,你挂了N台,因为我全部都完成,我只要有一台活着是不是就够了。能理解这个事吗?对吧,它跟它不一样吧。啊,你容忍N台的时候,一定要2N加一个副本。因为你有2N加一个副本的时候,你。挂了N台,是不是有N加一台活着呀,因为由于你是半数以上,那这N加一台里边至少有一台有这个数据有没有问题。没问题吧,因为你分数以上嘛,同步的对吧,也就是说你N加一台有这个数据,那我挂了N台。我至少有一台有那个数据了。能捋明白这个关系吧,数学关系啊,那接下来是这个问题吧,如果说我全部要同步成功的话。
05:06
全部要通过成功的话,我如果说容忍N台。我是不是只要N加一个副本就够了。因为你是所有的嘛,你N加一个副本都同步完成了,你挂了N台有一台活着,这一台活着,我就确保这个消息是一定是有的,对吧,是不是就能做到不丢数据啊,啊是这个事儿,好,那接下来他最终呢,选择了这个,呃第二种方案,因为他呢,同样容忍N台,就是为了是这个点啊,为了这个点,但是呢,它其实这种啊还有问题。还有问题,问题在哪呢?你说你同步N所有的副本才会发送这个ad对吧。所有副本,假如说现在我有十个副本,不好意思,现在你发送消息的时候,我有一个副本挂了。永远都不可能发生AK了,对不对。
06:03
你不知道所有的副本全部同步完成吗?你用十个副本对吧,我有一个挂了,我只能同步九个吧。因为有一个挂了只能通过九个,那是不是这个时候就有问题啊。对吧,啊,这个时候就有问题,所以呢,他在选用第二个方案的同时,做了一个优化,提出了。哎,我们要讲这个概念了,之前是不是描述的时候看到这个ISI啊,对吧,我们来看一下这块呢。B。参数命令卡不卡topic,描述一个topic的详细信息对吧?啊topic,然后杠杠吧。刚刚topic叫first,然后刚刚原数据的一个操作对吧?啊。2181啊走。
07:00
来看最后是不是有一个。Isr啊,好,那我们要说一下这个IR是什么东西,它叫in sy。叫同步副本。叫同步方法,因为是这样,刚才我们所聊的点,他卡不卡呢,选用的是第准方案,但是第二种方案有问题吧,它有优点,就是说我们所说的它可以。机器数要少一些,对吧,你存的副本数要可以少一些。但是达到主要的问题就在于,如果说由于某种故障迟迟不能跟leader进行同步,还不如说挂掉了,他还活着,但就是这个特别慢,这个人对吧,就有一个机器十个副本,一个leader,九个follow,对吧,有八个follow都是正常的,网络通信都OK,都很快的完成了,但是有一个它也能通信。但就是很慢,甚至都挂掉了。那你这个问题影响我全局的一个节奏吗?非得因为你是要全部的,那leader要一直等下去,直到他同步完成,对吧,才能发送这个SK,那这个问题解决,这个问题就要提出SRSR呢叫同步副本。
08:09
同步分OK,那这个东西。这个东西。同步副本就是第一个,它这个作用就是为了完成。我们所说的发送AC的一个点,发送ACK一个点啊,也就是说这样的,呃,你有十个副本,是不是一个leader,九个follow。我们之前说的全部是不是不靠谱,那我们就选部分,选部分T提出来放在SR里边。就是假如说我规定我以后选四个,我只要某四个人同步完成就够了,最后呢,我选leader,在这四个人里边选是不是就够了,其他的人我先不考虑。啊,除非这四个,这五个整个全部挂掉了,我再考虑其他的五个,对吧,只要这四个有一个活的,我优先考虑这四个,好,那大家觉得选谁到这个副本队列里边看什么东西。
09:14
注意这个isr呢,就是为了这个数据可靠性,将来假如说你挂掉了,我是不是希望我挂掉数据之后,我逼的挂掉了,我重新选取出来,我尽量的是不是不丢数据啊,是为了做这个事啊,那我们有说做这个事提出了两种策略,一个是半数以上,一个是全部。卡普卡呢选了全部,但是呢全部它对全部呢又做了优化,提出了一个IR,所以这个IR它的核心作用,它叫同步副本对吧,同步副本它的作用呢,就是leader挂掉之后,然后从这里边选新的leader。那这个里边有什么前提条件?对,通信没有问题,他得活着。
10:00
而且它尽量的通信得快吧,刚才我们所说的你由于你特别慢是吧,是不是等着,那像这种的是不是不能放进来,是不是有个通信时间的问题,我俩发私号信接,看你是不是能快速的。接收到对吧?啊,我们俩尝试一下,哎,这个还有呢,还有其他的条件可选吗。你看啊,我们是为了。Leader挂掉之后,选择这个新的leader,让他呢,尽量的不丢数据。不。是不是数据量也是一个参考因素啊,对吧,假如说很不巧,因为是这样的,你是通过副本之列,假如SR里边我。丽刚写完。我方路,所有的方路还没来得及拉完呢。还没来得及把数据获取完,哎,你刚写完十条,我同步了八条。那个通九条有了通了七条。
11:02
对吧,是不是选尽量选高的呀,选高的是不是尽量丢数据也丢的少一点,是不是这个这个思路是在里边,这没问题吧,好,那是不是刚才我们说了,第一个是不是要看通信的时间,两个人要很快的交互,因为你交互的速度快的话,证明你以后拉取数据的速度也比较快吧,所以丢数据的可能性是不是更小一点,对吧?因为我刚写完,你刚写完,那你就写完了,那这个不就是丢数据可能性更小嘛。第二种就是你写入十条,我就写入了九条,八条,七条就是选高的。两个参数吧,啊,两个参数是这个意思啊,两个参数,那我们可以看一下这个点啊,看一下这个点,但其实我可以告诉大家。在高版本当中,等会我们来看到那个配置文件,高版本当中,这是两个条件,一个就是看假设,呃,看这个消息呢,我们俩如果说差距在十条以内,我把你加进来。看条数的差距,在十条以内,我就加到这个里边,如果说你超过十条,我就把你踢出去,能听懂这个意思对吧?啊,这是第一个条件,是我们所说的条数吧,第二个假如说我俩的通信,你能在什么一秒钟就能同步完成,或者说我发送给你消息,你在什么一秒之内我们俩就能交互,那这种呢,我也把你加到队列里边,是不是两个条件?
12:20
对吧,但是他在高版本的时候,他干掉了一个条件,猜一下干掉了哪个。时间还是条数?条数还是时间?认为时间的举手,我看一下干掉的,我说的是干掉的,不是保留的。干掉时间的。就是说这这两个参数呢,我可以告诉你,在新版本,就当前咱们用的版本当中只保留了一个。
13:00
就干掉了一个对吧,干掉时间的。认为这发现认为干掉那个条数的呢。差不多还有一些人认为两个都干掉了是吗?就没有自己的想法吗?是这样的啊,就是刚才我们所说的这个isr呢,是一个同步队列对吧?是一个同步队列,那这个同步队列将来是为了选新的leader用的,因为如果leader不挂掉,其实你要不要这个同步队列没关系。如果你leader的不挂的话,我一个人活着就够了,对吧,我甚至我一个副本就够了,因为你不挂掉,是不是防止他挂掉的情况下,防止如果说他挂掉了,我是不是要选新的leader,我选新的leader从IR里边选。是不是尽量的为了不丢数据对吧,那也就是说我选哪些for路进到SR有两个条件,第一个呢,老版本当中啊有两个条件,第一个就看同步时间。
14:01
拉取的速度,第二个呢,看你俩差距的条数,如果说在十条以内我就加进来,在十条以外我就给他踢出去。在高版本,就当前我们用的这个版本里面,它干掉了一个条件。时间还是挺数,干掉的是时间是吗?因为大家想的是,那既然你是选新的leader,我尽量会的保证不丢数据,保证不丢数据,那应该是条数越高的越好吧。对吧,啊条数是不是大家是这样想的。不是我条数最多,还有问题吗?我条数最高的。对吧,我调最高的还有问题吗?
15:03
我听出来就是两个都有这个问题,我真论对吧啊,但是呢,就是我听出来应该认为干掉时间呢,还是比较多一点,就是保留条数的这种,因为大家想的问题是这样,因为我为了保证leader挂掉之后,我方我能选几位新的leader,是不是尽量不丢数据啊。尽量不留数据,那我看条数不就完了吗?我条数最高的是不是丢数据的可能性最低啊,对吧,假如说你十个,你有几个同步的,一个同步了九条,一个同步了八条,一个同步的七条,我选九个这个是不是他丢一条选八个,这个丢两条吧。对吧,来看一下,它实际上保留的这个是时间的,它干掉的是条数的那个条件。那为什么原因,我跟大家解释一下,首先我们看一下它什么时候干掉的,对吧,首先这个参数啊,就是时间的最大的什么延迟啊,最大延迟,如果说你在同步在这个延迟时间内。那我就给你加进来,如果说你超过了这个延迟,我就给你干掉啊,是这个参数我们看一下看到没。
16:05
找到这个参数的一个具体的解释。在这。你看一下这个内容。这个是十秒钟是吧,啊十秒钟来看一下,他说如果说这个follow。不能够及时的发送这个什么抓取的一个请求,或者说不能够去拎去消费最后一个什么off log and。消费到最后一个消息吧,那。这个leader将会移除这个follow,从SR里边这个条件应该跟我们之前说的是一样的吧,就是看你诶同步的快不快对吧,同不能快快默认时间呢是。十秒钟啊,十秒钟好,我们继续往下找,关于还有一个参数啊。在这。又是0.9这个版本。
17:00
对吧,啊,又是0.9这个版本,他你看这句话。你看这两个东西,你看这两个参数。一个是MS,就是毫秒吧,一个是message s就是消息的条数,这两个的老版本都有,但是呢,他说了这0.9版本做了一个改变吧,他说为什么?被移除了。啊,被移除了,也就保留了这个时间的,那我们要跟大家说一下他移出的一个原因啊,说一下移出原因,其实大家那个想法是挺合理的,因为我们就看这个数据量多少嘛,越多的是不是越不可能丢数据啊,是这样的生产者这边。它是批量发送数据的。它是批量发送数据的,首先有一个问题啊,这两个前提,第一个是我们所说的生产者这边呢,是一个Bach,一个Bach发送数据的,当我们写代码的时候,能看见第二个问题,Isr这个队列维护的时候。
18:05
正常生产环境当中,就是你卡巴启动的时候,它是不是维护在一个内存里边。他还要同时我们是不是刚才从ZK当中拿到的,那你你要想ZK当中能拿到,说明ZK当中也有这个内容吧。对吧,那ZK当中内容是谁写的。是不是卡不卡写给他的呀,CK会给自己写东西吗?他给第三方提供服务的,一定是第三方写给他内容的,对吧,无论你做ha也好,还是resource的ha也好,都是啊not的,或者说那个我们所说的resource manager这边来来写给他的嘛,啊,他是一个被动接收帮助你管理啊,你写进来大家都可以作为一个集群的人都可以来补好,也就是说在卡卡集群维护的一个内存。啊,至于这个内存呢,到底是那个什么map结构啊,数组啊,这个我们就不聊了,至少的内存当中维护一个这个队列,这个没问题吧,好。这个问题就来了。由于它是批次的。
19:02
啊,由于它批次的我假设。假设刚才我们看到那个条数为十条,它肯定有一个默认值对吧,默认值我记得应该是1000条还是1万条,我不管,我假设十条。我假设是假设十条,一个白正好发送十条数据。可不可能?是可能的吧,也就是说我举这两个数据,假如说你是1万条,那我be尺发送一万二呗,就是说Bach如果说大于这个,你限定的这个PC3限定的这个什么。大小的时候,那这个时候问题就来了。因为你一个be发送过来的时候,发送给谁呢。发送给卡不卡卡不卡的谁啊。力的对吧,好,那这个时候会发生什么现象。所有的方度是不是全部超过了这个值?差值是不是全部超过了,我一次发12条过来,是不是立先写完,一写完之后发我才能拿取了,因为你是一个批次发过来的,那么此时。
20:08
你这个十是不是12大于这个十,是不是所有的方数跟我力的差距都十两之外,是不是所有的方数全部滚蛋?要剔除SR。能理解这个事吗?是不是所有的要提出来好,接下来我有很多机器是不是同步的很快呀。马上就同步完成了,你又要给我干什么?拉到里边。能明白这个事儿吗?因为他老的版本当中两个条件嘛。两个脚垫对吧,啊两个脚垫,那由于你满足那个内容不满足这个啊,所以呢,踢出去又进来,那我这边批次不是说发一次。我这边在频繁的去干什么。频繁的去操作这个内容去发送,那你这边是不是频繁的加入SR技术SR,加入SR技术SR这个内存当中操作还不算,而且这个数据我们知道它还存在哪啊。
21:02
存在K里边,你是不是会涉及到频繁的去操作ZK呀。能理解这个事儿吗?能理解我刚才所说的这个举的例子吗?对吧?我假设它小于十条啊,那个参数的意思有一个值,默认值应该是1万,我记得没错的话,你可以去0.90.8那个版本的文档看一下,我们找一下。我记得应该是1万,我拿着这个东西干什么?复制一下,然后我找到0.8那个。对吧,0.8随便0.8的一个导F看。1万吧,啊1万,你看一下这个地方。是不是跟刚才我们看到那个什么时间的那个描述的一样啊。将会移除到这个什么isr对吧?啊移除,那由于我生产者是批次发送的,我一次发送的数据大小超过了你这个值。你是不是要移出去,跟据刚才他说的规则移出去,但是我很快是不是又拉取过来啊。
22:02
对吧,拉取过来是不是拉取过来之后,首先条数是不是满足了,而且同步时间也快,是不是又满足了,两个条件满足是不是就进来了,对吧,那频繁的会有这个什么SR的一个进出码操作太过于频繁了,而且呢,你还要在ZK当中存这个信息,因为我们刚才知道这个信息我们是不是连到ZK拿到的呀。对吧,啊,在ZK当中还要去拿这个信息,ZK当中也存了一份,那这个时候不仅频繁的操作我们SR,还频繁的操作我们什么。ZK啊,这个就不太靠谱了,所以呢,他在高版本的时候,刚才我们看到是0.9的时候,把这个干什么。一除掉了吧,啊,它的文档就解释了,其实它有两个参数要注意一下,注意一下,其实大家猜的呢是合理的啊,猜的合理的OK,这个呢是我们所说的ISR这个内容啊,SR这个内容我把它截一下。而这个。
我来说两句