00:00
好,同学们,我们来继续往后说了啊呃,那我们ES呢,还剩两章内容啊,我们先来看这个第五章啊,就是分布式的一个读写原理啊。这个第五章我们主要讲的就是原理性的东西啊,这个没有什么需要你做太多操作的啊,大家这个跟着我去过一遍啊,然后听一听,把它里面一些这个原理呢,呃,掌握掌握啊,了解了解。OK吧?行,那我们先来看这个第一个啊,叫这个写流程啊,就是我们跟大家去说一下,在这个ES中啊,如果说我想去写入一条数据啊,它大概是一个什么样的一个过程。好吧,来看一下,呃,那我们刚才我们说的这个写流程呢,我们是基于这个ID的啥呢?这个基于ID呢,就是你在写数据的时候呢,你要什么给我指定一个dock ID啊,就说白了,它是一个什么密等写入。能听懂啊,密灯写入啊好呃,那么在这个写的时候呢,我们先明白一个原则啊,同学们,这个原则就是所有的这个写操作啊,所有的写操作必须在主分片上面完成以后。
01:04
才能够被复制到相关的这个副本分片。就啥意思呢,比方说我有一个啥的啊,我有一个煞的,然后这个煞的话,就比方说有两个,有两个副本嘛,就是他是一个,然后再来一个啊。对吧,这也是一个啥啊,就是比如说萨0S0啊。可以吧,啊,这是你的主分片,这是你的副本分片,那么对于这个写操作来讲,只有这个主分片啊,他才有资格去负责写,你的副本分片是没有资格去负责写的。听懂了吧,先把这个原则给大家记住了啊OK,那记住以后呢,我们接下来就呃结合这个图给大家去说一下啊,那么首先我们肯定会有一个客户端哈,同学们会有客户端,客户端呢会什么?会发送一个写请求,这个写请求发过来以后呢,你看一下啊,我们的ES有很多个节点,比如说NOTE1对吧,NOTE2,什么NOTE3啊,以及什么note等等等等有很多节点,那你肯定为什么连到其中的某一个节点。明白吧,啊,比如说假设哈。
02:00
我们向你的NOTE1发送了这个写操作请求,就发给了他了,那么这个时候呢,NOTE1啊,它会被。为什么呀,他会被什么被任命为啊,你是一个协调节点,就说白了,我会什么临时给你啊啊。给你安排个什么,安排个角色啊,告诉你你是一个什么协调节点,啥玩意叫这个协调节点呢?协调节点其实就说白了啊,它是协调什么呀,协调客户端。对吧,啊,这是你的客户端啊,这是那个协调节点啊,然后呢,跟什么跟你的ES群啊,就是他是什么协调客户端和SESSES这个集群的,比如说我要接收你客户端的请求,发给ES集群,对吧,然后将来把结果呢返回给协调节点,再发给你的客户端啊,他做这个协调工作好吧,就是谁接收这个请求,谁就是那个。协调节点。OK,那么这个协调节点啊,他接收到这个请求以后,因为我们这个写操作是基于ID的,好,那么他就会怎么通过你的ID呢去做计算,我看一下你这个ID。要存到哪一个分片上啊,存到哪个分片上。
03:04
OK,呃,他怎么去算的啊,他为什么通过这个就是。哈希去算啊,通过哈希啊,然后进行计算啊,因为我们这个ES中啊,它这个分片呢,它不像我们这个就是那个HDS啊,它就什么,比如把你的数据啊,按照什么这个大小啊,然后呢,给你什么分成很多个块啊,就是128兆一块,128到一块啊,它什么整体去分的啊,但是ES中不是的啊,它是什么呀。它是什么按照这个哈希进行计算的啊,就对你的每个ID做哈希计算,我哈希出来以后呢,你在哪个分片,你就把它打到哪,打到哪个分片上。那经过你哈希计算完成以后呢,那么将来我在查的时候也很好查呀,对吧,我对你的IDE哈希,我就知道你是在哪个分片的,我就直接把这个结果打到哪个分片,对吧?是他的存的时候,它是做过计算的啊OK,那这个时候我们怎么通过你的哈希计算,我算一下你到底要分到哪个分片上啊,假设啊,我们计算出来以后呢,你是要发给这个分片零的。
04:00
能听到吧,发给这个分片零,OK,那这个时候你看一下啊,在我们当前这个结果中,我的分片零在什么呀?在这个地方有,这个地方有,这个地方也有。对吧,好,但是我刚刚说过啊,只有你的主分片才可以做这个事儿,因此。他就会什么,把你这个写操作发给你的主分片就是NOTE3了。明白吧,因为你的主分片在漏三上面啊,它会把这个写请求呢,发给这个主分片。然后让他们就负责这个写操作啊,那么等他把这个数据写完了以后啊,注意啊,就是我的主分片把数据写完以后呢,然后接下来呢,我们的主分面呢。看一下啊,我们的主分片会干嘛呢?会把这个请求呢,转发到你的NOTE1和NOTE2上的副本封面,就说白了,我写完了以后,我会把请求呢再发给他,再发给他,说来你们也帮我写一下,因为你们是副本呀。对不对啊,那么等他们两个也全部都写完以后呢,这个时候。呃,我们的NOTE3啊,会像什么,会像这个协调节点,报告说写成功了啊,就最后呢,他的什么再去通知一下这个协调节点。
05:07
明白了吧,啊,因为什么你要写什么东西,是人家告诉你的,然后最后你把这个工作都做完了以后呢,他再去回头告诉人家说你看我都写完了啊,写完以后这个时候他作为我的协调节点,他要去通知我的客户端说写成功了。明白吧?哎,大概是这么一个过程啊,行,说这个写流程啊,大家都记住,第一个只有主分片才可以写。好吧,副本分面的话呢,只能什么复制这个复制这个什么复制啊复制,然后他不能够什么做直接的写操作啊,不能够接受这个写请求。好,再一个这里面还有一个,还有几个关键点啊,就是我怎么去确定你的某一个文档要存到哪个分片,这个是什么通过哈希计算的啊,刚刚我说过啊,下面其实也有一个公式啊,就是拿你的。什么呀?呃,拿你的这个ID啊,拿你的ID,然后作为一个哈希计算,就是这个RO呢,是一个可变值啊,默认就是你的文档的ID,就说白了,相对你的这个文档ID啊,做一个什么哈希计算,哈希完成以后呢,要对你的什么,这个就是你的这个杀的数啊做这个取操作。
06:11
对吧,取出来是几,那就是几。OK吧,比如说我们有三个煞的,那我就是012,总共有什么三个煞的。是吧,那我对三做取一操作,那我结果不可能,结果就是什么零与二吧啊,在零那我就什么写到SH,零上面在一我就什么写到SH的一,如果是二,我就写到什么SH2对吧?啊,他这么去做的啊。好,这就是我们这个写操作啊,这里面就这么几个点吧,第一个就是刚刚强调的啊主分面这个事儿,再一个就是什么,他怎么去确定我的ID要写到什么地方。是吧,这个是很简单的啊行,那这个如果我们明白以后啊,接下来他这段有个问题啊,说这个如果说我这个Sha的数量发生变化,是不是要怎么重新做这个reha c呢。啊,你看他在说说说什么事啊,就是你的数据啊,都是什么,按照你的这个煞的个数,然后进行计算的,比如说你目前有三个煞的。
07:04
对不对,那我所有的这个数据来了以后呢,我都要什么?对你这个三的做取操作,取出来可能是零,可能是一,可能是二。对吧。啊,那么他的意思就是,假如说哎,将来我下的由三变成四个了。对不对?那你原来对三取余等于零的结果,现在你对四取于就不一样了吧,可能是一了,那你说我们需不需要把你的数据呢,从你的零上面拿过来,全部都放到这个一上面呢?对吧?从二上面放到一上面,从一放到零,从一放到二,从二放到零,这个都有可能吧,从零放到二,那我需不要重新把这个数据给你重新做一个哈希操作,重新计算一遍,重新存一遍呢?对吧,这个问题你要去想一想。啊,如果说你能从三改成四,那这个过程你肯定要去做。对吧,如果你不做,那你的数据算出来以后,你的位置是不对的。对吧,但如果说哎,我让你从三变成四,这个事情我要去做的情况下,那你想想这个工作还是。
08:01
很耗费时间,很耗费性能的吧。所以说我跟你讲啊,ES中你不用担心这个问题了,为什么呢?因为你的sa的个数它是不让你去改的。明白了吧,就只就你这个index,你在创建的时候呢,你指定好了你这个下的个数,将来你就不能再去改了,比如说你指定了三个,那你就一辈子就是三个,你不能可不可能再改,因为你一改那就真的就会什么涉及到这个re哈问题,这个是很重的一个操作。明白吧,同学们,这是很重的操作啊,好,说这个东西啊,你要记住啊,他是不让你去改的。OK吧?行,这之前你们应该也研究过这个哈西是吧。肯定也听说过啊,讲比如说讲这个的时候应该也想过吧。对吧,那你想想吧,他怎么去解决这个问题啊。嗯。讲集群的时候对吧,你说我这个总共有三个假如,假如说三个节点。
09:03
假如是三个节点啊,那我将来我的数据呢,我过来一个KV啊,那你说我这个KV往哪个节点里面去存呢。他为什么没有注意啊,为什么没有说直接拿上你的key,然后对你的什么节点数做取一操作呀,比如说等于零等于一等于二。为什么要这么去做呢?因为一样的,因为你这么做的话呢,就会有一个问题,就是将来我的节点发生变化以后,比如说变成四个了,变成五个了,对吧,那我取域的这个结果肯定就会发生变化,只要我的结果发生变化,那我的数据就要涉及到什么,从它里面往这里面倒腾,对吧,从它往这里面倒腾,然后呢,还有什么新的机器要我一直去倒腾。这就是一个哈希问题。那么大概率情况下。如果说你按照这个节点数做取一操作,那么将来你的节点发生变化以后呢,我差不多所有的数据都要什么,全部都要什么,重新计算一遍,重新什么去算一遍,重新去移动一下,这个事情是很很很很不好的。对吧,说这个red根本就什么,根本不会这么去做,他怎么做的呀,他不会对你的这个什么节点数做区域操作啊,他对什么呀,他对我整个集群的一个什么巢数,就你这个集群啊,它就规划好了,你将来不管是三个节点。
10:12
还有30个节点,还是300个节点,你总共就这么多个槽,16384个槽。对吧,那我将来我这个所有的K呢,我都对什么对统一这个数字叫16384做取一操作。对吧,那你取的结果就是零到什么16383之间。对吧。这是固定不变的,只要这个固定不变。那我就不用太去担心我数据的一个什么哈问题,比方说我将来扩容了机器了。对吧,那你扩容机器的话,你无非就是把它里面的一些槽,或者说把它里面一些槽,把它里面一些槽,然后移过去,移过去,移过去对吧?那我这种情况下,我只需要涉及到什么,你移动的这一部分潮的数据的一个移动,我需要把整个的这个节点中的数据都去重新计算一遍吗?根本不需要,因为我的数据是什么数据是跟着潮走的。
11:04
听到了吧,我的数据是跟着潮走的,你的潮在什么地方,那我的数据就在什么地方。听清楚了吧,所以说呢,它其实也会有瑞哈希的问题,但是呢,很少就只会有什么涉及到少量的数据做瑞哈希数据啊,做这个瑞哈希操作,而不是说这个所有的数据做这个瑞哈希。明白了吧,啊,这个我们就对比着去说一下啊,你看一下就它是什么把那个什么16384给你固定起来了,对不对,你看这个ES呢,它根本就不让你改,不让你改的目的不也就相当于把它固定起来了吗?这个东西一固定。那我的球衣操作肯定就是什么,在你的这个固定的这个值内的,比如说012,你有三个下的,那不就零二吗。对吧,啊,所以这个要能理解的啊,行吧,这是我们的这个写流程啊,这个大家这个简单说一说啊,这个很简单啊。
我来说两句