00:00
好,那上节课咱讲了挺多啊,那大家就大大概现在能掌握到什么程度就行了,就知道我们德鲁伊,那它的这个基本的这个呃概念就是它能干什么,它的性能如何,先能搞定,然后它的特点是什么,诶这个简单看一看,然后下边的应用场景,呃,我们有一个初步的一个认识,诶然后就行,然后下边呢,我们来看看这个德鲁伊的框架原理。呃,一看这个图呢,可能有同学就头就大了啊,这么多乱七八糟的什么东西啊,这是是吧,确实比较乱,呃,而且确实啊,德鲁伊的这个架构呢,确实比较复杂。呃,这个确实确实是这样的啊呃,那所以说咱们这呢,呃,先不讲这个它的框架原理,我们讲一个什么东西呢,讲一个跟它这个底层原理诶比较像的一个东西。底层原理比较像的一个东西啊,前面咱们讲过德鲁伊会干什么,德鲁伊我底层是不是会会我我德鲁伊是不是会会会那个存储数据啊,对吧,它是一个相当于是一个数据库对不对,时序数据库要存数据的对不对,那存数据你需要往里边写。
01:02
对不对,那也要从里边去读,也要从里边读,那这个我的德鲁伊的读写流程应该跟什么有关系,应该是和他这个底层存储数据的这个结构是有关系的,我不同的这个存储数据的结构,那我不同的数据结构,那我这个读取流程就是不一样的,那所以说我们从这入手,我们来看看德鲁伊它底层存储数据的这个数据结构,它是什么结构啊,它其实啊,它结结构应该是这个lsm。Lsm。T tree,那这个东西是什么啊?这个东西呢,就是说它首先我给大家说一下它的全称是什么,全称是log,然后这个morge tree,也就是日志结构合并数。日志结构合并数,日志结构合并数啊,那这个东西,哎,它是一个什么东西呢?它其实是我们这个存储这个数据的,有咱们这种数据库啊,存储数据的两大结构中的一种。那有一种啊,那我们呃,大家可能熟悉的这种存储这种日志存储数据的这种结构呢,可能知道有什么呀,诶咱们传统的关于数据库,比如说my circleql有有什么呀,他说有什么btra啊B加这些东西对不对,那这种结构我的特点是什么?我特点啊就是说哎,我能够这个快速的去,呃随机的去读写这个数据,我能够,而且我要是去写的时候,比如说我要去修改,我要删除,那我能够快速的去找到咱们这个数据的真正的这个在文件当中位置,我能够真正的去删除,或者真正的去修改某一条数据。
02:30
对不对,当然这种结构它也有它的局限,当我的数据量如果说很大之后呢,那可能我处理起来就没有那么快了,没有那么快了,也就是知识的数据量是有限的,对吧?那所以说后来呢,我们出现了一种什么东西啊,诶就是这个咱们这边讲到的这个l SM tree这个东西。这个日志结构合并数,日结合并数,那它是干什么用的呢?其实这个东西咱们看似陌生,但实际上大家已经对这个东西很熟悉了。
03:00
为什么呢?因为咱们学的H。它的底层原理就是日志结构合并数,其实包括咱们这个德鲁伊这边呢,其实也应用到了这个日志结构合并数的理论,也应用到了这个理论啊,那我们现在呢,呃,通过h base这个读写流程,我们去回顾一下,呃,这个h base读写流程,然后呢,去讲一下到底什么叫lsm,来咱们回回顾一下啊,我打开一个空白的地方。好,那我们先来想想,咱们这个数据啊,就是往HP里边写的时候怎么写的,来大家来看一下啊,我们往H里边去写数据的时候,咱们写到什么地方了,是不是会写到那个什么里边,那个h file里边啊,哎,咱们先不说它先写到哪,咱们就说最终写到哪,是不是最终会写到h file里H。会写到这个h file里h IH file,那写到这个里边它有什么特点啊,你想一想,我们其实有这样的一个好处的什么好处,那咱们这个就是说对于一个数据库来说,我肯定要有这个增删改查的功能,对不对,肯定要有这样的功能,那呃,随着这个数据量的增长。
04:08
那如果说我还是采用咱们那个传统的这种什么避税避加税啊,诶我可能数据量很大的时候,我去进行随机的这个修改或者删除的时候呢,可能效率上就没有那么高了,没有那么高了,那所以说诶咱们后期出现在这种这种日志结构合并数那特点,它的特点是什么呢?它特点就是我这个比如说我要删除一条数据,或者说我要修改一条数据的时候呢,我不是说我真正的去修改或去删除咱们这个数据了,我不是真正的去去去删除或修改了,我是干什么呢?我是诶在这个咱们的h file当中,诶我是我是不是再给他加上一条这个类似于一条这个修改日志啊,相当于是对不对,那我要修改某一条数据,那我就在这个HL当中呢,我是不是会有一条这个,诶新的这条数据的一个这个一个值给出现了,因为我修改,我实际上是新加了一条数据,那我要删除呢,我删除实际上也是新加了一条数据吧。
05:01
对不对,那这样一来的话,咱是不是就能够实现所谓的这个快速的这个随机读写了呀,随机读随机写随机写啊,就是去诶去修改或者是删除某一条数据,这就叫随机写随机写啊,那这样一来,你想一想,咱们数据量我甭管多大。对不对,甭管你的数据量多大,那我去删除一条数据或修改一条数据的时候,我所用的时间基本上诶都是不会增长的,诶都是这点时间。对不对,那其实这样一来,我能够实现这个所谓的快速,这个诶读快速,快速的写,快速的写,而且是随机的,就是假装是随机的啊,实际上他没有真正的去随机写,没有真正的随机写啊,是这样的,那这是咱们这个这个HL呢,其实在这呢,也就是咱们那个所谓的log more tree当中的那个,就是这个log,呃,SM tree当中那个L。就就是LS处当中的L,就是HL,就相当于这个L那一个文件嘛,就相当于类似于一个这个所谓的一个日志嘛,是这样的,那这个东西啊呃,大家可以可以思考一下,如果说我这个HL它越来越多,越来越多,越来越多。
06:04
那这样一来,诶,我们他有什么不好的地方呢,有什么不好地方呢?哎,不好的地方呢,就是说我们去读数据的时候呢,可能会比较麻烦。嗯,对不对,你读的时候会比较麻烦,为什么麻烦呢?你想一想,诶,那我去读某一条数据的时候,去读某一条数据的时候,比如说呃,我去读诶某一条数据,那我读的时候,那这条数据它是不是有可能会在每一个文件当中都存在。对不对,因为咱们前面讲过,我去删一条数据,或者是我去修改一条数据的时候,我实际上是追加一条数据,对不对,那有没有可能我去修改的时候,我第一次修改那数据跑这来了。在这个文件当中,那第二次修改的时候,是不是有可能在这个文件当中,第三次修改有可能在这个文件当中,对不对,那这样一来的话,是不是就是我们去读数据的时候会出现什么问题,我需要去扫描所有的文件。对吧,你需要把每个文件当中这条数据的这个修改记录或者删除记录都要拿出来,拿出来之后干什么,需要做一个合并的对不对?诶综合综合你所有的记录,我看一看我最终到底给客户端返回什么样的数据,如果说你有一个删除标记,那我就什么都不返回,对吧?如果说有多个这个状态,那我就返回最新的那个。
07:13
对不对,这是咱们这个读的时候,诶它的这个流程,这是我们设备的读流程,对不对,那大家可以琢磨一下,琢磨什么东西呢?怎么可以诶就是诶减少咱们这个扫描文件的这个个数,就怎么加快它的这个读的这个速度,那很显然你需要干什么,你需要定期的对这个文件进行合并,所谓的合并也是咱们这的这个lsm除以当中的M。就这个合并merge merge,那合并的过程当中需要干什么呢?合并的过程当中啊,需要去删除那些就是已经过时的数据,哪些是过时的呢?比如说咱们这有好几个状态对不对?那我比如说我只要最新状态,那历史状态是不是可以删掉就不用了,对吧?那比如说我没有删除标记,那有删除标记是不是你这数据相当于真正的删除了呀,那我合并的过程当中,我可以把它删掉。
08:00
对不对,那这样一来我多个h file,我合并成一个之后呢,那我后续再查的时候,我速度就会提升,就会提升,那这个呢,就是咱们这个所谓的l SM tree的这个,诶存储数据的这个结构。是这样的啊,那h base我们很显然就应用了这种结构,只不过呢,他对这个结构呢,做了一定的优化,做了一定的优化,做了哪些优化呢?诶比如说。诶,他他需要对什么呀,他需要对我们这个HL当中,我们有一个r key的概念,是不是要对rie进行排序,那对RK进行排序,其实为了干什么,其实就是为了加快我们查询的速度,对不对,我根据rockie去查询,我rock是有序的对不对,那所以说你有序的你就可以,诶利用它这个有序的特点,快速的定位你想要的那套数据。这是,诶他为了加快查询是有序的,那既然要有序,有序的话,你得排序是不是才能有序,对不对,那排序怎么排对不对,你往文件里直接写能排序吗?肯定不能,得在内存当中写才能排序,对不对,怎么办?在这个位置我们有一个store。
09:01
呃,不叫ma叫叫叫不叫ma叫什么呀?叫ma store,就是这个一个内存组件对不对,我数据呢,先写到内存组件当中,在里边排好序,我再往外进行flash,再写到这个HL文件当中。那这样一来你想一想,那咱们呃,这么去设计这个东西的话,虽然能排序,但是它有不好的地方,哪里不好呢?哪里不好啊,很显然是不是有可能会丢数据啊,有这种风险,那数据这个,如果这个写到内存当中,还没有往外写,那这时候挂掉了,那里面数据就丢了,这不行,所以说后边又引入了一个什么东西呢?引入了一个这个呃,W。Right ahead log、预写日志,所有的这个读写请,所有的写请求全部写到这里。而且是落盘吧,落盘。那你这个往文件里写,是不是感觉会写的比较慢啊,但其实这边并不慢,我们写的时候是是顺序写,磁盘往WR写是顺序写,那其实这个其实也是比较快的,也是比较快的啊,那写到这里边之后呢,再往ma这写,然后再进行排序,那这样一来就能够解决咱们这个丢失数据的这个风险,为什么?因为咱们在这儿是不是有记录啊,那即便这里边数据没了,那重启之后我是不是把日志回放一下就行了呀,那就又拿到刚才的数据了。
10:12
是这样的啊,这是咱们H贝斯它应用了这个lsm这个原理,那这边咱们的德鲁伊呢,咱们德鲁伊其实它底层也用了这个l SM tree也用了这个原理,也用了这个原理啊好了,那现在呢,我们去看一看它怎么用的这个原理。打开这个图啊,嗯。OK,我们,呃,把这个往下拉一下吧,往下拉一下啊,那现在咱们看一下这个德鲁伊的这个,呃,框架原理好,这里边的角色,这个角色是很多的啊,呃,每一个小方,黄色的小块,这都是一个它自己的一个角色,然后每一个灰色的东西呢,都是它依赖的外部组件,依赖的外部组件啊好了,那现在我们先看他自己的组件,看这个地方。这个地方叫做什么叫middle manager no,这个你甭管它,这个翻译过来叫什么,不用管了,你就看它是干什么的啊来这有一个streaming date,有一个batch date,然后是往德鲁伊里边去写吧,这是对不对,也就是这个组件呢,是负责写数据的一个组件,比是我们写数据要找他,写数据要找他啊,那后边我们这儿还有一个东西,这有一个这个broke nose。
11:18
是什么?是不是就是一个什么代理节点啊,那它是干什么用的呢?它是用来处理这个客户端请求的。对不对,Client queries处客户端请求,那也就是一个是负责写,一个是负责读的,好那现在呢,我们呃回忆一下咱们h base的写流程已经回忆过了,对吧?那我们结合他去看一看德鲁伊里边是怎么去写数据的,好那我们既然写数据是不是要往这个里边去写呀,对不对,那这边写的时候我们德鲁伊呢,它同样是对什么呀,同样是需要对这个我们的什么玩意啊,需要对我们的这个呃数据进行这个呃排序的进行排序,那要排序是不是也得在内存里边去去做呀,而且这回排序按照什么排序,它是不是那个时序数据库啊,这有一个时间字段的,它是按照它进行排序的啊,它进行排序,那也就是说需要在这儿进行这个,诶相应的排序进行排序,那数据呢,写在这儿,呃,要排序要内存对不对,那是不是也是应该达到一定的预值之后,给他写到这个存储系统当中啊,那这边呢,有一个这个deep storage deep storage,那这个deep storage呢,我们可以自己配置,如果说你搭的德鲁伊是单机版,那它就是本地磁盘。
12:26
如果说你搭的是集群,那这边是可以配置让它存储到HDS上的,是这样的啊好,那假如说咱们是往HDS上存,那这边也说我达定一定的阈值之后呢,我flash。Flash完之后生成一个文件对不对,那这个相当于什么,是不是就可以跟咱们h base当中那个h file进行类比啊对不对,那然后大家这时候你注意一个点,注意什么点呢?我刚才说我们写的时候是直接往这个所谓的一个内存当中去写的。对不对,没有那个WL对吧,它是没有那个组件了,那所以说是不是德鲁伊这边它就有会有什么呀,会有这个丢失数据的这个风险啊,那前面咱不是讲过吗?就是德鲁伊适用于对这个数据质量敏感度不高的场景,其实主要原因是在这个地方。
13:09
主要是在这儿啊好,那这边呢。呃,他往这里边写,然后这个定期的进行flash flash这是我们写对不对,那接下来我们看读,那读的时候,咱们这个h base去读数去的时候会去哪读h base首先会去mato读,也会去咱们的h file读,因为是不是有可能我新写的数据还在内存当中,还没有flash啊,对吧?那同理,德鲁伊这边呢,其实也是这样的一个道理,也是这样道理,我是不是有可能一部分数据诶还没有flash到外边啊,那所以说我们broke nose这边去读数据的时候得去哪读,要么去内存当中读,要么去咱们这个deep storage去文件里边去读。对不对,那所以说这儿呢,有这样的两个箭头,那现来看,现在大家看这个地方啊,这地方有个什么,有一个historical notes historical notes,这是一个什么呢?什么意思,这是那个历史节点的意思,历史节点啊,它不是历史服务器,那什么叫历史节点呢?其实在这啊,指的是去那个呃,读咱们这个历史数据的。
14:09
读历数据,我就管它叫做历史节点,那这个历史数据是怎么定义的呢?就说只要诶咱们数据腐烂出来了,那这边我就管它叫做历史数据了,就已经成为历史了,那这个节点的作用就是去从deep storage里边去拉取数据,拉取回来之后呢,放在自己这个节点上,然后呢,供这个broke nose去进行读取。其实这边呢,相当于做了一个这个解耦啊,先做一个解耦,那它呢,它的功能是干什么,就是负责读数据,那这个东西呢,就是处理请求,对不对,咱们没有说让他也处理请求,然后让他自己也去外边拉数据,没有这样做好,那这就是咱们这三个节点,这是用来写的,那这个呢是用来处理这个诶客户端请求的,那读数据的时候呢,也有可能去这里边内存档去拿,也有可能去外部存储系统里边去拿,当然拿的时候不是他自己去拿,谁帮他拿,是这个historical note去帮他去拿的。
15:00
这是咱们这三个节点,那完了之后呢,我们看看剩下的两个啊。这俩这俩东西一看它的名字就不好惹,对不对,一个叫做coordinator的协调节点,一个协调者,协调者对吧,还有一个叫做overload overload什么意思,就是这个大家应该都听过什么myload myload那什么东西,那是大人的意思对不对?那在这呢,就是说统治者overload,这不是过载啊,是overload是统治者的意思,好,那他俩分别是干什么用的呢?我们来看它首先协调节点,那他协调协协调的是谁啊,协调的是历史节点。提历史阶段,因为我们其实德鲁伊更多的是干什么,是不是也是进行查询啊,对吧,那查询你其实需要大量的这个historical notes,对吧,那你需要把这个读数据的任务呢,在多个historical notes之间呢,进行均衡,进行均衡谁来干这个事,他干这个事的,这是它的作用,那这个统治者是干什么用的呢?诶它是用来是不是监视咱们这个middle manager的呀,也就是监监控这个的,对不对,那它的作用是干什么用的呢?它的作用呢,其实是去去辅助它,去协调它,去完成咱们这个数据的这个摄入。
16:05
完成数据的摄入,也就是他是管这个,诶管血的,那他是干什么的呢?他是管读的。主要是这样的一个东西啊,就咱们简单的了解到这个程度就可以了,然后剩下的呢,大家可以观察一下,咱们每一个角色后边是不是都是S啊,那也就是说我们每个角色呢,其实都可以配置成这个多个配置多个,那其实所有的任务都可以并行的去处理。那既然是都是多个,那他们之间是不是肯定有一个协调啊,谁去协调,诶组keepper去协调,就这样的,需要用到这个组keeper,需要用组keeper啊是这样的,然后这边呢,我们还有一个什么语言数据的这个存储,那这边语言数据它指的是谁的原数据呢?诶其实指的是咱们数据是不是要写到这个咱们的德鲁伊当中啊,那德鲁伊这边呢,我诶需要也是需要有一个这个,诶一个这个表的一个结构的,一个表的结构的,那后边咱们会讲叫做data source data source啊,那这个东西也是需要有这个原数据的原数据的,那这边呢,诶是存储它这个原数据,存储原数据。
17:01
是这样的,好,那咱们这样一来的话,这个德鲁伊的整个框架呢,咱们就相当于给它串起来了,然后大家呃去去看这个德鲁伊的时候呢,也不用去把这些文字都给它记住,不用记住你大致的去能够现在啊,能够了解咱们这个写数据的时候怎么写的,那我读的时候又怎么读的,能够把这个流程基本上自己能搞清楚就可以了,就是这样的啊,就是写,诶我先往这里写,然后往这里去flash对不对,那我读的时候呢,要诶去这看看有没有,还要去这个诶deep story里看看有没有。大致就是这样一个东西,好了,那这边咱们就完事了啊,文字就不再看了。好,那接下来呢,我们,呃,把这个视频去录一下啊。
我来说两句