00:00
那我们来聊聊一个分辨集群,那这个呢,咱们前面虽然聊了副本,它解决了咱们的一个数据可用高可用性的问题,对吧,降低的一个使用的风险,但是它并没有一个水平扩展的一个能力,那什么叫水平扩展或者叫横向扩容呢?也就是说我这张表100亿行,那我希望不不希望这张表只存在一个节点。我就要类似咱们其他框架那种分布式的,呃,思路一样,我希望把它拆分,比如说我分成了三块,那每一块存在一个节点上,也就是三台机器上面,对吧,那这样的话,每一个每一个块儿它是不是存的数据都不一样,对吧,看起来像不像一个分布式啊,对吧,多个节点嘛,那但是这种呢,呃。每一块我们叫它什么呢?叫它一个分片。每一块我们都叫一个分片啊,所以我们的分片集群其实就是对某一张表分成了多块啊,多个块它就是对吧,这边咱们也有介绍,将一份完整数据一分。
01:08
成切片,然后呢,分布在不同的节点上,大家注意分片是要在不同节点节点上啊,那怎么去操作呢?你既然是零散的对吧,你是不是需要有一个统一的。来管理这三个节点了,那这个东西叫什么分布式表。啊,分布式表,那它呢,是一个特定的表引擎啊,Distri beauty,那么它不存数据啊,因为他只是负责什么管,就类似于咱们分布式系统里边的一个老大master啊。它是一个逻辑上的一个表,数据它不存,那数据在哪呢?每一个节点上本地会存有数据,分布式表,只是负责沟通协调啊,统一管理,就是领导呗,就像一些领导不干活的,活头底下一线员工干的啊一样的道理,呃,这个大家要记住啊,不囤数据。
02:04
那还有一点要注意的是,咱们这个是什么。所谓的click house集群,它是表级别的,也就是说它是对某一张表而言。对吧,如果你某张表它不是分布式表,那么它。不是集群,它只是在本地啊,那实际在我们应用中呢,很多企业不一定会做这个分片,为啥呢?因为分片它怎么样操作起来相对比较复杂。而且有可能降低咱们的查询性能,这式因为你有了分布式,那可能中间就涉及到很多问题了,对吧,这个可以选择性的来,那我们先聊一聊他的一个写入流程啊,那咱们这边先聊一个什么三分片两副本,啥意思呢?一张表我P成三份,那是不是三个分片,我编号叫123,那同时呢,每一个分片。
03:00
我又对他做了什么副本对吧。我每个分片都做了副本,大家注意分片的副本本身,你也可以理解为是叫一个呃,复制的分片呗,或者说分片本身。跟他的副本之间是什么关系啊,互为副本呗,是不是他俩是不是没有主从关系啊,还记得咱们上一章节讲到的一个副本对吧?那所以你想想一共看起来有几个块啊。是不是一共看起来有六个块?对吧,一共看起来有六个块,是这个意思啊,咱们是以这个为案例来讲解,好,那你看。那这边你看到。怎么分呢?来我分一下是分成三个片,S呢代表分片,二呢代表副本,呃,所以呢,你看这两个都是S1对吧,左边这两都S1,这都是S2S3,首先是一张表切成三个分片,之后呢,每个分片又做了一个什么副本?
04:02
啊,这是S1的副本,S1的两个副本,S2分片的两个副本,S3分片的两个副本,所以我们可以看到一共有六个块,对吧?那如果资源允许的情况下,我们建议是每一个小块就分片本身也好,副本也好,呃,因为他俩你也区分不出谁是谁了,对吧?他们是互为副本的,对同一个分片的两份数据啊,那这一块呢。那一共是不是有六个六个块,那六个分片的话,那咱们呃六六个副本,那咱们最好是在不同的机器上面啊,最少最少你也要几个,最少最少你也要分布在三台上面啊行,这个是题外话。那它有一个谁来统领啊,是不是有一个叫分布式表啊,那我们说它不存真正的数据啊,来我们接下来具体看啊,这边是有一个参数叫内部副本。
05:01
说白了就是副本之间,它数据是不是得同步啊,那它同步啊分为两种情况,一种是内部同步,一种是非内部的,那什么叫内部呢。就是说副本跟副本之间他们自己进行同步,这种叫内步的啊,那我们看这个绿色的表示把内部同步打开,黄色的表示把内部同步关闭,那我们一般生产商会选择什么把它打开啊,那我们先挨个看呗,我们先看这个绿色的啊,绿色的。把这个参数打开,它是什么呢?客户端发送一个命令给谁啊,分布式表,分布式表向他的三个分片进行写入。对吧,三个不同的分片之后呢,那副本怎么办?大家注意由它本身向副本,其他副本进行同步。啊,由一个副本向其他副本进行同步,那一样的道理啊,那咱们这个二号副本呢。
06:04
S2的另外一个副本是由其中一个副本同步的,S3的副本也是由自己来同步的啊。那这种的话,你看对于分布式表而言,它出来需要几个。他是不是只需要出来三个就行了。对吧,它只需要出来三个,这个是处的情况下,那false呢,False咱们只看黄色的啊客户端发送命令写到分布式表,大家注意这个时候是怎么样,六个副本全部由分布式表来完成写入的操作。而不是由副本之间的同步了啊,之前是副本之间自己同步,现在不是我在写入的时候由你一起写入,那这种就有一个问题了,同学们什么问题你这么多都写,首先你对他来讲,对他来讲压力大不大呀?
07:00
对吧,这个就像什么呢?呃,就像你的,比如说你结婚了,生了一个儿子,然后呢,你是不是得赡养他,得抚养他。培养他对吧,后来他又是给你生了个孙子,他当然不是自己生了啊,他跟一个对象结婚了,这个时候。如果说。你的孙子也需要你来赡养。啊,不是,善良也需要你来培养,因为儿子不争气呗,挣不着钱呗,对吧,那这个时候你,你的儿子,你的孙子是不是都得你来掏钱,那压力是不是都扛在你身上,你是不是有点扛不住啊,对吧?那如果你的儿子比较争气,你是不是把你儿子培养成了,他结婚生子了,你是不是只要顾好你的儿子就行了?那你的孙子自然主要是由你儿子来照顾培养的,对不对?那你觉得哪种方式会更好一点?肯定是,呃。一层管一层会好一点呗,对吧。
08:00
而且还有个问题啊,呃,如果你是由分布式表完全来实现写入的话,是不是有些会成功,有些会失败啊。那这个时候这个参数是关闭的。这个时候他并不会同步给他。大家注意啊,它不会同步给他,所以会出现一个一致性的问题,所以咱们生产上总结起来,这个一般都是打开的啊,把它设为出,这是一个写入的一个过程,那么我们再看一个读取的过程,还是刚才的场景啊,一张分布式表,我切分成三个。片,每个片做了两副本啊,每个片两个副本,一共六个片啊,一共六个副本呗,那他呢,读的时候就有讲究的呗。我我首先不可能六个全读吧,六个全读是不是出现了数据重复啊,因为本身有互为副本的,那么那问题就来了,对于分片一。分片一来讲,他有俩副本,我到底读谁的呀?
09:03
你是不是得有一个原则对吧?那分片二你也一样,分片三也一样,每一个分片我该从哪里读呢?大家注意它这边,当然了,你说从什么网络拓扑距离来考虑,当然可以啊,但是它有一个原则,最高原则什么?As count,这是什么?错误数。他会选择这个值比较小的读,比如说它分片一来讲,谁比较小,上面比较小,所以他从这读,那对分片二来讲,它比较小,它才二嘛,他从他这读分片三来讲,他俩都一样,那怎么办?那就从呃名字近似的呗,对吧,那这个东西是啥意思呢?其实就是他发生错误的次数,比如说啊,你第一次尝试着从这读的时候,结果他可能由于网络IO啊,或者怎么样比较繁忙。
10:00
出错了,那他是不是换个地方从这来读啊,对不对。那这个时候,原来这个分片这里次数已经被记录了。Errors com唯一对吧,也就是说他在这个每长期的执行过程中啊,他统计的每一个节点,呃,每一个分片,每个副本,他访问请求时候的一个错误数,那最终呢,它就会自有一个值对吧?那每他下一次读取的时候,它就会从错错误次数比较少的地方读啊是这么一个原因啊,那么如果los count相同呢?也就是说这个情况它有几种方式啊,随机读,还有一个什么顺序读按照顺序呗。那还有。什么优先第一顺位的,还有后者名等等一种选择方式啊,几种选择方式那就比较随便了,大家都一样的话,那为什么有一个主机名相似啊,你想主机名相同大部分情况来讲,是不是表示它的网络距离是同一个同一片的对吧?会近一点,这是从习惯上来讲啊。
11:11
好,这是咱们一个读取过程啊呃,那我们再瞅一瞅它的一个。配置啊。这只是仅供参考,为什么?我们这种设计方案是不是需要六个节点,但咱们只有三排对吧?啊,满足不了,当然也有办法实现啊,咱们先一会儿再聊。那像这个呢,我们需要正常来讲这个分片配置,咱们还是跟刚才组keep一样,呃,就是在外部在创建一个文件。然后把分片的信息,副本的信息把它写进去之后呢,在咱们的config.SM文件里面指定从外部文件读取配置。因为咱们那个con.x ma里面是不是特别长啊,你找个配置找老半天烦死了对吧。
12:05
那么看看怎么配啊,呃,很简单。首先公司名呢,标签大标签括起来,接下来这是什么?远程服务,可尼卡house远程服务对吧,那接下来这个。集群的名称。如果要集群,你要给它起个名字,所以这个标签里边是你你写的啊,是你写的自定义的,说白了随便起,但你名字要记住啊,这个居帽就是咱们艾特硅谷里边对吧,鼓励商城啊。鼓励商城好,那接下来里边。这是一大块,这个叫什么。被一个煞的标签,煞的标签。呃,包裹住的,这叫一个分片。一个分片,咱们不是一共切三个分片吗?你数一数,这是不是一个?好,再往下数。
13:01
这是不是第二个,再往下数,这是不是第三个对吧。也就是说一共分成三个分片,那副本在哪定义呢?大家注意在分片里面定义,你看啊,这不是分片吗?那第一个分片几个副本呢,你看。这是不是一个副本,这是不是第二个副本,能理解吧,先定义分片,再定义这个分片的副本,那你看它定义的是什么节点跟端口啊,默认是9000啊,如果你改了这里也要呃,如果你原先呃9000你改掉了,那这边你也得改啊。那还有一个什么,咱们这个参数,我们刚才讲了,让副本之间自己进行同步会好一点,我们一般都制成处啊。那同样的道理,第二个分片是不是也定义了两个副本了,对吧?定义了两个副本,第三个分片也定义了两个副本。
14:04
但其实咱们用了六台机器,对吧,那有没有可能是这样的,跟卡夫卡一样的,你想想卡夫卡三个节点,它是不是也有分区,也有副本,或者说咱们三台机器我能不能这样,嗯,我叫S1。然后呢,R1。这个S2R1我都统一叫R1呗,好吧,这样比较好理解,这是不是三个节点。三台机器啊,但其实我们一台机器是不是可以放两个不同的分片副本?啥意思呢,我把呃,S1的副本我放到这儿。R2对吧,我把S2的副本放到这儿,这是不是S2R2,然后我把S3的副本放在这台机器上另一个副本啊,S3R3是不是也可以啊,对吧,但是这种呢,说实话就是你资源不够用的时候,你才会这么考虑,对吧?能分开咱们还是尽量分开,如果实在不够,你又非要做的话,可以考虑这种方案。
15:12
不同分片肯定不能在一起的。但是不同分片的副本。比如说这是S1的副本一,这是S3的副本二,它俩是可以在一块儿的,没事儿啊,那怎么配呢?无非就是改这些东西啊,对吧,改这些每个分片的主机名端口,你改改不就行了呗,啊那怎么改呢?比如说分片一呃副本在这儿,呃,用一个副本在101,一个在102,那分片二呢。我是不是可以一个副本在102,另一个副本在。哎,不不不对,这台101102啊,我我一共就三台呗,我就101102103啊,那这个就。分片一,它在101跟102分片二,它在102跟。
16:05
103对吧,那分片三它就在103跟101可以吧。你这么配就行了呗,那我这个把它放到一起呗,这是分片一,这是分片二。都可以吧,这是可以的啊。行,嗯,那后面呢,咱们就以呃三节点版本来部署一遍啊。
我来说两句