00:00
来说一下咱们卡夫卡当中啊,常用的几个命令啊,常用的几个命令,呃,那咱们主要看什么呢?呃,首先呃,卡夫卡呢,我们回顾一下卡夫卡里边那个数据的结构吧,啊啊,那卡夫卡当中呢,我们大家都知道卡夫卡是一个消息队列对吧?啊都是一个消息队列,那消息队列呢,我们分为那种啊,点对点的啊,就是一个生产者,一个消费者啊还有什么呀?对,还有那个发布订阅模式啊对不对,发布订阅模式呢,相当于是一个生产者啊那我这个发布消息对不对,那所有订阅了我这个主题的这个消费者都能收到它这里边的消息,对不对啊,实际上它是卡普卡属于哪种啊啊卡布卡属于咱们后者,就是发布订阅模式啊,发布订阅模式啊啊,那接下来我们来回顾一下卡夫卡里边的一些概念啊,首先先说它,呃,里边的一个非常重要的概念叫做主题啊,其实所有的发布订阅模式的消息队列当中呢,都有这个主题的概念。啊,所有的发布订阅模式这个消息队列里面都有主题的概念,不光是卡不卡里边有啊,你像我们其他的,呃,别的消息队列有很多啊,什么y MQ rock MQ等等,都是Java当中的一些常用的消息队列啊,像那他们里边呢,也有这种主题的这个概念啊,就是topic啊呃,因为什么叫发布订阅呀,对吧,我发布一个主题,我订阅一个主题,对不对,所以主题啊是肯定有的啊,那只不过咱们卡不卡比较特殊,它是一个分布式的消息队列啊,那前面也讲过,只要谈到分布式呢,肯定有分区的概念。
01:33
啊,只要有分布式,肯定有分区的概念啊,那咱们这分区分的是谁呀。分的是topic啊,就是我们一个topic呢,我会分成多个partition多个分区啊,那我生产者哎,往卡不卡topic里写的时候呢,我是怎么写的呀,我是往多个分区里边去写的啊,当然这个在你不指定那个分区的前提下啊,就正常我是往多个分区里边去写的,并行的写啊,那我后边消费者呢,我去消费的时候也是怎么消费啊啊,那肯定也是并行的消费啊,是这样的啊,这是咱们卡不卡这个呃,Topic式分区的啊,但是如果说仅仅就是这么分区的话呢,我这里边可能会有一些问题,出现什么问题啊,比如说我一个分区它所在的节点出问题了啊,那这个分区的数据是不是就没有了呀?那是不是咱们这个生产者呃跟消费者这两边的数据就不完整了呀,对不对啊,不完整那就不行了,那所以说我们卡卡出于这个问题的考虑,他怎么办呢呀,怎么做到这个呃容灾呀啊副本机制啊,其实就相当于整一个ha呗,对不对,那我给每一个分区我都加一个副本啊。
02:38
增加一个副本啊,增加一个副本啊,那这样一来的话呢,那如果说我这个主的副本就是leader挂了之后,那我的这个follow是不是可以上位啊,成为新的leader啊,对不对啊,然后大家要要回忆起来啊,咱们生产者啊和消费者去读写数据的时候,面向的都是谁,面向都是leader对吧?我生产写是往leader写,我消费者读也是从leader读的啊,那如果leader挂了,那我就用follower成为新的leader就行了啊,它可以这样去做啊,啊这是咱们这个几个比较这个基础的概念吧,啊,然后再再来,呃,简单说一下后边这个消费者啊消费者,那在卡瓦当中,消费者他也做了一个创新啊,也做一个创新啊,他现在啊,我们后边他不是一个单个的消费者了,他是一个什么呀,他是一个组了啊,这一个组是一个整体,大家要注意啊,这一个组是一个整体。
03:31
啊,也是现在的一个组,就相当于咱们之前那个传统意义上的一个什么东西,一个消费者就是原来的一个消费者,现在我管他叫一个组了啊,那咱们这个所谓的发布订阅模式,是不是就是一个生产者对多个消费者对不对,那他应该怎么理解呢?其实在卡不卡当中应该这样理解啊,就是一个生产者,我应该是对应多个什么呀,多个消费者组啊,能理解对吧?啊,这叫啊一对多啊,一对多这个得搞清楚啊,好了,那咱们把这点明确就行了,然后这里边呢,还会涉及到一些这个分区的分配,对不对啊,比如说我这个topic有多个分区消费者组,我有多个消费者,那他们之间是怎么分配的啊,对不对,这里边有什么round Robin啊啊对不对,有还有其他的一些这个分配策略,这些东西啊,也是相对来说比较重要的,到时候大家得自己去复习一下,这块咱们就不再废话了啊好,简单回顾了一下卡不卡当中比较重要的几个概念啊啊,那现在我们的目的是什么的,目的是回顾一下卡夫卡当中常用的几个命令。
04:35
啊,常用的命令呢,我们呃主要有以下几个啊,第一个就是对于topic的这个创建啊,或者是删除啊等等,或者是查看啊,这是跟topic相关的,那再有一个呢,是什么是呃,咱们那个生产者的一个脚本啊,叫做o produce对不对?还有一个是呃,消费者的脚本叫做conso consumer啊对不对?那topic的脚本呢,像肯定比较重要,它是干什么用的,就是我们创建、删除topic都得用它啊,这个比较重要,那接下来主要是他俩,一个生产者,一个消费者,这俩脚本干什么用的呀?
05:09
他俩干什么用的呀?它俩主要用来做测试的啊,主要用来做测试啊,什么叫做测试,你假假如说我们现在啊,比如说我们后期咱们一会要干什么,要要写一个对不对,那要把数据写到卡哪里,那咱们怎么知道这个数据它到底有没有进卡卡。对不对,那咱可以怎么办啊,我起一个卡不卡,那个消费者客户端是不是就行,我消费就是哪个topic避,我能消费出来,那说明你前面通了,你消费出来说明没通。对不对啊,是这样,其实主要就是用来做这个测试的啊,那这些脚本呢,既然做测试,那后期咱们是不是需要经常用到啊,对不对,那所以说还是需要把它记住的啊,最好把它记住啊好,那接下来呢,我们就来呃简单回顾一下这几个命令吧,那首先我们先说谁,咱们先说这个创跟topic相关的啊,CD到op pd mole卡不卡,那比如说我们现在先查看一下我们基因当中现在有没有诶topic怎么查看是不是有一个bin卡不卡topic.sh啊然后边我们需要给他指明一个,呃杠杠什么东西,杠杠组K对吧?Zke p,然后大家要注意啊,这个指定杠杠组ker是仅仅指定卡那个组开集群地址就行了吗?
06:23
是吗?哎,不是啊,哎海子不要那个22181,你只只只只指明一个这玩意行吗?不行,你要指明那该是什么呀,应该是卡不卡那个节点。啊,就是卡夫卡在主K上注册的节点啊,咱们是不是给他注册卡夫卡节点的呀,所以说你这儿呢,得写上一个KAAFKA这样才行啊,这样才行,要不然他找不到啊,好,那就来下一个,下一个应该就是我们这个要执行的命令,比如说要查看topic的,那就直接list。哎,例子,哎,你会发现这里边是不是啥都没有啊,哎,啥都没有是不是感觉有点奇怪。我们前面讲过,卡不卡里边儿有没有一个内置的头皮呀,有没有有哪个。
07:05
叫做consumer对吧,那个内置的怎么没有呢?它既是内容,为什么没有。为什么没有?它什么时候才会出现呀,对,得有消费时候是不是才会出现呀,对吧,大家得知道那个topic它是干什么用的,那是那个就是用来记录咱们,呃,后边消费者的那个offet的,对吧,对不对,但是我现在还没有消费发生,所以offset还没有,还没有保存,没有保存呢,这个就没有被创新出来啊,等一会儿一消费它就出来了。啊是这样,其实啊,在之前这个0.9版本之前啊,卡夫卡的0.9这个已经很老了啊,0.9版本之前其实是没有这个内置淘皮格党啊是没有的,但之前咱们那个off赛的存档的呢,组K上边啊是这样,确实是这样啊,但是那种架构方式呢,设计呢,对这个组K的依赖太严重了啊,那所以说现在这个卡夫卡呢,正在逐步摆脱对这个JK的依赖,那所以现在卡夫卡的这个off赛呢,存在自己的一个topic里边了啊,不往里边存了啊行,那接下来咱们接着往下走啊,这是list,那假如我现在要创建一个topic,那就是哎,Create对吧?那我们需要声明以下几个参数,首先第一个杠杠看topic,你得告诉他你的名字是啥对吧?那比如说我们就叫做first啊,那后边还有什么呀?杠杠来发分区数,PS partition,那我们声明几个呢?
08:31
啊,比如说这个三个啊,比如说五个,那我们学习的时候也没有考虑这个问题,那说几个就是几个对吧,但实际上在我们生长环下,这个问题咱得考虑一下,到底我分几个区域比较合适对不对啊,那一会给大家说怎么去来确定啊,那后续呢,还有什么呀,还有副本数,副本数应该是p republicanation,啊,Repin republicanation啊,Tin,然后呢,Factor FA,那相当一个副本的一个因数,对吧,就是副本的个数啊,那通常我们就是二啊好,那现在咱们直接这个回车走你。
09:03
啊,那这个topic呢,咱们就能够创建出来了啊,这个咱们创建topic,那创建完之后呢,我们得需要得得学会学会干什么,咱们得学会去哎查看这个topic怎么查看呀,D CI describe对吧,然后后边呢,我们杠杠哎topic,然后诶first回车啊,然后他会给咱们打印出来一些这样的信息,这个信息大家能不能看明白。等产能是吧?啊首先这是topic的名字,哎,分区的个数,副本的个数啊,这是你在创建topic的时候呢,你加的一些额外的参数,咱啥也没加就是空的啊,那下边我们每一行数据都是一个啥。一行是一个什么?一行是一个分区啊,一行是一个分区啊,你看topic都是first啊,那这个是分区哎,零分区一分区二啊,这是分区的ID啊,那后边咱们这有一个leader对不对,Leader咱们这儿也是012对不?那这个012跟这个012是一样的吗?不一样啊,这个零一二指的是啥呀?对,指的是broker ID。
10:04
因为咱们这巧了啊,我们那个broke也是012啊对吧,那所以说这个相当于什么零分区的leader在零节点,也就是谁在102上啊,那一分区的leader啊在在一,也就是103上面,那这个二分区的leader在104上面啊,是这样的啊,那后边我们这有republic啊副本,副本011220这指的是什么。啊就是呃,对一分零分区,那我的两个副本一个是在102,一个是在103,然后leader是102上这台啊是这样的啊,你会发现啊,同一个分区的多个副本是不是肯定不在一台节点呀,对吧,在一台节点就没有意义了啊那后边呢,是那个isr,这个大家应该都知道啊不知道行这个咱们就不再多说了,行,这是我们怎么去查看一个topic啊,那删除呢,就是delete,咱们就不演示了啊啊那接下来咱们重点去说一下,就是我们卡不卡这个生产消息和这个呃去消费消息啊,重点说一下这个啊来咱们把这给大家讲一下。
11:06
那接下来呢,我们先演示一个生产吧,先一个生产,那怎么生产啊,应该是B啊,卡夫卡council,呃,Produce啊,然后后边呢,我们需要理想啊,你要往卡夫卡里边写数据,你需要告诉他什么信息啊。首先你得告诉他集群地址,我得知道往哪写对吧?啊,那其次呢,还得告诉他啥对,还得告诉他是什么topic了呀。对不对,你得告诉他什么topic,因为生产者面向的是不是一个topic呀,啊对,就是这样的啊,那所以说我们首先先指明咱们卡不卡集群地址,那就是杠杠ber broker,然后呢,List啊,后边需要写的是什么。就是卡夫卡集群的地址,然后咱们还做102啊,然后呢,冒号多少9092对不对,那我能不能再写一个呢,海度和103,然后呢,9092能不能这么写。
12:01
可不可以可以啊,或者说我这只写103,或者是只写104行不行,行,你写谁都行啊,你写整个卡布卡集当中任意一台节点或者是多台节点都可以啊,都可以注意啊,这个你写什么和你这个数据最终写到哪台节点有必然联系吗?没有必要联系啊,这个必须得搞清楚啊,不是说我这写102,那我数据写到102的啊,我写103就写大三,不是这样的啊,那一会儿我给大家简单说一下咱们这儿的这个东西到底是干什么用的啊来,那先写一个基金地址,然后后边呢,还得再告诉他你要写的topic是谁对吧?那比如说我要写的是first,那这时候就可以回车了吧,诶走好,那这时候我会阻塞在这个位置,比如说我写点信息AAA啊BBD,然后这个诶删除,然后CCCC,然后ddd,好,那数据现在是不是就写到了我们这个内置写到这个first topic里边是了啊,是这样的啊好,那接下来给大家简单说一下啊,咱们这写的这个玩意儿到底是啥?为什么写一个也行,写俩也行,写三也行啊,为什么?
13:06
啊,实际上是这样的啊,大家得得得得知道我们卡夫卡生产者,我们写数据实际上是往哪儿写的。大家都知道那句话,都会说都是往leader写对吧?啊,那大家想一想,既然要往leader写,那我这个生产者是不是必须得知道啊,你这个first topic啊,你的每个分区的leader都在哪台节点上,他才能往那个leader写呀,对不对,那他怎么知道的呢?啊,就是通过你传的这个地址知道的啊,是这样啊,我们在卡夫卡的这个R里边啊,咱们R就是一台节点对吧,每一个broker它都会维护一个咱们这个topic的原数据。啊,它也有一个所谓的原数据啊,也有一个原数据啊,每一个broke里边都有一份,而且他们这个数据呢,是绝对同步的,是一致的啊,他们是一致的啊,那这个所谓的topic的原数据指的就是什么信息啊。
14:05
指的就是什么?就是刚才咱们去describe出来的那个东西啊,咱是不是刚才describe了一下啊,对不对,哎,那个里边的信息指的就是咱们每个topic的信息,实际上就是什么呀,里边有,诶你这个topic有几个分区啊,然后每个分区你的leader在哪台节点上是不是都能看,都能够看出来呀,对不对,是这样,也就是说,诶,我们实际上首先咱们的生产者会先去卡卡集群里边先去获取这个原数据信息,那获取之后,那他就知道我这个目标的topic他的所有leader都在哪了,对吧,然后就可以往对应的节点发数据了。啊,那所以说咱们写的这个东西实际上是在干什么呀,就是告诉他我这个卡夫卡集群地址啊,目的就是让他去获取这个原数据,那既然每台节点上面是不是都有一个原数据啊,对不对,那咱们是不是写谁都行啊,或者写一个写俩都行,那一般情况下咱们这写几个呢?写两个啊,一般情况写俩就行了啊,为什么写俩呀,因为写一个有可能,可能你点比较背对吧,正好这个集群里边这台节点它就出问题了,那你是不是拿不到原数据了呀啊那但其实咱们卡发当中,我一台节点挂了,影响我写数据嘛,其实不然,我有副本啊对不对,那其实正常情况应该是不影响的,但是因为你这什么呢?你这比较巧,你拿不了原数据了,拿不了原数据是不是你根本也写不了啊对,所以咱们一般情况下写俩就行了啊,写俩这个挂了,我可以用另一个。
15:29
啊,一般就写俩啊好,这就是咱们这个地方大家知道就行了,行,那这个生产者我相当于已经把消息写到咱们的卡夫卡队列里边了,好,那来咱们演示一下这个消费者啊,那消费我们也是CD点点,我在103消费吧,啊开一个卡夫卡这个cons。Con conso,这个consumer consumer,然后边呢,我们杠杠,哎,这个先写那个put吧,BOO。S starp,然后杠svr啊,然后还do吧,102,然后呢,9092,那大家注意这个不t store呢,是不是也写的是卡普卡集群的地址啊,对不对,那他的目的跟生产者那边是不是一样啊,因为我消费者我也要找leader啊,所以说其实也是为了获取原数据啊啊那后边还是告诉他我对标的那个topic是谁啊,那还是first啊,然后大家呃,前面还真有一个同学问过啊,说诶为什么生产者这边哎,我这写的是博克list啊,然后卡布卡这边写的是bootrap server对吧?然后到了我们写生产者或者是消费者API的时候呢,我发现生产者和消费者都是写,都写的是啥,都是不service对不对,那这是为啥呀?
16:39
这啥,其实道理很简单,咱们这儿传的这个参数,仅仅传的是什么参数,这是不是就是给这个shell脚本传的参数啊,但其实这个shell脚本它底层也会调用啥呀。它这个脚本里边其实也是调用的咱们那个Java API啊,对不对,那消费者那时也是调用的加API对不对,也就是你传的这个参数名仅仅是给这个脚本传的,但其实它往Java API里放的是啥呀,都是bootup service,都是那个脚本能理解吧?啊,所以说这个呃,只是这个脚本这块的一个参数名而已啊,这个无关紧要啊,他要求咱们写上,咱们就写上就行,甚至你都可以怎么样啊。
17:17
甚至你是不是都可以去改这个脚本啊,对不对,你改脚本把里边的broke list给它改成不serve行不行,可以啊也可以啊,那所以这个啊没什么啊来那这块我们相当于完事了,完事之后呢,我们啊回车让他消费一下走诶诶正常情况下,咱们那个topic里边有没有数据,现在有刚才我是不刚刚写进去的呀,那为什么没有消费道呢?啊为什么有,哎对同学想到了一个这个哎,From beginning这个参数对吧?那大家知道那个from beginning其实它配的底层是哪个参数吗?是那个参数,哎,对,就是那个参数啊,咱这里边找到,比如找的卡不卡kaf KA,咱们去看一下那个参数,那个参数很重要啊,那参数要是搞不清楚这个卡本啊,用起来就迷迷糊糊的啊,咱们找到诶它官网变了啊,找到DOS啊,找到我们这个对应版本,咱们2.4对吧?啊二次我们在这里边呢,去搜索一下,呃,咱们那个卡夫卡,呃,这个相关的配置参数啊,这个卡呃,官网正在加载啊,没有加载出来比较慢啊。
18:23
比较慢。行,那咱们就先不等它了,我直接给大家简单说一下这个参数啊,那个参数的名字呢,我没有记错的话,应该是,呃,叫做卡普卡,呃叫叫做那个什么offet auto reet啊,它差不多就这样的一个参数啊,那个参数它的作用是什么啊,是这样的啊,就是说当我们卡夫卡的一个消费者去消费一个topic的时候啊,那正常情况下,假如说我之前消费,然后我停了再重新启动,如果是这种消费方式的话,那应该从哪开始啊,那是不是从你上次停的那个位置接着消费啊,对不对?诶但是有这样的一个问题,就是我们卡不卡一个消费者,我第一次去消费一个top的时候。
19:03
那是不是现在没有off呀,我也不知道从哪开始消费,那哎默认就两种策略了,一个策略就是从你这个topic最早的位置开始,那一个呢,就是从哎最新的位置开始啊,默认是从哪开始啊,哎默认是最新,默认最新,那所以说咱们最新是不是现在还没有往这里边写数据啊,所以你这消费不到啊,那你要想消费到两种策略呗,啊要么你在那呢,加上一个那个什么杠杠from beginning这个相当于就是什么呀,就是从最早的位置开始消费了,那就能消费到,那或者说我现在怎么办,我现在启动卡,我卡消费者之后,我再往里边生产啊E1,那这边是不是正常情况下应该能够消费到才对啊对,应该是从最新位置嘛,是这样,就这个东西,这个关系呢,大家得搞清楚,把这搞清楚,那使用卡不卡的时候呢,就是能少走一些弯路啊,要不然的话可能会有疑问啊,哎,我这个数据明明到卡不卡了,为什么我卡不卡后边这个消费者我消费不出来呢,那就可能是由于什么导致的,是不是就由于这个参数导致的呀?啊就是大家得想到这一点啊好,那现在把这个。
20:04
视频录一下。
我来说两句