00:00
那接下来我们来聊一聊,呃,在我们使用的过程中可能会出现的一些问题啊,给大家提供一个思路,首先第一个你执行一个分布式DDR的时候,某个数据节点的副本不执行。也就是说你在创建一张表,Create table啊,分布式呢,就是on c这个鱼加上这个关键词对吧,后面跟上一个集群名,那在某一个节点上面,它并没有成功创建表。但客户端反而是正常,那报错就像这样子,他可能会有一些报错啊,这是不是从事啊,对吧,重试创建副本。但是一些其他的副本已经被创建了。有类似的这么一个错误,那这个问题呢,可能就是正常来讲不会有,那出现这个问题,正正常来讲呢,是对应节点可能出现了问题,你可以尝试着重启一下,一般就OK了啊。这是第一个问题,这个相对比较简单,那么还有一个数据的副本表和数据不一致。
01:05
也就是说他们正常两个副本之间是不是经过同步,他们的数据是完全一样的呀,但万一出现不一样的对吧,比如说这里10万条,这里才9万条啊,9万多条就有一个不一致,那正常来讲,它是不是应该正常进行同步啊?那。如果你长时间出现这个问题,那说明什么?他们俩之间出现了问题对吧,感情出现了破裂啊,那其中最可能的一个原因就是什么呢?那可能的原因,呃,当然咱们刚才说的是数据一致,呃,有了表,然后数据不一致,那目前这种情况是什么?缺少表的情况少表啊。也就是说还有一个节点没有,这个时候如果咱们手动进行修复的话,就是诶,比如说这个节点有表,这个节点没表,那我们就在这个节点把这个呃表的把它建好本地表,只要表存在,那肯定house它自己啊会去在副本之间同步一个数据。
02:16
那这就行了啊,那至于建表语句,你怎么保证一致呢?你可以通过这个语法,So so create table看一下是什么,然后去跑一遍就行了。那其实这个东西就副本之间的同步,这个我可以额外再提两句啊,就是咱们的分布式表写入的时候,比如说我有三个节点。呃。你这边的话,比如说是。三个分片两个副本这样子对吧,比如说这个是分片,然后对应的副本,当然我编个号的话,这是123,这个是对应分片号可能是231,也就他们是错开的,对吧,同一节点肯定不是自己跟副本本身,那这种是允许的,那现在问题在哪呢?
03:06
你咱们写写表的时候,这是不是一个逻辑上的分布式表啊,我们知道分布式表是一个逻,呃逻辑上的概念,对吧,它的数据是在分配里面存储,那你看你往里插入。他是不是得往三个分片去写呀。呃,还有一种情况就是包括副本他也一起写了。这是第一种方式啊,第一种方式全写,就是分片也好,副本也好,我都往里写一份,那这种会有一个致命的问题,同学们。就应该在部署的时候,要考虑到参数调整的时候,呃,你你现在是不是相当于一个多线程操作呀,对吧,我只是做个比喻,那么有可能有些成功,有些失败了,比如说这个他就失败。但是你写入已经完完事了呀。那咋办呢?
04:00
那是不是可能会出现个别副本少数据啊,所以这种方式不太推荐,另外你这样写的线程是不是偏多了,那比较好的方式是啥呢?是这样啊第二种方式。第一种方式是这样,我写入分布式表的时候,我只每一个分片,咱们是不是三个分片啊,我只写一个副本。因为分片本身咱们也可以认为是一个副本,对吧,也就是说他只写三个。只写三个,然后呢,副本就不,其他副本就不管了,不管你是几个副本对吧,那那之后是怎么办呢?它是由副本本身啊,换个颜色啊,副本本身比如说一号分片,它会给自己的副本同步数据。对吧,那同样的二号给自己的副本同步数据,三号给自己的副本同步数据,那这种方式是比较推荐的啊,这样呢,至少对click house而言,它的写入压力就小一点了,写入压力小一点。呃,那正是基于刚才介绍的第二种情况,咱们才可以实现什么。
05:06
自动同步。对吧,那这个是有一个参数的啊,有一个参数可以去设置,我们正常都是会把它打开啊,那还有一个第三个一一个可能的问题,副本的节点全量恢复。也就是说某一个数据副本它启动不起来了。需要重新,这个时候怎么恢复啊,如果你要重新创建的话。这是最简单最直接的一个办法,因为你指不定是因为什么问题出现了异常,对吧?当然能解决最好,如果解决不了,那就重来呗,那重来怎么办呢?有问题的这个副本节点,我们把它的原数据跟数据就这两个目录。把它删掉。把它清空掉,然后呢。你不是有其他副本吗?你将其他的原数据目录拷贝过来之后了。啊,这这里面是不是只有表结构啊。
06:01
对吧。那就行了。那同样的大家知道。是不是可以自己什么。自己同步啊,但是我们也可以执行一个啥呢,这个。这名字很直白的吧,False强制恢复数据啊,也可以手动来触发啊,手动触发那之后呢,你再去启动就可以了啊,就OK了,这是一个手动来恢复的,一个完全重新恢复一个副本的方式啊,那还有再看第四一个问题啊,第四一个问题,数据副本启动缺少主keep上的表。也就主keepper,咱们click house不是严格依赖主keepper吗?对吧?呃,那这个时候呢。主keepper,如果某一个副本对应存在主keepper,里面的信息没了,丢失了,或者不存在了。
07:01
那就有问题了,为啥呢?问题在于click house自己的原数据里面有,但主keep里面没有。那就有问题了,那可能会报这种错。不能从那个主keep的节点上获取到数据,就查不到呗,因为主keep已经没了嘛,那这个时候怎么办,怎么修复呢。呃,我们选择的方案是在click house的原数据目录下面,将该表的一个结构文件把它删了。把他删了。呃,然后呢?我重新创建这张表。重新创建下,为什么?因为你创建的过程过程它会往主keepper去写一份,对吧?当然如果你只能够严格按照它的规范路径,在主keepper里面手动写进去也行,但这样没必要,对吧?你把表的原数据一删,重新执行一个建表,那主keepper它自然而然呢自还会写一份进去,对吧?那你就不用考虑研究说它格式是咋样的,没必要啊,没必要。
08:12
那同样的数据怎么办呢?我们说副本之间会自动同步嘛,对吧,采取这种方案,那还有可能一个问题,To keepper。也就是说我咱们执行一个三表的语句。Top table正常,这张表是不是就被删了呀?那你想想,其实他还得删一个地方,除了原数据,还有data。就是click house的数据路径这两个嘛,原数据和data,它主keep上面保存的信息是不是也得删了,那既然是多个地方,多个操作,就可能存在一个问题,有的成功有的失败,当然这种情况比较少。那比如说删除keep的时候失败了。那么在click house本地的路径下是不是没有了?但是主keep里面还存着,如果这个时候你要把原来那张表再进行重建。
09:03
啊,比如说你在执行一个create,那它是不是第一步,它会在本地的原数据里面。生成对应的表结构啊,第二步它是不是往主题本里面写。但是在第二步的时候,他发现这张表的信息已存在了。这就是一个异常情况啊,异常情况呃。那这咋办呢?其实这个时候也简单啊,你想啊,既然你既然表示两步有一步已经有已经存在了,那我就不要用create语法嘛,你缺啥,现在你想想一张完整的表结构缺啥。足有了。哎,对,是不是少一个原数据信息啊,那你从其他节点把原数据的信息文件结构文件把它拷过来就行了。那这样就OK了。其实这些问题解决思路大家。
10:01
看一看啊。不管是什么副本,有异常啊。表少啦,还是异常,我要做全量恢复了,还是主keep里面跟本地存储的数据不一致啦,大家只要抓住它的执行过程,那就很清楚,对吧,你就知道有哪几个地方。他执行一个操作,哪几个地方会变化,那哪个地方环节出现了问题,咱们就统一的思维就是什么,把这个有问题的地方我先清了,我从其他正常的节点对应文件把它拷一份过来,对吧,你是原数据文件缺了。那你就搞一份过来,你你是。数据数据文件就不用管了,对吧,那如果是do keepper。的问题,主keep缺少,咱们是不是可以考虑把其他都听了再写一份,因为主keep的结构咱们就没必要去了解了嘛。相对比较麻烦一点啊。
11:01
基本都是这种思路啊。行,那再看第六这么一个问题啊,格格号节点意外关闭了。那这个意外关闭,你可能会觉得我重启就行了,对吧。啊,那其实呢,没没错,但我们来分析分析它有什么影响范围啊,那在我们实际使用过程中,可能是这么一个情况,我某个节点宕机了。但是这个时候我在执行插入。我在执行插入,那这个时候会不会有问题呢?首先我们考虑是数据会不会丢呢。那至于我们的一个现象是什么,写入它也不受影响,数据查询不受影响。但是如果咱们执行建表语句分布式,这里特指的是一个分布式表啊,分布式表比如说咱们三个分片啊,这是一个分布式表明,那它是不是会在每一个分片上面。
12:01
本地创建一个本地表啊,它就是这么一种方式嘛,那比如说这个节点有问题,那他在这个节点执行创建的时候就会出问题了。对吧,就像你身体,呃,你胳膊痛。你胳膊痛,那别人摸摸你的头,摸摸你肚子。对吧,摸摸你的腿。你可能没感觉,但是一碰到你的手受伤的地方,你是不是就知道痛了呀,对吧?这个道理也很简单啊,那同样的,你看我们这个时候会报什么错呢?是不是超时了?超时了对吧。那这个时候怎么办呢?那你就得把节点问题解决掉,还是这个情况嘛,那我们考虑一下,我把它节点假设我可以重新启动起来。那数据会丢吗?没事儿,因为你想想咱们仨这些点。其实就是一个容错的问题,你一开始部署的时候,咱们说了分片跟副本可以在同一个节点,但是他俩肯定不属于同一个分片的吧,也就是说分片我叫123,那副本对应的是不是也是一的副本,二的副本,三的副本了,那他俩就不可能在同一台机器嘛。
13:19
对吧,这是一个分布式的一个好处啊,容错,那你只要正常把它启动起来。这也是为什么写入不报错对吧?一就是123号分片,他都能找到一个能写入的地方,要么是正常分配,要么是副本。也就是说123不会少数据可以插入,那至于建表出问题,是因为这个节点不行了啊节点不行,那我们把它启动起来之后,这个节点缺少的数据我们说了副本之间会怎么样自动同步。啊,所以问题不大啊,问题不大。那其他的问题咱们可以参考一个,还有一些其他的,可能你会碰到各种各样的问题,那之前也是在阿里。
14:04
在阿里那个官网。阿里云的这里看到一些click house,当然这个click house是他们,呃,可能是修改过的,但大概是一样的啊,就定制化的。你找他们购买的话,是一个收费的功能啊,你看这边有一些什么常见问题。常见问题。可以去瞅一瞅有没有你。想要有没有你碰到的问题,其实这里很多咱们都也提到过,对吧,比如说分布式DDR报错,什么超时,这刚刚讲过什么问题啊。某个节点坏了,我执行DDR。分布式的表的DDR的时候,碰到那个异常节点,我就报错了嘛,超时嘛,连不上嘛,没应答嘛,对吧,坏了坏了啊,那像其他的跟其他的外部系统做一个集成的时候也有对吧,比如说。
15:03
呃,外部表导入对吧,还有什么MYSDFS,卡普卡等外表,那个house支持外表嘛,对吧,好。哎,说到外表。咱们前面介绍介绍到了物化MYSQL引擎是在一个什么使用场景。那种是这所谓的外表吗?不是啊,那个20.8加入的那个。类似canon监控BDOG的那个雾化my circle引擎。那个是用来同步数据的,还记得吧,咱们说了不能往click house对应的物化表里面去插数据,对吧?那第二种呢,有一种单独的引擎就叫做就叫做MYSQL。它是什么呢?什么作用?这种就是所谓的外表。相当于说我在可里可house里面建表。但是这个表我指向的是一个外部系统,比如说my circle,那么我是可以对click house建的这张表进行操作的,那它同时会改变你所对应的外部系统的数据,比如说呃,MYSQL1张表叫表A,那click house我建立一张表叫A撇。
16:16
那我是外表,也就是说跟外部系统联起来的方式啊,那这个时候操作往A。插入一一条数据,那么MYSQL里面的A表也会多一条数据,说白了他这种就是做了一个映射,对吧,打拉通了一个什么管道。拉通了一个管道。这种使用啊,要区分咱之前咱们讲的那个物化买折扣啊,不是一回事,使用场景不一样,那行,那包括什么too many pass对吧,还有什么什么这里的问题都还是比较经典的,这些我看了,如果你。碰上些问题。大部分应该都能找到啊,这个还是比较好的,我觉得还不错啊,这里整理的还不错。
我来说两句