00:00
好,接下来呢,我们来看一下数据的可靠性,那么数据的可靠性啊,在生产环境当中呢,非常非常重要啊,那下面呢啊,我们来详细的讲解一下,首先呢,我们来回顾一下数据的一个发送流程。之前我们详细讲过,说外部的数据呢,通过生产者诶发送到合法集群,在这个过程当中,哎,我们是创建了一个呃,Producer啊,然后调用S方法,经过拦截器,序列化器啊,以及呢分区器发送到缓存队列,那么继续往后走,最后呢,我们通过是三线程把数据呢发送到对应的卡玛集群。那发送到卡卡基金之后,就会对这个数据啊进行一个备份。那么,本次课程的关键问题就来了。就是数据收到之后进行一个应答,那么它应答的级别啊,有这么三种,分别是零,一和负一,那零是什么含义呢?哎,零呢,就是生产者发送过来数据之后,不需要集群进行应答,你就可以发送下一波数据,下一波数据哎一直发,那这样它的效率是不是最高的啊,但是它的可靠性是不是也是最差的。
01:09
这要知道在生产环境当中呢,哎,通常呢是没有人使用的哈,那接下来我们来看下一个就是A啊,等于一,那什么含义呢?就是生产者发送过来的数据,Leader收到之后进行应答,比如说你这边发送过来数据之后,我只要leader收到了,并且已经落盘了,那我就可以给你进行应答,你就可以发下一波数据了,哎,不管你这个数据有没有同步完啊,不管,只要leader收到并落盘,就可以发送下一波数据。那这个AC等于一是不是比零的可靠性要高一些啊,哎,确实是这样啊,那还有一个呢,就是AC啊,等于对应的负一啊,或者O,它俩呢,是等价的哈,一个含义,那么这是什么一个原理呢?生产者发送过来数据之后,这里面要求leader收到,并且isr队列里的所有的节点也收齐了再能进答,那这里面SR队列呢,暂时呢,大家不是特别理解,你就把它当成所有的follow啊,也就说leader收到之后,所有的佛也都同步完数据了。
02:13
那这个时候你就可以对它进行一个隐藏了,哎,那这个呢,就是这个A等于负一这种场景,那么它保证的是数据的可靠性,那当然牺牲的就是对应的效率哈。好,那下边呢,我们就来详细的研究一下零一和负一对应的一个参数配置。双击打开第一个ACK等于零的时候,它在底层是怎么工作的呢?那首先呢,是生产者把数据发送到。哎,然后你这个数据啊,你看我这颜色啊,没有变,没有变的含义呢,就是仍然在内存当中。那好。天有不测风云呐,突然间,Leader挂掉了。他还没来得及将leader的数据跟佛罗进行一个同步。
03:00
那么整个数据是不是就全部都丢了?那这种呢,在生产环境当中,A等于零啊,是用的是非常非常少的啊,几乎不这么使用。那好,那下一个呢,是A等于一,那就是生产者发送过来的数据,Leader落盘之后。就可以应答了。也说只要他收到之后把数据催化到实盘就可以应答,即使你这个没有同步完成没关系。那这样有没有风险?那想如果说他一旦应答完毕之后,不好意思挂了。但是我这个佛罗,呃,这个哈,这个数据还没有跟佛罗进行同步。那好。那这个LEADER1挂掉之后,新的leader就会产生,它会从其他当中选一个当leader。那当成leader之后呢,这边正常再往这里面发数据。这个哈,这条数据还会再发吗?不会的,因为你上一个例已经告诉生产者说,这条信息我已经正常收到了。
04:02
那这个哈就不会再给这个leader发送任何信息,那这个哈是不是就丢了。虽然说是丢数,但是是不是要比上一种AC等于零要好一些?你说他丢数的这个有这种可能,但是呢,概率学角度来说丢的要少一些。好,那下一个呢,就是A等于负一。那负一有什么含义呢?是这样的,生产者发送给leader数据之后。所有的跟这个leader进行一个同步数据。一般呢,是这个佛罗主动来拉啊拉。那这边都拉齐了之后,Leader呢,进行一个应答。哎,这就是A等于负一,那看起来可靠性是不是要高一些。那大家思考有个问题,什么问题呢?说假设呢,现在我们是leader和所有的follow都收齐了之后应答。那有啥问题呢?那万一这个分数挂了。风轮挂了之后,你就永远也收不到他的一个应答信息,那么你这条信息是不是就卡在这了?
05:01
那生产环境当中能让你因为一个故障导致整个机器瘫痪吗?这个我们代价是接受不了的,那我们应该怎么办呢?大家思考这个问题,那下面我们看下个PPT。到底应该怎么办?那么卡布卡呢?它采用了这样一种方式,他的leader维护了一个动态的isr。啥意思?就意为和leader保持同步的follower和leader的一个集合。哎,他长这样啊,长后面这样。也就说这里面有leader,比如说是零,那SR呢,是012啥意思?表示呢是零,博一博二,这零呢是零的意思。啊,这样一个特点。比如说你这个IR里面是存着所有正常工作的leader和。那什么时候有不正常工作的呢?记住,如果说长时间未向这个发送任何通讯请求。
06:03
说白了,我要跟你同步数据,我要跟你同步数据。哎,从这个例主动拉啊拉取数据我跟你同步。那有可能是发送请求,有可能是同步数据都可以。但是如果你在30秒内没有任何的发送请求和真实的同步数据。那不好意思。我就要将你这个俘虏从这个isr队列里面剔出去。那就变成谁了,变成他了。啊,因为isr队列里面放的都是跟leader保持正常通讯的,以及leader。哎,那这样呢,就不用等长时间联系不上的这个故障的节点啊,它是采用这种方式进行维护的。那好,那既然它是这样维护的,那么下面来看它的可靠性如何。看起来不错是吧?那思考这个问题,如果分区副本设置为一个,你说只设置一个,那是不是只有leader?那好,或者什么呢?IR里面应答的最小副本量,啥叫最小副本量是这个意思,这是isr,那现在呢,这是二,那如果是这个呢。
07:09
I表示的最小副本量是一。默认也是一。那如果说哈,不好意思,在生产环境中,二也挂了,一也挂了。那二和一如果都挂了的话,SR里面所谓的挂啊是超时30分30秒。那IR对,这里面是不是只剩零了,那零不就剩leader了吗?那这个跟ACK等于一是不是就没有任何区别了?那这个可靠性是不是也得不到保证啊?那如何才能真正的做到可靠性的保障呢?是这个条件。第一个AC等于负一,这是必须的。没啥说的。那接下来你还需要加上一个分区副本,必须得大于等于二,你说你除了有一个例之外,你是不是至少还得有一个副本啊?那下一个isr里面应答的最小副本数据量要大于等于二,说白了这个参数你也必须得大于等于二,那这个要求你这S2里面就不能只是零了,那至少还有个一或者有二啊。
08:11
哎,保证它大于等于二,那这样就能完全的保证数据的可靠。啊,下面这个。下面呢,我们来总结一下ACK等于零,一和负一对应的一个生产环境当中使用,首先AC等于零。它的可靠性是非常非常差的。发送过去之后就不管了,但是呢,它的效率是极高的,不需要任何等待,直接源源不断的往这儿发就行了。那A是等于一,就是生产者发送来数据之后,Leader完全落盘。然后就可以赢拿了,那它的可靠性是中等,效率呢也是中等。ICK等于负一,生产者发送过来的数据是leader和isr队列里所有的。哎,共同进行一个应答。那好,那它的可靠性肯定是有保障的,但是效率是要低啊,你得等啊。
09:03
啊,那这个呢,效率要低一些,那好,那生产环境当中,我们究竟应该如何选择呢?首先第一个AC等于零。几乎很少使用啊,你可以直接把它抛弃掉。那A如果等于一。它用来我们传输普通的日志要多一些,比如说用户的一些行为日志。那这种数据呢,有个特点,数据量比较大,丢一些数据无所谓。啊,相对来说可以接受的了。啊,那像我们后面讲的这个舒商项目,用的就是这种方式,追求的就是效率。那反过来,像A等于负一,往往传输的就是跟钱相关的这个数据,不允许有半点马虎,必须可靠的传输。那这个呢,就是A等于负一。好,那么A等于负一是能得到这个可靠性,那它有没有别的问题呢?我们再来分析一下,如果说AC是等于负一,它会有别的问题,什么问题呢?叫数据的重复。
10:04
看现在呢,是生产者发送过来数据之后,Leader收到,然后跟我进行一个同步。同步也完成了。就差这个应答,这一瞬间,Leader挂了。挂了,那这个A就没有成功,那这个时候他就会挑一个follow,成为新的leader。那新的leader就要接收数据。那你上一个哈喽这面没有应答成功,那不好意思,这哈喽我就再发一次,那再发一次,由于上一次这个follow沃已经同步了一份哈喽,那这两份数据重了。啊,就会产生对应的叫重复数据,当然这种概率呢非常低,但是你不能排除说他没有重复数据。啊,是有可能的,那既然有重复数据应该怎么解决呢?哎,我们在后续的章节当中会专门的来解决对应的这个数据重复的问题,不要着急啊,好。这是这块,那下面的话,我就来这个在代码里面去配置一下这个AC4好吧。
11:00
那这个代码打开。打开之后呢,我们基于提他吧。RCR。A4。那拿到它之后呢,其实非常简单啊,配置几个参数。那就是这个。点put,那producer config.a你看就来了啊,就是它好。那么这个A斯我们给的什么呢?你可以查看一下官方手册啊。嗯,在这里面打开as。然后CTRLF。AK。好,这就到了,你看这个AC啊,它有零,有对应的一,还有对应的二都有啊,对应的值都有,那它默认是谁呢?默认的是这个二啊,是它那二,你看这个。你看this is equal啊跟这个AC等于负一是一模一样的,比如说设置哪一个都可以啊,那都可以的话呢,那这个类型是什么类型,类引擎是实际类型,那实际类型这块你就得给一个,比如说我要改成一。
12:10
哎,你看这样就可以了。成,那这里面还需要配一个参数呢,其实大家可以配一个叫重试。次数,我这个笔记当中有这么一个值。哪一个值呢,这个。是它说白了是这里面的这个位置。还记得这个位置有一个对应的重试吗?知道吧,哎,重试,那这个重试次数它默认值是多少呢?默认值是int的最大值,我给大家看一下啊是不是。把它拿过来。打开了之后,那我们点开到这个叫对吧,啊生产者配置信息,然后呢,啊往下找也行。看对了吗?啊re,那re呢,它的这个默认值呢,就是这个int的最大值,那怎么知道它in最大值呢?你看它是是不是int类型啊,然后这个int的范围是零到这些,那它的默认值就是它的最大值。
13:07
那既然是这个的最大值,那我要改一下啊。改小点呗。第二,不打。第二。这个呢,是瑞啊瑞。那我改成对应的叫三。三。行,那这样就OK了,那我们测试一下啊,测试一下其实呢,没有什么效果,因为在这个呃,应用层角度来说,你还是能够正常的发送数据和接收数据啊。但是实际在底层遇到这种海量的数据的时候,那么这个AC等于一和负一,那还是有非常大的一个区别的啊。是这样。看一看能不能消费得到数据啊,你看这边呢,也能够正常的消费到数据,那这个呢,就是A的可靠性的相关的配置哈。
我来说两句