00:00
第三章第三章对应的叫生产者。生产者当中。我们首先学的什么?是不是原理啊?原理那原理啊,这里面就必须得涉及到一张图了啊,这图,这张图一定要印在你的脑海里,如果没有印在你脑海里面的话,那就要出问题了。啊看啊,首先呢,这里面是有两个线程。两个线程,第一个呢是叫main线程。没线程进来之后创建了一个是卡不卡。Producer。创建完producer之后,调用的是散的方法,散的方法有两种,一个呢就是又一个producer record,还有一个呢,是带回调的,是不是有一个call back call back OK,那接下来经历的就是叫。拦拦截器啊,拦截器啊,想想生木老师对吧,拦下来给你塞点黑用生丸,那这个呢,在生产环境当中用的比较少,主要用的是弗拦截器,那再往下走是对应的叫序列化器啊,序列化器呢,它对基本类型的序列化都已经做完了,但是你要知道大数据场景下,为什么每一个框架都要进行虚拟化。
01:22
什么原因?Java的序列化太重了是吧,哎,好啊,知道这就行了,那下面呢,就是分区器。分区器,那分区器这块你又需要记住点啥呢?他把数据发送到一个叫缓存队列,这个队列是多大呢?32兆好,那每一个分区它都会创建一个队列。但是我发过来的是一批次一批次的数据,每批次大小是多大?16K好。16块。好,那这个说完之后,那下面再往下走,那么谁来帮我们去把这里的数据发送到最终的卡不卡呢?哎,有一个叫三堆线程。
02:13
那3D线程帮我们来发送,那他什么时候来拉取这里面的数据呢?条件什么?批次到或者时间到,所谓的时间就是零格MS啊,默认是零毫秒,批次大小默认是16K啊,任何一个满足条件都可以进行调用发送。那电话发送这边就开始拉取对应的分区数据,拉过来之后,首先他是不是做了一个缓存呢。那这里面就是这个请求。啊,Request请求,那么request请求每一个博节点他帮你缓存了五个啊,那这五个是不是一定都能达到五个呢?不是的,他的是有条件的,你说这个第一个请求发过去之后没有进行应答,那我是可以发送第二个,但是最多只能发送五个啊,那有可能我第一个发过去立即就应答了,那我说这里面就缓存的就少了啊,是这意思啊啊那这边呢,接下来我就在底层链路上调用的是一个叫selector。
03:18
他是把我们把底层的类似于IO流给你打通了,你可以从这边拉取数据,往这边数据发送到合法集群啊,实现这样一个过程,好,那下边呢,这里面链路打通之后,就可以把这里的数据一条一条的发送过来,发送过来之后是不对数据进行一个。副本的备份呢?好副本备份,那副本一旦备份完毕之后,这边是不是对它进行一个应答呀,应答里面涉及到三个值,ACK4里面有三个值分别是零,一和负一,负一和二是等价的。用哪个都行,这样。那么零什么含义?生产者发送过来数据,不用等继续发下一条那一呢。
04:03
生产者发送过来的数据进行应答啊,那A等于负一。Leader和所有的IR里面的节点都收到之后进行答啊,那当然前期学的时候你可以说是有的follow啊,但是follow是有问题的啊,行,那这边回过来之后,这边就可以正常的确认。是否正常收到,那么如果成功收到,首先清的是请求,之后呢,把这里面的数据再进行清掉就可以了,但是呢,如果发生意外需要进行重试的时候,那就得看你这个重试的次数。默认的重试次数是多少?Int的最大值,也就说必须进行死磕啊好,那这里面呢,如果不行就从这里再进行啊,重新发送啊,就是这样一套流程啊,印在你脑海里面,这张图一定要有,那这张图有了之后,那下面我们来看。之后我们学的第一个呢,就是API操作,叫异步发送API。
05:02
那一步发送API,这里面那非常简单啊,你需要写代码的时候有这么几步,哪几步呢?第一步就要创建。生产者第二步呢,发送数据,第三步关闭资源,好,然后还来个零。配置信息啊,那主要是生产者吧,嗯,那你用的就是这个卡不卡。我有闪。Pro,那么你用这个卡pro的过程当中,需要我们传进来一个KV类型,KV类型要注意你传的数据类型是使劲啊使劲根据你传的数据啊,通常是使劲,那这里面你需要传入一个这个purpose属性配置信息,那属性配置信息当中有两个值是必须配的哪两个值?第一个要连接好不好,比如说BOO serve。
06:00
那第二个参数呢,对应的叫KV序列化。就完事了啊就这么简单,那下边发送数据调用的是这个散的方法啊,散的方法这是一波API发送,那1API发送里面还有一个带回调的,那带回调的需要在这个后面。再加一个参数叫外。啊,就完事了啊行,那再往下走,那还有一个叫同步发送。简单吗?哎,同步发送前面都省略。后面也省略,只是中间这个位置。在它末尾加上一个叫点get就行了啊。就这么简单,那当然你带靠外语和不带靠外语啊,一样的啊。好,这是同步发送之后我们要学什么。
07:00
分区吧。分区的好处。什么好处?永远是从两个角度去分析问题。一个是。存储一个计算啊,存储的角度分区,可以把你海量的数据是不是存储在多台服务器上,哎,任意的切,那么计算呢。它是提高了你生产者往集群发送的并行度,同时也增加了你消费者消费集群数据的一个并行度,是这样吗?那有这么个好处,那下面它默认的分区规则。默认呢,分区规则呢,分这么几种。第一种叫。指定了分区,那就按分区走呗,是吧,按分区走。第二个没有指定分区,指定了K,那是什么key的哈希扣的值。
08:07
值对这个分区数。哎,球膜就可以了,下一个没有指定key,也没有指定分区。嗯。粘性。什么叫粘性?怎么个粘法呢?第一次随机。一旦粘上一个之后怎么办?直到它不行为止,那第一个呢,就是这里面它的这个批次大小到了,或者是02YS时间到了,那它就会切换另一个分区,切换的时候要注意。还是随机,但是跟上一个不相同啊就可以啊。嗯。学的这么好吗?再下次到哪呢?自定义分区。自定义分区就是定义一个类。
09:03
实现part接口。趴在那接口。然后重写里面part方法,那part方法里面,那里面传入的值有对应的topic key value,以及key的叙事化值和Y流的序化值,还有一个集群ID,那我们主要用的就是那个Y啊,没序列化的I流就可以了啊,行,那这个自定义完之后,需要在你的主程序当中是否关联一下你自定义的这个类啊,啊全利名配一下就行了啊。那这个分区完毕之后,下面到哪了。数据的处理吧,数据处理第一个最重要的就是如何来提高生产者的。吞吐量啊。非常重要啊,因为在未来你开发的时候,这道题你是一定要做的。因为你想你如何让你的卡不卡,能多处理一些数据,这是非常非常重要,因为咱们面临的问题就是每秒钟集一条的数据过来,你能不能扛得住。
10:05
那怎么挑啊?想想宋老师怎么办的,很有人文,四个参数对不对?哎,非常好,四个参数这个。PC大小,哎,16K,你可以调整到32,嗯,32K,那好下一个呢是02S。默认是零,你可以调整到五到100毫秒。这个要根据情况,它是一把双刃剑。如果提高到这个时间,会带来什么负面影响?15G延迟高啊,这么好啊,非常好,那下一个。就是对应的压缩啊,压缩压缩可以提高你这个存储量,也就是说每批次我拉取的数据量就增加了啊,原来你16K,那我现在呢,可能拉取的是啊一兆啊,甚至级以上啊,那再往下呢,就是对应的叫缓冲区大小,缓冲大小呢,从原来的32兆啊,你可以提高到对应的叫64兆啊,这就行啊,就这么简单。
11:05
那下一个呢?在通讯领域里面,必须要研究的就是数据的传输可靠性,可靠性,那可靠性呢,涉及的值呢,就是AC4对应的三个值。零一和负一啊,零的话呢,生产者发生过来数据我就不管了,这种有可能导致数据的丢数啊。那么A等于一一的特点呢,是生产者接到数据之后进行应答,但是接到之后有可能他是不是也挂了,也可能会产生丢数,但是比上一种是要强一点啊,也可能会丢。在生产环境当中用在什么场景呢?专属普通日志,比如说能够接受,比如说我过来1万条日志,我丢个一两条我能接受啊,属于这种级别的哈。
12:02
那下一个呢,是AK等于负一,它呢,就是一条都不能丢啊,完全可靠。但是完全可靠是有前提条件的。首先,A等于负一得加上什么?大于等于二啊,还有一个。IR里面最小副本数也得大于等于大于等于啊,这两这三个条件都得加在一起,那么虽然说它完全可靠,也有对应的问题,会有什么问题呢?数据重复啊。那么要想解决掉这个数据重复,就得引入对应的叫。对啊,第一个就是密等性。第二个。是五好,那幂等性他是怎么保证数据不重复的呢?你说他怎么判断数据不重复,TD分区号,还有这个序列化号对吧,嗯,叫递增吧序号。
13:13
单调递增的,那首先第一个PID什么时候产生?每次卡瓦集群重启之后,都会分配一个新的PID,好,那么分区号可以指定,那保证你跨分区,肯定那是重复的,应该是没问题的啊,但是序列号呢,它是单调递增的啊,差一位都不行,那好密等性默认。默认是不是打开了啊,这就可以用了,那下一个呢,就是事物,事物呢,首先第一句话永远都是底层基于。密等性,嗯。成。那下面呢,这个事物的原理啊,稍微了解一下,可以回想一下那张图啊,这边呢是对应的生产者,这边呢是卡不卡集群。
14:05
卡布卡集群啊,这里面有几个角色啊,这是博零,这是博一,那第一个呢,就是这个叫事物协调器。还有一个呢,叫分区副本的leader,以及呢,还有存储事物的一个主题,那这个主题默认是。50个分区。那50个分区专门用来存储事物相关的一些信息,那我到底用哪一个分区的数据取决于什么呢?一个叫事物ID。是YID是咱们用户手动输入的全局唯一,那么好,他的哈希code值对这个50。球模就能得到对应的分区对吧,那分区比如说我找到的分区是分区零,它是leader,比如说是五吧,啊五啊,那它是分区,它是立,立之后,那对应的这个节点上的这个事务协调器,就是本次事务的负责人。
15:02
那他怎么工作的呢?生产者这块首先会跟事务协调器进行申请,一个叫PID。是YD,那么他就会给他一个PID,那接下来他就向这个leader进行发送数据,发送完数据,那这边要提交对应的叫commit申请,Commit的申请,他会把这个申请持久化到这个topic主题里面,只要提交成功之后,那这边告诉他已经持久化到硬盘了,那下面他会在这个分区上校验,问他你是否真真正正的已经把数据处理好了,他告诉他哥们儿我已经处理好了,那之后他会告诉他记录一下这次事务已经成功结束了啊,就是这样一套流程啊好,这是事物典型原理,稍微了解一下,那么事物这块呢,在操作的时候有对应的五个API,分别是叫。初始化。接下来呢,启动。
16:02
第三个呢,是消费者相关的啊,消费者奥赛。相关的啊,后续再说。那下一个呢叫提交。最后呢,中指。成就这么几个API,那你要呃在生产文件当中需要自己去用一下啊。然这也是数据重复,那接下来我们学的什么?数据有序对吧。有序的话就一句话,单分区内有序。而且还是有条件的,还怕乱续是吧?那回忆一下吧。要想多分区有序怎么办?怎么办?
17:01
你多分区有序,我就得把所有的分区的数据速度拉过来,放到一个池子里面,然后进行统一的排序啊,哎,那这个效率呢,相对说还不如单分区那有序呢啊。那下一个是乱序。乱序乱序,首先记住第一个,如果卡夫卡是1.x之前,你要想解决乱气问题,就一招in。设置为几,设置为一就完事了啊,你说你那缓存那五个请求,你别缓存那么多了,就来一个,他就肯定不会乱续是吧?啊啊,如果是这个新版本的。没有密等性。那这事也简单直接,In flag等于一全搞定好。那就麻烦的是有密等性。有密等性,因为密等性它的特点它是把数据缓存到内存当中,哎,然后呢,进行一个处理,那这样的话,他就有条件你这个生产者发送过来的这个请求。
18:04
你乱续了没关系,我是卡卡集群啊,这边呢,我会对你的请求进行一个缓存,我看你这个序号,哎,正好是单调力争了没问题,一旦有序号断了。那我就停了,我就给你缓存到内存当中,等着直到你这个序号补过来之后,我再对你重新进行一个排序啊,然后再落盘啊,这样就OK了啊,是这样一个过程。行,那这个呢是乱序,乱序在面试当中问的频率非常非常高啊,一定要记住啊,一定要记住,那接下来呢,我们学的是第几章了,第四章吧。第四张队呢,就是broker。博克集群,博克集群第一个学的什么。主黑板里面存储了哪些信息?哪些信息?第一个博爱蒂丝。
19:02
那存储它之后,下一个存储的是leader相关信息。啊,每一个分区下谁是leader,还有一个呢。Controller辅助选举的对吧,啊辅助选举。那主要的特点呢,就是谁能抢到这个节点,那以后就谁说了算,由他呢来进行啊,Leader的一个选举。那下一个就是对应的叫工作流程。工作流程这张图也需要印在你脑海里面。知道心中有图是吧?啊不是心中有码啊,来看一下。那这张图是咋画的呢?首先上面这块是对应的叫。JK。JK那JK里面。有啥呢?第一个节点是我存储的broke ID啊。
20:01
ID还有一个节点呢,叫controller。Control错了,呃,那下面来看,只要你有一个博上线。在这个IDC下面是不是要增加一个节点?嗯,增加一个数据啊,那你上线完毕之后,在里面进行注册啊注册。注册完了,那下面第一个就是选择controlrler,因为每一个下面都有对应的这个controller,那到底哪一个controller说算,那就看谁能抢到。啊,谁能抢到,谁抢到谁说了算,说了算之后,他第一时间会监控这个爱丽丝节点的一个变化。同时呢,他会选择从IR队列里面活着的,并且呢,排在AR队列中前面的哎进行选举,为立上。行,那他把这个leader选出来之后,比如说他是leader。其他都是,他会把这个信息记录到哪里呢?他自己不记,他会记录到主keepper当中,这里面记录谁是leader。
21:07
啊,嗯。记录完之后,那正常就可以工作了,那工作的话呢,如果这边有生产者向这边发送数据。向leader发送数据,那么leader收到数据之后。Follower会主动的跟他进行一个同步。拉取数据,拉完数据之后,他会把数据持久化到硬盘。那以什么形式存储呢?叫log log下面叫segment,每个segment的大小是一个G,那么一个G的数据你想快速查询非常麻烦,它底层创建了索引,好。那那数据过来之后,这样就OK了,那如果在这个过程当中leader挂了怎么办呢?它一挂掉这个ids里面就会监听到它的变化,那么这个crler监听到之后是不是要重新选举,重新选举就从这个leader里面拿取最新的这个信息,拉取过来之后,那么它就会在AR队列里面选择活着的,并且在AR中排在前面的,成为新的leader哈,那比如说选择是零号节点,那它就成为leader啊就是这样一个工作流程,这张图也要印在你的脑海里面。
22:17
那行,那这个完事之后下面学谁。服役和退役。这个呢是必须得会的啊,这属于救命用的啊,如果再也不会的话,你救不了命了是吧。那负一的话呢,非常简单。什么简单法呢?这么几步,第一步灰的话呢,要。你先准备一台干净的服务器吧,准备一台。在生产环境当中啊,大家呢,可以从这个还100进行一个克隆安装,嗯,你不要像我上课呢,我上课是为了省时间啊,如果按照这个还多100来安装的话,那这个时间点太长了,我要安装猪keepper,要安装这个卡不卡,还要安装这个GDK,那时间太长了,那么在生软件当中,你确实得这样去做啊,我是偷了个懒,从104上直接克隆了啊。
23:10
好,那准备一台服务器之后呢?要形成计划,或者说先形成一个那什么吧,对哪一个主题进行一个操作啊,对哪个主题。操作啊,这一个文件操作完之后呢,下面呢,有行程计划。之后执行计划。然后验证。计划,哎,这样一套流程下来就OK了哈,那反过来退役的话也是一样的,先比如说要退役的节点不存储数据。不让城主不进。正常你把它退出就行了啊。就比较简单啊呃,而且极端情况下可以处理就是。像之前跟你们说的,个别人直接把这个整个这台服务器全干掉,那也没关系。
24:04
三台服务器把一台服务器整个干掉有关系吗?没关系,主要看你的副本数,所以说副本数在生产环境当中一定要设置二啊,你要相信自己,你有可能三库是吧?啊,这样的话就安全一点啊,你要不相信自己,说海哥不可能说啊,那错的就是你啊。行,那就是整个我们昨天学的内容。
我来说两句