00:03
嗯,欢迎大家啊,来到我们今天的这个线上直播啊,这是我们,呃,就是我本次讲课的第二堂课,然后我们还是按照老规矩,就是八点之后我们准时开始,然后呢,现在呢,请刚进直播间的小伙伴们就是嗯,别忘了签到。在你那个点击进入之后,有一个蓝底儿那个白字儿的这个签到,我们先签到,然后我们先呃等几分钟,然后到八点的时候,我们准时开始,我们也可以提前预报一下,就是我们。嗯,现在的话。就是今天晚上我们的主要的这个这个和大家交流的就是我们,呃,昨天部署的这个t base啊,也叫t circle for possible circle啊,这个分布式数据库应用开发者。然后我们先先稍微等一小会儿啊。
01:06
然后提前也跟大家说一下,就是刚呃,就是进入直播间的小伙伴,就是我们这一块腾讯云这一块啊,有一个呃数据库就是T搜狗这一块,有一个这个中文大赛啊,昨天我们可能听过直播的小伙伴也了解了,对吧?呃,如果你是对数据库感兴趣啊,对对我们T搜呃有一定的研究,不管你是TQ这个MY搜Q版还是T搜Q呃PG版啊呃也不管你是对哪一块啊,你说对对于我们说安装部署啊呃,它的一些流程你可能有一些建议啊,包括呃。处理某一次故障啊,啊,有一有一点心得呀,包括我们讲的这些开发呀,包括运维啊等等这一系列某一点,甚至是我们说的,我们采用这种两阶段提交的这种分布式事务,我们做这种全局一致性读等等这些技术,这个小的这些点呀,呃,如果我们能把它整理下来啊,形成文章啊,也希望大家能够参加我们这次大赛。
02:08
这次大赛我们获胜的这个小伙伴也是有很精美的礼品的啊。然后我们就是刚进入直播间的小伙伴,就是别忘了这个签到啊。然后我们再等两分钟,八点我们准时开始。今天晚上我们主要交流的就是这个t base,它的一个应用开发指南,但是这个可能我们今天有很多内容可能也讲不完啊,我们把最基础的啊,包括几种表的创建呀,包括大概它的一个啊,你比如说插入一条数据啊,它是怎么进行这种路由的啊,它的一些分片啊,这些我们可能要跟大家呃详细的交流一下。现在是07:58啊,我们再稍微等两分钟,八点我们准时开始。
03:18
现在是59分啊,我们再等一分钟。刚进群的小伙伴注意一下啊,你这个别忘了这个签到啊,每次可能我都因为到最后的话,我们结结营考试的时候啊,有很多小伙伴到最后他就他就忘了啊。所以说我们每一次都会提醒大家,就是你进来之后,就是呃,先签到。对了,今天我们还是和以往的这个惯例一样啊,我们晚上都是有这个三次的抽奖机会啊。
04:05
今天看谁的运气会更佳一些。OK,现在八点,那我们准时开始啊,嗯,很高兴呢,呃,今天又和大家在这个线上我们交流这个我们腾讯这一块的数据库t base啊,现在也叫t circle,呃,PG版,呃,这个这这个数据库啊,今天我们交流的主要内容是应用开发这一块,包括一些我们说它的主要的一些建表啊等等这些我们需要注意的地方。然后这是我们这个T版它大概的一个介绍啊。这个我们说这款产品和这个TCQ买circleq版它有什么区别呢?实际上TCQ那个买circleq版啊。它本身我们是把它定义成这种,我们说TP类的啊,就是在线交易的这种。
05:02
就是这种我们说低延时啊,高并发呀,打海量数据啊这种场景,并且适应这种客户的这种MYSQ技术站,因为MYSQ现在不光是互联网公司在用,你像有很多的我了,我了解的就是说有一些大的像金融啊,证券呀,他们自己内部的数据库。当然了,很核心的可能还是用商用数据库啊或者什么的,但是也有一部分它是采用这个买色素技术站的啊,这是这一块。那我们这个TCPG版,它主打的是这种h type的这种我们说的呃这种形态,或者说呃这种场景,所谓h type就是说。它既满足这种TP类的啊这种要求,同时也满足AP类的啊,部分的使用场景,所谓AP类的我们知道就是说比如说一些比较复杂的circle,像这个报表啊,大数据分析啊等等这一类可能就是多表关联查询这这一类的复杂circleq这种场景比较多的啊,我们这个PG版的。
06:05
对他来讲适应能力更强,这是为什么呢?就是PG这款数据库,它本身和MYSQL数据库相比较而言。他的这个对于复杂查询的这种能力啊,可能就要更强一些,因为我们知道MYSQL最早以前像关联查询它只有这个,我们说类似于这种叫什么有点循环嵌套这种的,就是说我有一个驱动表,有一个被驱动表啊,驱动表我拿出。一行数据,然后到这个被驱动表,然后呢,去去去去循环去去做做匹配对吧,那么8.0以后他才加入这种哈希端。但是像PG这一块,那复杂查询这一块,多表关联查询,它的能力就是很强的。那我们这款这款产品啊,它最早脱胎于什么呢?就是它也是根据这种开源社区的啊,过去有一种叫做PT叉C的,后来在这个基础之上又衍生了这种PG叉L的这种架构啊,这种分布式架构啊,我们也是在他的基础之上啊,不断的经过我们内部的这种迭代啊,版本的这种迭代啊,不断的改进。
07:14
来形成了我们这个比较完善的这么一套分布数据库的解决方案。然后我们看它采用的是这种无共享的啊集群架构,所谓无共享就是share nothing这种的,提供这种我们说容灾呀,备份呀,恢复监控啊等等这一系列的解决方案,当然这一系列的解决方案就是绝大部分的这种场景都是由我们这个oss管控啊,由他来辅助来完成的,明天晚上我们会和大家来交流这个oss管控这一块。然后呃,下面就说TSQ是这种,呃,极高扩展性啊,SQ兼容性啊,包括像这些,包括我们知道我们除了它本身就是PG技术站,它肯定要兼容它PG的所有的这些语法啊,这些技术特点,同时我们在它基础之上做了这种改进啊,我们有这种专门的or兼容兼容的版本。
08:09
和这个Oracle的匹配度啊,我们能达到95%以上,这个百分之九十九十五以上并不是说只是普通的色,就是增删改查。就是对部分的这个存储过程触发器啊,甚至是一些包的这种使用啊,我们也可以做到这种兼容匹配的。呃,主要当然了,也主打就是说目前我们这种国产化替代当中有一部分这种我们比较大的这些,呃,银行证券他们可能核心都是嗷数据库,那我们可能对他做这种,呃信创的也好,还是他使用痛点上面的这种数据库产品的这种替代or产品的替代。这是大概的我们对于这款产品的一个介绍,那接下来啊,我们就看一看。他的一个服务的一个体系的架构啊,我们必须把这个架构要非常熟,那如果你这个架构你都不熟悉,那你就谈不上说我再去深入的呃,去去学习,呃,这这这款产品了。
09:11
它的这个真正核心的架构由三部分组成。有这个C,有这个DN,还有这个GTM啊,这是整个的一个服务的一个体系结构。然后呢,这三大组件啊,从左边我们看叫GTM,然后右边叫这个CN,对吧,下边叫我们DNDN实际上我们它就是计算节点CN,你把它理解成不是DN是数据节点,CN是这个计算节点啊。然后中间还有一个叫什么数据集群,数据交互总线这个东西,我们一会儿要介绍,这是我们这个t base啊,它独有的啊,一般的这个我们说分布数据库系统啊,它是没有这个,呃,集群交互有限的啊。然后我们就这几个重要的组件,我们就逐一给大家介绍,首先我们说这个GTMGTM我们看它上面写的是事物管理器。
10:07
那事务管理器的话就是说,呃。它是用来肯定是事务管理器,那就是管理事务的对吧,那我们知道单机的这个,我们说的这个事物啊,都是由他的那个本实力自己来管理的啊,在内存里面由他的这些存储过程啊,不是不是存储过程这个那个呃,我们说那叫存储引擎啊,由他们来提供对吧。那么对于分布式数据库这个这个系统,那这时候。因为他都是各个节点都是沙沙尔纳斯这种价格,那我怎么来管理这个事物呢?那我必须由一个组件来协调啊。我们这里的组件就叫GTMGTM在工作的时候只有一个节点在工作,也就是我们这个GTM有一个master,就是它的组。呃,我们,但是我们部署的时候,你不能只部署一个主,我们还要部署那个GTM的背,甚至是我们在产线上面,你要去背的话,你不能像我做实验似的,我就一组一背,我甚至还要做这种多个背,并且我可能是你比如说两地三中心啊,呃,是像这种高可用的,像像多地多中心啊,同城那种,呃,双中心啊,我可能要根据实际情况,可能还要。
11:21
被就是部署,呃,多个这个GTM的背啊。也就是说当一个GTM的主出现故障的时候,那这个时候我有其他的背,我可以很快就顶上啊。呃,就做这种故障的这种切换啊,让集群可以对外提供服务啊,这是我们说的叫GTM,然后这块就是C,嗯节点啊也叫呃,Coordinator是吧,我们的CN节点呀,会比一般的这个分布数据库,它的计算节点呀,可能要重一些,或者说要复杂一些。它上边会有一些原数据啊,呃,可能有由信息啊,还它本身还能生成执行计划啊,就是在这个CN上面生成执行计划,然后再推给它下面的各个DN这个数据节点。
12:09
CN在部署的时候,我们看他也是要部署这个,我们说呃。多组。每一组也是这种主备关系啊,一般可能我一主一备啊,主库出现故障的时候,备固也可以进行接管,并且我们后边要讲它那个就是读写的那个,就是你比如说那个我们怎么做那个读写的分离这一块啊,呃,读写分离的这个我们说的这个,这个就是他的这个方案里面,我们这个,呃,这个t base的这套环境里面,它有那个只读平面啊,这些只读平面就是通过。被DN加上BCN他们共同来组成的。然后就是我们根据我们的这个业务需求啊,可以进行这种水平的扩展啊,但是就是说呃怎么呃怎么说呢,就是说呃,每个CN接入以后,你看到的这个原数据啊,就是我们的一些,你比如说像表结构啊,呃,像我们能访问到具体的数据呀,甚至包括路由信息呀,啊都是一致的,就我比如说我有三组这个CN啊,每一组因为都有一个CN组,他们用应用去连上去,你看到的。
13:22
你连到第一个那个CN001和CN002,他们看到的数据啊,路由信息啊,表结构通通都是一样,他们之间也是属于这种,因为它本身不存这个业务数据的,他们上面的这些所有看到的这些信息都是一样,他们都是对等的。当然了,我们这块的话是你可以就是说同时接三个C,就是我现在有三组,你应为可以同时接三个C,但是就是说你配置一个也没有问题,只不过你起不到这个高可用,因为一般来讲你比如我三个CN,呃三组CN都有CN主是吧,那我前端一般应用去连的时候啊,一般前面还会加一个负载均衡层,像LVS什么的,然后呢,如果某一个C音出现故障,或者是背机这个整个它都出现故障的情况下,那我其实我可以把这个载负载均衡这块,把这一组给它踢掉。
14:16
那对整个集集群使用来讲,那就没有什么影响。这是下面呢,就是DN,也就是数据节点。DN主要是用来存储数据的。就是我们数据会存在下面这些分片里面啊,一组分片啊,比如DN001这一组吧,它也是有主备的,并且这个主备。我们一定要做的。因为你这个主如果你挂掉的话,那你你你可能这如果你没有备的话,那你这时候就无法对外提供这种数据了,那整个集群肯定就不能对外提供服务。呃。然后呢,就是你比如说我,因为我有这个多组嘛,你比如说我现在是D,现在是dn not到四是吧,也就是说它有四组啊四组,那四组的话,实际上你比如说我有一个表,这个表里面有100万行数据。
15:10
那你现在我有四个分片,那最理想的情况就是这个表里面,在这四个分片里面,每个分片这个表都存有它25万的数据,让这个数据啊,尽量的分散打散到这个各个我们的这个DN节点上面去,那这个是我们,呃,就是最需要的。呃,但是其实是,呃,下边的DN对应用程序来讲也是这种透明的,也就是说我们这个应用啊,只会在上边DN里面这这块接入DN接入啊,他不会关注你底下有多少个,不是在CN这接入,他不会关注到你底下,我DN说有多少,那我不关注啊,那获取数据全靠这个CN啊。他们之间要建立连接的啊,他把执行计划呀,或者他把一些SQL啊,要下推到DNDN获取到数据之后再返回给CN,还有一种情况就是有可能就是我可能就是把这个DN上面的数据啊,我都拉取到我CN本地,在CN本地做汇聚,然后再返回给这个前端应用,那就是前端应用,我不需要了解你后端DN的这个大概的什么多少分辨,我不需要了解啊,我只要连上CN就OK了。
16:25
嗯,然后就是每组这个DN,呃,也需要有这个多个啊对吧,这个我们说了对吧,呃,不光你做这个,我们说这个子图平面,呃,包括你这个故障切换的话。你都要有多个这个我们说的这个这个这个背的那个地。当然了,咱们注意这个。这个主备的切换啊。实际上也是由来我们管控系统来完成的啊,就是通过A人呢,对这个呃DN节点进行探活啊,在一个阈值的这个范围之内,如果说诶监控到说呃,你没有给我返回,那我认为你故障了,那这时候我就会产生这些故障的切换啊这个流程和我们这个呃其测测入版呢,呃基本上来讲呢,呃大工讲义呃都是由我们这套管控来提供的这种我们说的这种呃。
17:19
呃,服务08:13,我们得注意点,一会儿我们要呃进行这个抽奖啊,我们看一下时间,然后。呃,这个集群交付总线,我们简单介绍一下,因为现在的话你是分布式的这个,呃,数据库系统,所以说我们有一台,比如这台物理机非常好啊,可能有几百G内存,有64就就64核,然后那个固态硬盘,那这个时候实际上我们不可能在它上面只创建一个DN节点,或者一个CN节点,他们可能这上面要创建多个DN节点。但DN节点之间,DN节点到CN之间,他们都会有这种我说的这种连接的,因为他要来回拉取数据的,并且DN之间也是有这种balance,就是说它这个数据在平就是平衡,呃,某个DN我在它上面去查询,它里面需要另一个DN里面的数据,它也是要把数据拉过来的,那这个时候如果你是走这种TCP,这种可能对性能啊就会有一定的影响,尤其是在这单机的这种环境,那这个时候我们做了这个集群交互总线啊。
18:24
实际上是利用这种共享内存的技术,然后他不用再走TB方式,极大的就是就是加强了它交互数据的这个能力啊,提升了性能,这是这一块。这个整体的服务体系架构啊,我们先介绍到这,然后接下来我们看存储组,存储组的话,昨天的话我们是不是创建完这个实例,搭好那个集群,然后创建好实力之后,我们想创建一张表,结果失败了。失败之后,我们创建了一个存储组,在创建表OK了,那这个存储组是做什么的呢?应该讲架构的时候跟我们讲过了,我们今天再来回顾一下。
19:05
就是说呃,实际上我们这个存储组的它的大概的这个这个这个我们说这个结构啊,就是我们看到的啊,呃,上边这个图里面有一个热的格鲁布,还有一个冷的格鲁布,这是做什么的,实际上啊,你看啊,图中大概是有应该是有六个分片对吧。就是说嗯,我们在建表的时候,呃,就是你把这个表。是是指定到。不是说指定到哪个分片里面,而是说指定到哪个这个存储组里面的啊。就是我们会对分片去做一个逻辑上的一个存储图,就这几个分片。就DN这几个DN分片是DN1到DN4实施这这个热的这个存储组的,DN5到DN6呢,是这个冷的这个存储组的啊呃,就是我们现在六个分片对吧,我们把它分成两个存储组啊,然后第一个是热存储组,第二个是冷的存储组。
20:06
这个存储组对前端的这个应用也是透明的,你比如说你执行一条select星from某个表,然后把这个词后语句。打到那个CN上面去,那应用这块是不管你有什么存储组的,不需要你指定存储组,不需要它会自动的给你路由,因为这些路由信息就在CN上面。那么为什么有存储组这个概念呢?因为我们系统里面你知道有一些表啊,是这种。高频交易。数据也比较重要,那么我们就放在这个热存储度里面。用的机器就像DN呐,这些节点搭建的机器都是用的这种大内存多CPU啊,那个pciee的这种这这这这种,呃,所谓的那个那个固态硬盘啊。还有一些历史上的一些数据啊,这些数据啊,平时查询。
21:01
很不频繁,并且呢。呃,数据。也比较多,那如果说我用这个,咱们说就是用好的这个刚才说的这些好机器去存储的话,那相对来讲呢,就浪费了,那这时候我就做一个冷的存储图,把这一部分数据存储在这里面去冷的存储用一些。比如说CPU磁盘都没有那么高,并且是用纳斯搭建的这种这呃,这种几十G的啊,这种存储把数据因为他平时的话查询就非常少了。像这种啊,呃,我们是有这个需求的啊,后面我们还要建表的时候,我们可能还要具体的来做这个我们说的这种介绍。看一下时间17了啊嗯。就是因为因为什么呢?因为为什么要做这个呢?因为我们以前对这个冷的这个数据啊,我们习惯上做归档就归档,把这边这部分数据切走了,切到历史归档库里面去,但是问题你还有一部分需求是有时候我可能还要这个热的这个数据,很冷的数据这一块我可能都需要,并且我还要做一些障碍这种操作。
22:13
就算我不做这种障碍这种操作,那么我应用如果说去查冷的这部分数据的话,那如果你把这部分数据放到其他的实例了,那就属于这种跨库操作,或或者说我就要修改这个我们的数据源就连到其他的实例了,那这样对应用的改造,对应用的侵入就比较大,那现在它还是在同一个实例里面,那应用这一块改动相对就比较少了,是有这个需求的,但是我们强调冷的这个入火。呃,用的相对来讲也根据你实际情况也不是特别多,因为如果你这个冷热之间要做这种障碍的话,实际上它还是是要把这个数据拉取到CN节点来进行这种我们说在C上面做这个数据的聚合的。对性能可能是有一点影响。
23:04
然后这是存储组它的一个结构啊,呃,我们数据到底是怎么存储到我们热热存储组或者冷存储组呢?呃,实际上啊,我们看每一行数据啊,每一行数据,你比如说我某一行它是存储到DN001的啊。某个表里的某一行数据,它是第一行数据存储到DN001的,第二行数据可能要存储到DN002啊。呃,然后你第三行呢,可能要存储到DN003啊呃,就看你有多少个DN了,那实际上就是说在C上面呀。他是有一个逻辑上的一个。一个分片的。呃,我一个热的存储组啊,就如果说里边有有比如说有两个这个逻辑节点,就比如DN001啊,比如说加上一个DN002,那么我们数据是如何自动路由的,就是你的这个这个比如DN001和DN002啊,我们实际上在CN里面,在CN里面,注意它本地是有一个表叫啥的表。
24:07
它里边呀,你每一条记录,就表里的这个记录啊。我们说的这个是业务数据的那个表里面的这个记录啊,某一条记录,他都会给他算,算出它的小分片是多少啊,然后这个小分片它才把它对应到具体的这个节点。然后这个我们一会儿再再再再详细的给大家讲,咱们先得把这个第一次抽奖的这个任务完成啊。先稍等一下。第一次抽奖还是这毛绒公仔啊大家,我们给大家一分多钟时间。大家来抓紧看今天谁的运气好啊。看一下。
25:23
然后现在是21分钟啊,我们再稍微等大家,呃,一小会儿啊这个。嗯,二十二十一。21,我们节省点时间吧,我们倒数十个数吧。十九八七。654321 OK,那我们第一次。
26:02
有那个我看那个有咱们有那个说为什么需要冷狗,这个到时候我们。我我我们统一的再给大家解答吧,就是我们。我们先得把内容,诶不是。先把内容给大家过一下吧。这后边还有就是说,呃,比如说我现在只有一个存储组,我没有冷存储组啊,它里边的这个小分片是多少啊,实际上啊。每一个存储组里面这小分片都是固定的。就是4096个。那么第一个分片的ID是零。然后呢,是123456,一直到4095,一共是4096个啊,并且只有4096个。然后每每一行记录啊,因为我们建表的时候,一会儿我们会看你有一个分部键。这个分布键里面的值,你可能是123456,也可能是一些像马叉的这种类型啊。
27:04
这样排下去,你可能比如说是单号,比如说是日期啊等等这种那。对,这个值我们会做这个一致性,哈希。做完一致性哈希之后,我们还要呃和4096啊,这个这个数啊,要取余数对吧,然后就能计算出这个值对应的这个小分片是多少啊,然后这个小分片自然可以。对应到这个节点,每行记录对应的这个我们叫12的ID,就是这个逻辑的小分辨叫12的ID,它的这个逻辑小分辨是永远不会变的,只要你这个值,我们说你这个表里面这这个,比如说ID等于一,ID等于二,这个值不变,那它对应的这个逻辑小分辨是永远也不会变的。那你这个存储组里面,你比如说我有两个DN呢,两个DN,每一个DN就会分到2048个这个。12个ID,比如第一个DN001,它可能里面有零到。
28:04
二。202047对吧,那剩下的就是2047~4095,然后呢,那你你插入的这一行表里面,这行记录就可以对应到这个我们说的DN这个数据节点了,对吧?它是通过这么一种对应关系,就是一个逻辑组里面。它里面有4096个12的ID。逻辑小分片,并且这个逻辑组里面可能有两个。DN节点。呃,比如DN001 DN002也可能有四个,那这你不管它有四个,那四个每一个上面就去分这1024个12的ID,那如果是两个节点呢,两个有一个DN001,有1D0002,那他们每个人就是二零。2048个对吧,然后。具体的这个你比如说012可能在它上面,那你在算那个你表里面插入这个值的时候呢,就和他去对应了。
29:05
就是对应后面的节点是可以变的是吧,这个变也是。就是你这个对应的这个节点以后,你这个这个沙沙ID这个逻辑小分辨,呃,可能现在未来你可能对应的这个这个DN是可以变的,为什么呢?你比如说现在他在这个,呃,这这个二零。零到2047在这DN001,那未来我要做扩容呢,我又又扩了一个DN呢,那我就可以搬迁了,把其中。呃,一半的这个十十二的ID我就可以呀,搬迁到你比如未来有一个DN003,搬到DN003里面去。那DN002呢,也可能有一个DN004,我把它里面,它本来有2048个这个12代ID,那我把其中的一半啊,1024个搬到那个DN004里面去。随着这个搬迁的这个12的ID这个电脑。
30:03
随着这个搬迁的这个,嗯。ID这个沙的ID,它对应的这个那个那个,我们说数据表里面的那些值啊。也跟着一块搬迁了,这就是我们后期做扩容啊,做数据搬迁的时候啊,就用到的,那如果说还有这个冷存储组能够入库的,那实际上来讲它。是单独的一个冷存入组,它本身也对应着4096个逻辑小分片叫12的ID,它里面也有可能是有其他的这个DN的,比如它上面有DN003 DN004,那么同样的,如果它有两个这个DN,那每一个DN呢也会对应这个,那就等于是这个4096除以二了,那每一个是对应的就是二零。2048个对吧。你比如说DN003对应的是零到。
31:02
2047,那这个时候我我冷数据这组这块进来那个历史数据,呃,经过这个表里面的这个这个这个分布件,然后做一致性哈希,做完一致性哈希之后,我们呃取余数,取完余数之后,我就找到对应它对应哪个12的ID了,那再通过这个12的ID在DN003呢,那我就知道我这个数据要到哪个数据节点了,它是这么一种对应关系。这是我们说的这个我们说的存储存储组的这种结果。我们再往下看。这是读写分离方案,这个我们简单介绍一下就行,因为我们知道我们,呃,实际上CN是协调节点啊,也可以相当于计算节点吧,前端流量要打到我的上来,后端是DN节点,DN节点是数据节点,它具体的存数据的,那么CN和DN呢?你可以都有主备。那么实际上我们默认是这个读写平面,也就是说默认你连到CN主上面来,你是。
32:04
不管你是读还是写操作,那么实际上它都会到这个各个分片里面,你比如说有DN呢,这都到对应的DN的这些主这个这个。这个节点去获取数据,不管是读和写。那如果说我这个DN节点是有这个主被的,我有多个倍点,我这个CN节点呢,也有这个倍啊。倍节点,那这个时候我就可以利用这个CN的倍。和这个DN的这个背,你可以把它理解成一个背固。把他们一组圈起来,做一个只读平面啊。做完这个只读平面之后,你应用连过来,你连到这个CN被上面去,那这时候你做这种注意啊,它是只读的,你连到CN倍,你不可能做写操作的。那他只读的这些操作,你去通过他下发,他就会到C对应的这个,它对应的这个倍的这个DN节点上面去获取数据,这样就做了一个所谓的一个读写分离。
33:11
就是创建平面的时候,是我们是可以指定的,你的哪些节点放到就是,呃,你比如说你你是用哪些节点啊,你比如你背地N可能有。有有有有有两个有三个,那你这个你创建的这个只读平面,你是用哪一个这个贝蒂呢。呃,你是可以自己选的,并且你可以创建多个。这个背这个只读平面,就是我们最多的像那个,据说QQ音乐里边它有20多个背的这个只读平面,就他的读的这个这个业务非常多,所以说他就。挂了很多的这个我们说的这个背啊,甚至它有一部分这个背呀。属于有点我们说那种吉联的这种背,因为他怕就是对主住这个,因为你几十个的话,那你对这个主主主主主D人这块压力比较大啊,它有一部分可能是吉连的,然后呢,通过这种,然后做这种呃。
34:10
只读平面啊,读读的这个业务量非常大。当然了,如果说我们资源不够情况下,我们也建议你至少要两个倍,为什么呢?就一般我们你比如说主是我们有一个读写平面,然后我们来创建一个只读平面,那只读平面必须有。所有的组里面选出一个被DN和一个那个被CN,由它们组成,少一个也不成啊。但是问题现在如果你是一主一备的这种环境,那你没有其他的了,没有其他的话,那你备份你去哪里备份,你得有备份节点,你备份节点,因为你这个备电做了这个只读平面了,那如果说你去去去上面去备份,那肯定对它的读的这个这个性能肯定有影响,并且你主库如果挂了的话。那这个这这个背的话,他也会去接管的,那如果他去接管了。
35:02
那那你这个读和你这复杂的这些读啊需求啊,都会达到那个。这个主对应的这这上面来,那这个时候它压力就大了,那这时候你一读两倍呢,你有一个读写平面,有一个只读平面,另一个那个备的这个D音节点,你可以做一个备用,并且也可以做备份,呃,他做备份节点,那如果说其他的那两个D音节点,一个主的一个倍的出现故障了,它都可以做这种故障的这种切换啊,所以说这一块我们需要注意一下。然后我们继续看。呃,然后我们呀,说一下就是说这个我们这个TPS这个环境啊,我们这个建表这一块,我们有四种表,今天要给大家介绍一下,当然这个。呃,先是这种普通的这种啥的表啊,如果前段时间学过我们那个TSO买SOHO版的就会知道买so版里它有那个。如果你是默认的那个键表语,它会有一个单表的概念,但是我们T这一块是没有的。
36:06
你不去写底下这个distributed by什么这些,它也会给你创建成这种上表啊,这个我们需要注意一下啊,我们一点一点看。呃,第一种就是我们说的这种普通的sharp表啊,我们可以认为它是类似于Oracle,就是就就是在这一个TS这个环境里面,它就是一张普通表,我们看到这里面有建表语句啊,呃,然后其实它和那个单机建表语句是一样的,你别看它底下有这个什么distribu啊,这些都可以都都可以,就是说呃不写的啊。然后你你比如说这个public这个这个是模式,这个我们也可以就是说不写啊,或者我们可以就是说,呃,你自自己指定自己啊,根这个根据公司的这个开发规范来。然后下面这两句啊,一个distributed by share,这是什么?这就是一个分部件F1,我们把F1指令为显示的指令为分部件。
37:07
那你这个表创建之后,我要到哪个这个存储组呢。我们知道,我们一般会创建一个默认的存储组。其实这个存储组也是。热存储组,呃,一般很多时候其实我们都不见这个冷的存储组,除非你有特殊的需求。然后这个F1的值是它的那个分片键的那个值啊,每一个分片键值就会算出一个小分片。呃,你比如说呃,我现在这个表里面,我指定了F1啊,当你这个你比如我插入数据,数据入库的时候,我就会按照F1这一这一。这个力它的这一行就是嗯,这这F1,这这它本身的这个值去做路由啊。你比如说这个F1啊,咱们现在说这个F1,它现在是是分不见对吧,如果说它的值是一的时候,可能会路由到DN1这个节点,那如果这个值是二的时候,我们刚才介绍了它可能会路由到这个DN2这个节点,对吧?呃,F1的这个值啊,呃,是它的这个分片键值,每一个分片键值都会算出一个小分片。
38:19
这个我们反复强调小分片就是4096个零到4095每个小分片。会就是呃。就会对应一个节点啊,但是这个小分面是可以迁移到就是目前这个,比如说4096个,4096个,它俩呃都是零到二。2048对吧,大家比如说在DN1,然后2047到后边呢,这4095啊,在第二个他们都会对应一个DN,这样这条数据就会插入到对应的我们说的DN这个节点。然后下边是To Group啊,To Group是我们说这个表要画到哪个,呃,存储组啊,首先你这两个DN就属于这个存储组啊,它才会到这个存储组下面去找对应的DN啊,那你如果是冷的这个存储组呢,这那那它可能对应DN003,那这时候你他通过这个SHK。
39:15
呃,不就是这个这个我们说这个分布键,它算出来之后,它就到你对应的那个存储组下面对应的这个DN节点上面去,那个对应的那个杀K啊,然后把值存入到对应的这个D节点啊。这个时候这个我们需要注意一下啊。然后我看一下啊,然后是呃,我们再看一下,我看进度。呃,实际上这两句是可以不写的啊,就像你语法是和单机是是是一样,使用没有问题,那如果说你这这两句不写,比如说distributed的BY上这个不写,它默认你只写上面的时候,它默认会拿这个主键来做这个分部件。
40:02
那如果没有主线。没有主见,有有有的产品可能说,哎,我是不是用唯一索引啊,那么我们这一块呢,他只会找第一列。如果有主见,他就用主见,如果没有主见,那他就用这个第一列啊,所以这一点我们要注意一下,那如果不写这个To Group不指定存储组怎么办呢?你不止那种存储组,实际上它默认也会,我们知道我们创建默认就有一个默认的存储组,它就会到这个存储组里。而且一般来讲,我们小的这个环境啊,小的这个集群环境啊,我们创建的这个,呃,基本上都是只有一个默默认的存储组,并且呢,就是热热存储组啊。呃,我们像一般可能都没有那么大,就是说一定要再做一套这个,呃,冷的这个存储啊,那个是需要有特殊需求,确实有这个需求,呃,然后对个别的表来做这个冷的这个啊,就把它的历史归档数据啊,可能要存储到冷的这个存储组里面去,一般的比方说我们可能都不需要。
41:10
然后这是我们说建表。然后这块我们再看一下啊,你比如说假如我现在还是刚才那种那种情况,我有两个啊,DN1和DN2这这两个分片啊,那我们数据是怎么分布的,这是我们今天反复强调的,你比如这个表里有两个字段,然后第一个是分部件F1对吧,是int类型的,第二个是那个呃,F2它是这种呃挖叉类型的对吧?然后呢,我现在有三行的这个数据啊,呃,然后F1是分别对应123啊。然后现在我是有两个分片,那么这三条数据啊,正常情况下第一条和这个第二条。就就是这个12K是等于一和等于,不是12K是那个分布键,12K是那个TSO版里面的术语,这里面叫分布键,分布线等于一和等于二这个数值等于一和二的时候,那有可能我是都得都都到D1这个。
42:09
呃,我们说的这个这个这个这个这个节点上,那如果说我这个,呃,分布线F1等于三的时候呢,那我有可能就到这个零二里面去啊。怎么算的,我们刚才反复说了对吧。就是根据分布键的值啊,做这种哈希,然后呢,呃,就是再对那个4096SHK啊。这个这个这个呃,我们说有,嗯一个存储组里面有4096个这个呃,SHK啊取数,然后我就可以让你这一行记录和这个Sha key产生。联系。然后那个12的K又对应着这个存储组里面的DN,它有两个DN的话,每个DN上面就分它一半,要有四个呢,那就是1/4。它都有号012的,那你这边对应上的那个SHK这一行,比如说对应的上的某一个SK在这个DN001,那这一行数据就插入到DN001,这个我们反复强调这个,这个我需要我们了解,因为这个为什么反复强调呢?因为它和那个my circleq那个不一样,MYSQL没有这个说中间还有说。
43:16
你那个刹车啊。呃,什么呢?他那个那个到了那个pro,它那个叫pro数据来了之后,你只要指定了那个我们说的那个。呃,他那边不叫分部件叫char key来了之后,我就做这这这种发行,为什么呢?因为。他的那个T4版版,它底下这个我们说它的数据节点,它是提前分好了的。这个有兴趣的话,我们可以去去去去了解一下,它比如说最大分辨数十六个,它实际上已经创建好了,那ipd那个物理文件已经16个了,实际上你在前面它那个pro那一块那个只要有S。然后他直接去取余数之后,呃,做一次性,它一取余数,它就能存入到对应的那个。
44:04
那个那个那个分片,而我们这儿是没有的。知道吗?我们未来是无限去去扩大,那最初我可能就指定了这个。两个点。那这个时候我就按照这种方式,把通过杀的key给它关联起来。未来我要扩扩到四个呢,那我就把那个12的ID,比如有一个DN003,我就把其中一半12的ID。给它迁移到这儿,所谓迁移十的ID,实际上是把12的ID这个逻辑小分片,它对应的值迁到DN003上来。这个我们需要了解一下。呃。还有八呃,08:40,我我问问。还不到抽奖时间啊,我老得想着这个抽奖时间啊。妹子。然后接下来我们呃,还要再给大家讲一下它内部的一些实现。就是说白了就是这个路由是怎么呃怎么就是呃,他这个你比如进入银行数据,不管是读还是写也好,这个路由大概算法我们再就是我们再给大家说一下。
45:11
嗯,路由定位首先啊,就是你比如说我INSERT1条语句,或者我select的一张表啊,我查查数据,Where常见是什么啊,在系统里它路由是怎么路由的啊。实际上你定义这个表的时候啊,我们要定义到呃,哪个存储组里面对吧,如果你不定义存储组,你不写那个图,Group也会默认就是有有有一个默认的那个存储,然后接着你操作这条记录啊。因为它里面肯定有有分片键啊,这是肯定的,我们刚才也介绍了,如果你没有分片键,你不写它也会拿主见来当分片键,没有主见,没有主见会用这个表的第一第一列来做这个啊分辨键啊,然后根据分片键的值啊,算出对应啊到哪个逻辑小分片啊,就是我们说的12的ID。
46:03
12的ID是4096个从零到。4095,然后根据你这个12代,12代ID啊,呃,4096的这个12代ID,它会对应到具体的节点,也就是你这个这个存储度里面有多少个节点,它会给你,嗯,对应到具体的这个低音节点啊。那。这些关系你你说了半天了,这些关系存储在哪里呢?其实存储在我们这个CN这块有一个表啊,就是这个表就P叉C下划线上的下划线map这么一张表里有对应的关系啊。能够查到这条逻辑小分辨它对应的哪个节点啊,注意啊,这里面实际上它只是。这个你的逻辑小分片。对应的那个节点。他可里面可没有你那个那个具体的那个某个表里面具体一行数据,他没有啊,没有这个定位。
47:02
那实际上未来我要做搬迁,做迁移的时候。那这里面这个这这里面这路由关系你就给他我增,我现在只有DN001我和DN002,那未来我要二或四我变我我再增加两个,我增加DN003和DN004,那这里面其实你把那个对应关系指定完了之后。这个就在这里面去修改这个这个路由信息,然后呢,再去做这个数据的搬迁。当然一般来讲是先搬迁,搬迁之后要把这个短暂的锁一下表,然后呢,修改这个路由信息。呃,然后就是找对应的这个节点啊,对应节点推到那个分片里面去执行啊,呃,如果算出来是推到就是我们在那个CN里面,如果说我们就是去执行一条circle,执行一条circle的话,嗯,通过这些。不管是insert还是select的,我先要找到对应的这个节点啊,通过这里面的这些信息,通过12的ID先算算出它的哪是属于哪个12的ID啊,V尔条件里面,比如查询V尔条件里面也可能有有这出现它那个,呃,咱们说的那个分部件呢,那这个通过这个查询里面的这个VR条件里面的这个分部件,我也可以算出这个。
48:18
12的ID,然后到这里没对啊对出它是在哪一个DN上面呢,那我就可以把它下推到指定的这个DN,如果没有他们这个物尔条件里面没有这个这个分布件的信息,那没有办法,我只能。属于这种群发,就你有多少个DN,我就把这个思下推到你这个DN上面去去。获取数据,获取完成之后返回给我,CN这一块,我做聚合,再返回给它,是这么一个,呃呃,这个大概的一个过程。嗯,08:44。然后。然后我们再看这个普通上的表,这个啊,这个这个我们看这也是一张表。
49:03
这张表它的对应关系是什么呢?这张表其实你看诶不是系统所谓的系统里面的这个这个这个配置表,对吧,或者说我们将这个系统的这个视图。这是我们一张用户的业务表啊。比如T对吧。是我们用户使用的表,但是这个表啊。嗯,就是一张物理表,它和我们原生的这个呃,一般的表不一样的地方就在于。它有两个隐藏的这个字段啊,物理字段。一个叫这个叉C_node_ID一个是十的ID,这SHA2的ID我们就知道了,就是我们说的逻辑小分辨有4096个,从零到4095对吧,是它的那个。呃,上的ID,然后呢。No的ID是什么?实际上它就是我们那个第一节点的那个那个那个ID。
50:04
他们。在这里面啊,给你存着,然后这是对应的这个值啊。然后这是他们的一个对应关系,你比如说这个表是F1,我们记得是它的那个分布件,分布件通过这种计算,计算之后这个值。对应的。这个我们说这个这个。呃。那个那个那个他的那个杀的ID是是他。然后这个值对应的12大ID。是啊,然后呢。这个沙的ID又会和我们节点啊产生联系,那我就知道了。就是我这个这个数据呃。是存在哪一个节点,你比如说我这个,我我如果说。我去select星from t这个表没有前面这些,那这一条语句打到这个CN上面了,那CN如何知道T表里面的数据都在哪呢?
51:09
那如果说。你你select新from t,那我就把这条语句我就下推到所有的那个DN的主节点,我去查询就完了嘛,对吧,那总总之要录取到数据,那问题是他后边有位置条件呢。并且位置条件里面有这个,呃,我们说分布件呢。那这个时候就可以拿这个分部件啊。你比如说这位置条件里面就是F1就等于一,那它对应的这个12的ID就可以在这个表里本身就可以获取到。这是我们说的这个这个这个呃,这个表,我们的真正的这个业务使用的这个表里面,它也有两两列这个隐含的我们说的这个这个字段,这个我们了解一下。然后那我们平时你要写语句,我怎么知道这个。
52:01
你路由这么复杂,那我怎么知道这个记录到底是是跑到哪一个DN,是是是跑到哪去,我我怎么计算呢?那实际上我们是对这个。呃,Explain这只这我们知道这是做那个优化的时候,我们做那个执行计划的时候,我们要要用这个,但实际上我们这个呀。就是通过这个命令,我们给他做了一些修改,就是我们也可以看到啊,就是呃。你不管是explain select explain update explain delete啊呃,实际上他们不会实际执行对吧,但是它会显示出啊,就我们这这个这个嗯,PPSPS口才行啊一般的呃,可能有的是显示不出来的。我们对它做了一些适配,会显示这些路由关系啊,包括执行计划这些呃,都会显示出来,你比如在这里面,我们会看到这里面。
53:03
那我去这个路由,我到哪了呢?因为我们刚才说了F1等于一,它是一个分部件,那这个时候我就不需要。到下推这条,搜到所有的这个这个这个DN节点了,那我到哪了呢?我只要到DN001。那这个性性能肯定是最好的,那如果是我这个条件换成F2呢,等于一呢。那这个时候我们知道F2你不是那个分布键,所以说这时候没有办法,那你要现在有两个DN001和DN002,它肯定是要到。两个DN上去取数据的,所以说这里面它会把DN002也给你显示出来,然后其他的就是我们说的这个平机化,包括这是我们说的用到的这个,呃,采用的索引扫描的这种方式是吧,这种性能也是不错的,这是我们说的。呃,普通的这个这个这个我们说杀的表啊,它的这个这个怎么看路路由信息啊,是可以在这里面看的,然后我们看一下啊,大概49,呃,我们可能要进行这种,这是一条音色的啊,一条音色的这样吧,我们还是先先来进行第二轮的抽奖吧。
54:14
先来进行第二轮的这个抽奖。啊,第二轮是这个杂志啊,然后是。三份啊,大家看看今天的运气。然后我们也是等一分钟。我们稍微等一分钟啊,看看大家的运气,应该这个很快是吧。
55:12
我看有小伙伴说没中,全程陪跑是吧?没事,我们还有还有一轮,还有一轮到明明天还有三轮啊。我看看明天最后一轮是不是跟上次似的,可能会多一些,现在还不知道,我这里还不知道。OK,那我们今天的内容还还比较多,我们抽奖就就到这里啊,我们还得继续。看着点时间啊,时间我们得看,然后这这一块我们你比如说我们in色的,呃,这这这一块是吧,In色的一条啊,色的一条记录啊,这个记录的,你比如说现在他的那个那个值是。
56:02
它的值是5542对吧,那5542算出它的那个12的ID是多少呢?是2234对吧?小分辨是2234,也就是说这个表里它的分辨键值。等于。低的和等于5542的,它的那个那个分辨键值。这都是2234都是一样的,就是这两个值,它对应的这个小分片都是一样的,对吧,那它们它就会放入同一个节点里面去。那么我也就是以后我们做这个搬迁呀,就是或者做扩容的时候,那么他就按照这个逻辑,小分片来搬的,也就是这个分片键这个值是一的和这个5542的。那么他搬迁肯定是同时从一个节点搬到另一个节点。他没有办法只搬这个,说我这个值分就是类似于主键的值是一的和这个,我把它搬过去,那主键是这个,这个值也是分不见啊,他的这个值是5542的,说我不翻行吗?不行,只能按照逻辑小分片,2234。
57:07
按照他的这个维度,你去搬迁。而而不能现在不能以这个我说某个表的记录,或者按条件这个这个不行。呃,就是我们做扩容的时候,你比如我增加了一个DN啊,我要把一部分数据搬过去,呃,他只能按照这个,呃十代10ID来搬啊,只能把12ID是这个2034,呃不是222234的啊,这一它对应的这些记录啊都搬过去,这个我们需要注意一下,就目前你还不能说我我我我我我我把那个。呃,部分的这个这个这个按照这个。里面的数据按照位置条件,我这样搬行吗?啊这样还不行。然后我们看这个普通上的表啊,最后我们再总结一下,就是呃,这个这个一个是分布线的选择,这个我们就呃应该都了解,分布式数据库的话,第一分部件一定要有业务逻辑,这一点是必须的,对吧。
58:06
你没有业务逻辑,也就是未来你在位置条件查询的,或者什么改增产改的这些位置条件里面,你不经常出现出现,那这个性能就就就很差了,因为你是要根据你这个Sha k做so的这种下推的,你没有这个我们说的这个我老说10K,其实在这里面叫分部件,呃,那个SK是这个体型。就你没有这个,你不是他,你不加这个我们说的。分布件,那他就不知道了,他推到所有的这个DN节点上面去来返回数据,所以说这样的话,这性能你肯定不如我直接。指定到某一个这个这个这个这个DN上面去去执行那效率。呃,肯定要好。然后是呃是障碍,第二个是照碍是吧,使用分布件障碍,嗯,否则是产生数据这种重分布啊就是这样,就是说你不同的呃,这个表的这个分面键,比如就不同的表,我们之前做这种照稳操作,就是我做这种联合查询对吧。
59:10
那如果说你这个位置条件里面这个两个表的这个关联,比如说某一列关联,那必须是这个分部件相等的这种情况。分布件相等就表明。这个两个表对应的,它们对应的这个数据一定在同一个点,因为他们都是这个你这行数据都是根据这个分布件做这种一致性哈希呃,然后算出来对应的某一个呃逻辑小分片,然后对应的具体的这个DN节点的,那么只要你V尔条件里面是这个分布件相等的这种情况,那你一定会是我们说的。它的那个它们俩对应的这个值在同一个DN,那这个时候我这个次数我就可以做下推。
60:01
那如果没有这个条件怎么办?没有这个条件,你有些时候你就不能下去,或者你可以下去,但是你这个节点没有对应的数据。就比如我下推到DN001这个上面,那这时候他。完全由DN001。他还做不了这个操作。它里面却有一部分数据,他没有,那这个时候啊。像我们那个买搜狗版的,就是我把数据要拉取到那个proxy这一块,拉取到他那个那个计算节点这啊,然后来做我们这个TPS这一块是什么呢?我可以在DN之间做这种数据的重分布,就是我DN001可能需要DN002上面的一部分数据,那这时候我就从DN002上面把数据拉取到DN001上面,在他这份。来做数据的啊,我把数据我需要的数据拉取过来,然后我再做这种这样的操作。但是根据你数据数据量的多少,这个有可能就是相对来讲呢,呃,性能可能也会产生一定的影响啊,最好的结果就是说这个思路就下推到具体的DN节点,在这个DN节点去做操作,这样呃。
61:11
一个是能能做售后下推,还有一个是什么,就是说。尽量只下推到需要的这个DN节点,而不是说你我有四个DN节点,我就下推到四个,那你弄八个,我就推到八个,那我要有64个临节点,就主节点,那你还要推到64个,那对整个集群不管是网络啊等等一些肯定啊,嗯。都性能这一块肯定不如是我污染条件里面有这种分布件的这种情况。然后第三个是这个分部件的这个约束啊,呃,这个就是呃,就是分部件啊,也不能修改数据类型也不能修改这个我们注意一下,这是我们这边的一些规定啊,呃,因为那你我我这个表里面这行数据这个分部件我必须要修改,你怎么办啊。你不能通过after什么什么什么命令直接去修改,你只能是先把这行数据删除,然后在in色的一条新的只能通过这种方式,不能直接去修改。
62:11
这个我们注意一下,这是它的一个一个一个规范。第四个就是我们这个,你比如说我们比如查询啊,修改记录啊,大多数情况下,呃,一定要要有办法使这个分布键值来做这种查询条件,这就是我们刚才在上面说的,不管增删改查还是做多表,照样与操作你为尔条件必须。你尽量要有这个分布线,那这样的话他就能定位到在哪个DN上面,我就可以把思索直接推到指定的DN。那这样呢,效率当然就高了,对吧,所以说。又回归到第一条了,那么这个分部件的这个选择,就是这个分部件的选择一定是要有业务逻辑,要大量出现在。Where,条件后面啊?
63:00
就是这个胃,嗯,为尔糖浆里面啊,嗯,不管是多少关联查询,它也是那个关联的那个列啊,我update的一条语句啊,我这个呃,DELETE1条语句也尽量为尔条件里面有是以以这个分布线作为条件的,那这个性能是最好的。这样的话,你这个TPSQS肯定都上去。这是我们说的,呃,普通的这个上表啊,然后呢,我们再简单给大家介绍,因为我们有四种表,其中还有这个自研的这个分区表,因为我们知道你实际上来讲,PG它本身也有这个分区,分区表,我们也有这种自研的分区表,我们相相对来讲啊,我们是一个是根据我们这个分布式的这个架构做了一些呃呃适配,然后呢,对性能这一块,你比如说我们做DD维护啊,呃,包括呃查询啊等等这些性能这一块也是做了一定的优化。然后我们看现在这个建表语句,这实际上是创建了一个呃运制的一个分区表。
64:02
润制一个分区表,但是我们得注意一下,就是我们这个自研分区表啊,它这个时间是有一定要求的,就是。就我们这个资源分区表,那开始时间是从哪一天开始的呢?一定是从2019年1月1日开始。这是我们一个规定啊,就是我存入的数据必须大于这个日期。否则你存不进去。啊,注意啊,使用我们这个自然去表啊。然后你加入分区的时候,只能向后加,还不能向前加,你加2018年之前呢。加不进去。啊,这个我们注意一下,然后呢,这是我们range啊,以这个F2这一列time step的这种类型的是吧,然后开始时间,然后这个是我们说的这个这个呃,一个应该是按月啊来来来进行做这个子表了是吧?有几个子表呢?啊有这个有三个一是三是吧。然后下边是我们说的这个这个呃,Distributed by就是。
65:05
你把那个分区分区表运分区表,你把它相理解成二级分区。然后我们这一级分区还是按照他的主见杀呢,嗯。就是那个那个分布件是F1,它下面有有有有有两个DN啊,比如来插入一条数据,它是先根据这个F1。当然了,这还有这个存储组啊,这肯定这个两个DN01和DN2,它是属于这个这个存储组的啊,然后呢。在在这个存储组里面,它对应的这个值,然后先做哈希什么呢?选出它对应的这个DN。是在DN1还是DN2啊,你比如这个表可能有一行数据,其中可能有5000万行都到了DNDN1了,有5000另5000万行到了DN2了。已经把他们按照这个一,我们所谓的这个这个这个呃,就是。
66:01
我们就是那个那个那个分分部件的方式,给它先分了,分完之后表还很大。那个数据量还很多,那这个时候我们再给他做子表,有在做什么呢?做这个自然分区表里面啊,通过某一个字段,这个二二的字段是一个时间的字段啊,然后根据这个时间来做这个,比如说我可能按月。做多多少个子表是按这种方式。呃,这是我们说的这个自研分区表啊。然后实际上呃,我们再来看资源分区表,这个这这这一块我们再来看一下。看一下时间啊,九点九点。呃,我们看就是这个,实际上我们了解一下,这就是一个我们说的数据的一个一个分布的一个情况啊。呃,如果有这样一个分区表啊,你比如说这里面是是这个F1F2,就刚才那个表,然后那个,呃,它有它的子表比较多是吧。
67:05
嗯。如果就正常情况下,我们分区这个,这个进来之后,首先会知道这一条数据是路由的哪一个分辨,这就是我们说的是通过它沿家本身这个分布件来决定。比如这条数据它分布件是F1,那么它的那个跟普通表一样,首先你比如这个它的那个分部件的那个值是一二的,它会路由到DD啊,你看这三个值它是有重复的啊呃,都录路由到,就是都会存入到那个D。那如果这个分布件是这个三的呢,都都会到,呃,DNDN2吧。然后呢,他们根据这些数据插入进来的这个字段值啊,所谓这个字段值就是F2我们定义的这个率值那个它那个那个那个二级分区,或者叫自自建分区表,它它的它的那个那个字段,然后呢,呃,然后来定义这个字表。
68:00
你比如日期是1月31日的,那这时候他就到第一个字表,那如果是呃,1月1日的啊,和这个1月31日的,他都到第一个子表,也就是说那个那个分区资源分区那个第一个子表。那如果是二月的呢,他会就就会到那个2月1号的呢。他就会到那个那个资源分区表,那个第二个字表啊,是这样,这个这个很好理解,这个我们一看就就就可以理解了啊。这就是我们说的那个,这就是说资源分区表,它数据的分布情况啊,实际上就是我们刚才解释的,先用这个这个我们说F1,它是它本身是那个,呃,分布键嘛,分布键是先找到对应的地银啊,通过我们刚才讲了很多都重复很多遍的啊那种方式。然后找到对应的DN,然后这些数据进来之后,再在它再根据F2这一列啊。然后呢,呃,根据我们这个规则啊,呃,再创建不同的这个物理子表啊,把数据再再按照这个维度来进行,我说的这个这个呃。
69:06
存吧。然后这是自然分区表啊,我们也来了解一下,就是说呃,它有什么优势啊呃,表的大小得到有效控制什么是吧,优势就是你的单个物理表的大小就得到控制了,你刚才我们说的那个。1亿条,一亿一亿这个表每个那个呃,DNA里面两个DN,那每个里面可能存5000万还很大,那这时候我还可以进行拆分,然后更新,性能会更好,对吧?维护的时候呃,某些操作会更快捷更简单,你比如说我们加索引啊,呃,包括我们团K呀,它可以并行的,因为它都是子表,可以并行的去执行。但实际上。这个东西也不也不建议我们去大量使用的,就是它维护是有成本的。是吧,如果你你不指定分居条件,你为他里面你没有这个这个这个条件的话。
70:02
那他都会到所有子表上去扫描的,他的扫描成本其实也挺大的啊,子表越多,不管里面有没有记录啊,我都会去扫的。哪怕一行记录也没有是吧,我也去找。嗯,然后就是说他的DDL这种开销也会,其实有有有一部分这个开销也挺大,你比如加一个字段。所有子表都需要去增加啊,那么这个时候有一张子表,你如果要要有锁的情况下知道它,比如有100个子表,其中有一个有锁,所有的子表需要去增加,那么这时候一个子表有锁,那么其他子表就是加这个DL,呃,D点加这个字段这个操作。就都会回滚啊,都会失败。当然了,我们说到了锁超人的时间了。然后是对这个分区表的这种使用啊,就是说嗯。你使用的话,你必须先要命中。
71:01
就是你你必须条件里面已经带我们那个分部件和我们说的这个这个你这个刚才咱们说的F2啊,就这个这个。分区表他自己的,呃,这个这这个分区的这个字段才行,才有这个减脂的这个这个作用。就是你不管查询啊,更新啊删除啊,你要都命中了,那威尔弹那里面都有,那当然它那个效果是就是是是非常,呃,就是因为它限制在某一个DN节点,然后又限制在具体的这个子表里面,那这个时候它的这个速度那是非常非常快的啊。那如果说你没有命中呢,那这个时候实际上他也也也发挥不了什么效率,并且我们一再强调就是这种东西啊。维护它本身也是有成本的啊,这个我们需要注意一下。然后这是我们说的自研分区表,然后这个是冷热分区表,它也是分区表。
72:00
然后冷热分区表,这就回到我们刚有小伙伴问那个。有有说为什么需要冷冷group,其实冷group这这怎么把这个同一个表里面呢,这冷数据就放到那个冷的group里面去的呢,实际上就是通过这个冷热分区表啊。这为什么会有这种表呢?这种表是怎么怎么衍生出来的呢?这实际上啊,也是有一些业务需求的,对于一些业务数据啊,有时候有一段时间后,他那数据就变就就变得就成成为历史了,就很少再去查这一部分数据,这个表里面的这一部分数据啊,你比如说微信支付,你比如说你支付之后有商户那个微信支付之后,它会有那个记录吗。那他一般来讲,你可能比如支付完了之后,完成之后,我这一周之内,我可能还要查我的消费记录。那你要一个月之前的呢,或者一年之前的呢。那可能基本上他就就很少去查了,除非他。有时候诶,我一年之前,诶,我当时这笔钱是怎么花出去的,我查一查,有可能有这种需求,但这种需求是很小的。
73:06
但是还有不代表他没有。那如果说我们通常来讲,对这种数据做的过去做的最多的就是归档。把历史数据归档,归档到历史归档库里面去,这个历史归档库有可能是另外的一个实例。那这个时候如果再去查这部分数据,我业务逻辑这一块我肯定要改的。那你不可能我这相同的语句,我过来之后,让他自己路由去找,我到到到冷端去找数据,那是不行的。那所以说为解决这种需求啊,就有了这种,这是其一,其二呢,还有一种是解决什么呢。那你这个热这个格这一块,这都用的好机器啊,那都是我们说可能。嗯,大内存大CPU,然后PCIE的那个固态硬盘的。那这里面你要把那些没就是查询量很少的冷数据放在这里面,那是一种浪费的。
74:05
那如果说在这一块,我我做做。创建这个这这这个冷的这个这个我们说的这个group的时候,它里面对应的DN我可以用,相对来讲CPU啊内存啊相对较小,并且呢,我们可能说就是。呃,一个是再有一个就是它数据量比较大嘛,我们就用那个磁盘,我们用比较大的纳这种的啊,呃,磁盘这样的话,我也可以节省成本,是有这个需求,所以才做了这个我们说的冷热分区表啊,我们有这个冷的group group有热的格啊。然后呢,你看这个见表的语句啊,建表的语句的话,这一块我们也可以看一下,你比如说它有一个,其实它也是那个part,提ition就range啊,呃,用这个这个这个F2这一列,实际上它的下边那个建表啊,和刚才我们说那个自研分区表是有一定区别的,但你看它那个distributed by这个事呢,它必须这么写啊,还是第一列。
75:08
F1是整个表的分布件。第二个的F2你在这定义了,那不行,你也给我拿到这里面来啊。这是我们说的那个分区键。然后这group你得把两个group group都写上了,一个是我们默认的这个热group group,还有一个是你你开始你得创建啊,你这这这个group你得提前创建,你得有有这个资源,有相对应的这个DN啊DN节点,然后呢,呃,创建group啊,创建一个冷的,一个热的啊,当然这个名字是你自己指定的。然后呢?在这里面写上一个,前面这个是热的格group啊,默认的,然后后边这个是冷的格group,然后把这个都写上,格式必须按照这个写,然后前面part by均是这个F2,然后呢,开始的时间是什么?然后呢,这个这个我们说的这个按照一年12个月是吧,然后先创建四个这个。
76:07
呃,我们说的这个这个呃字表啊,或者叫partition啊,然后这是大概的啊,这么一个我们说的一个一个一个创建的一个表的一个语语法吧。呃,这是我们说冷热的这个,呃分区表啊,呃,这里面这两个,你比如说我这现在这两个这个格入库,呃有四个分片啊,有两个存储组,第一个是热一冷的,呃,就是说我们刚才说的这个,呃数据这一块。如果来了之后,你比如说2019年的来了啊呃,它会自动的去路由的,根据你这个时间自动路由的这个。热的格鲁里啊,其他的我们不不讲这么细了,你比如说也是你这个表里面肯定得有这个,呃,我们说的这个分区键呀,前面的找到对应的这个,呃,注意这里面你注意它第一个就先比较你这个我们说的这个时间的。
77:07
他要先定你这个数据,根据你这个我们说的这个这个。你定义的这这这个值啊。和以前有点不一样的,根据这个值来定义这个它是冷的数据还是热的数据呢?如果是热的数据,那好,我接着就按照。是木剑。哎,然后按照分部键,然后。到这个找到对应的这个这个这这个D找到上面去,然后再根据上面的条件。啊,然后我们说再再再做这个啊。呃,就是。就是就是存储到对应的它那个位置啊。如果说。这个时间它一对对比是应该存到那个冷的那个格入。他就就把那个数据啊,发到棱对应的这个DN节点啊,然后再让他上面那个分区的啊,这些生成这这这些资料。
78:08
呃,然后其他的这些都是一样的,你先。找到这个时间啊。呃,但是这里面啊,我们现在需要给大家说的一下的,就是说我们这个时间是怎么怎么定的,你比如说这条数据过来之后,到了我这个这个这个实例上面来,他要和一个时间做比对,是吧,这个时间是是在哪里定义的呢?这个是实例创建完成之后,就这个实例就有一个时间,然后你创建表之后,不是有这个分区的那个什么时间的字段吗?你你只要这个字段就是你传进来,你比如这这个字段F2这个字段传进来的这个值。大于等于这个时间它就往热存储组里面放啊。就是创建实例的时候,就有这个时间了。你建表该怎么建还怎么建,建表是建立这个分区表啊,你建了这个这个表,每次路由表里的时间就是这个时间,它对应的这个时间要和这个实力的这个时间做对比。
79:10
要大于这个这个时间你大于现在。这个表的时间,它就把它扔到这个热的格里面,那如果小于呢。比他这个以前2018年的呢,就到冷的group,然后再做这个刚才我们说的这些。目前是无法定义到表啊,都是实力级别的。呃,所有表都是按照那个,呃,那那那个那个那个表都有,就不是所有的这个时间都是按照这个实例,这个实例上面就定一个时间,就为什么这么做呢。那按按照表来定义行不行呢?实际上来讲就是从性质上考虑,如果你要是呃按照表来做,那你这个这个说白了就是太复杂了,开销太大了,所以就你你你就很难统一了啊呃。
80:01
就就是呃,就是说开销太大,所以说就最后我们就就就就是统一了,就是表的所有路由都是一致,都按照这个就一进来这这个表你创建完成之后,插入一条数据到这来,先做这个对比,它是冷的还是热的啊做完之后就到各自的再再去执行后面那些步骤。呃,这个这个是冷热分区表,它大概的一个情况,这跟我们刚才那个自研那个分区表是一样的啊,这个我们也可以看看一看,就是你比如说现在的话,它是呃有这个def before的group,它是这个热的,这个是吧,热的的话热热热的组,然后这是扣的,这个是冷的组,哎哟,我看09:16。然后呢,实际上他来了之后,他这不有一个时间嘛,他先跟你这个时间先做对比,你是2019年。呃,之后呢,那我就把它放到那个热毒里面去啊。
81:05
然然后呢。2019年之前呢,那我就自动先把它就先放到那个冷的那个组里面去,然后。他知道他到冷,他知道他到热的这组里面了,然后再根据这个。F1这一列。然后再去算对应的它那个逻辑小分片呀,在哪个DN呢,后边的都一样,这个我们需要就是大家注意一下就行。我们看来得要加快一下速度,一会儿我们又要抽奖。啊,然后冷热分区表啊,这个我们也看一下啊,它的比如说呃,适合哪种情况等等这些。呃,冷热分区表实际上啊,你也根据你公司的这个业务啊,你比如说确实这个表非常大,你不愿意做归档,像这种情况。因为我们刚才也说了对吧,它适用的就是历史数据量比较大,呃,查询频率又很低,也就是冷热数据分界线非常明显啊,我们可以把它设计成这种啊,就是冷热分区表啊,这种就是你比如说用了这种冷热分区表,这种类型的表啊,有一个最大的好处。
82:17
就是我们应用程序啊,只用连到我们CN,这刚才我们也解释了,就是你可以实现对冷热数据,就是冷数据和热数据的这个分别访问,就是只要我们连我们这个资金节点。你你你实际上你这个对搜狗的,你不需要做做多大的这种改写啊。你不是不是说我我做历史归档库,我这个这块我数据源可能我都要有有发生变化,呃最大的好处就是这个,你包括那个应用这一块升级啊什么的,可能就相对友好一些。嗯,然后。呃,这是我们说的对吧,呃,访问的非常友好,然后冷热分区表的这个数据。
83:00
分开不同的group存储,跨group查询时性能低。所谓跨group查询性能低就是。你有可能是我这个思啊,我前端应用过来呀,我我查询。绝大部分操作都是在热的这个。那个group里面去操作的。这个冷的里面呀,我操作呀,你比如说这个人他以前支付有一个这个这个支付的这个这个信这样这样的一个信息。诶,他想查去年的啊,去年的他可能就到那个冷的里面去查,这样的话性能呃倒并不影影响,但问题是有可能。过年的时候,可能他们不是有推出那个嘛,就是我这个这一年我大概的一个这样的一个一个个统计,这时候我可能需要这个冷的热的里面的数据,我可能都需要一些,然后做一些照应的操作,关联查询,那这个时候。它的性能不好。他必须把里面的数据。
84:02
拉取出来,拉取到哪拉取到私人级的。他也不能做这种D音D音节点这个层面的这种,我们说的这种,呃,就是我们的这这这种数据的这种再平衡,都得把数据拉到我CN这里这这块来,然后在CN这一块做聚合,把取出结果集,也就是取出那个最终的结果集,再返回给前端的那个C。这个也是需要我们,呃,注意一下,然后20了,20了,咱们咱们先先稍等啊,稍等我们先把这个奖出了。啊,这是我们第三轮抽奖也是三份啊,这是那个4S店定制的这个T恤啊,希望大家这个最后一次,看大家谁的运气好。
85:15
呃,今天的这个这个课,呃,大家抽奖的时候跟大家说一下,今天我们讲的这些内容相对是比较简单,就是很多的这个比如查询啊等等,还有一些它的一些相对复杂一些的,可能时间的关系,我们不可能一个半小时把这个这个所谓的一个一个一个产品,它的所有的这些开发规范都给大家介绍啊,呃,所以说大家呃,可以到官网上啊找到那个,呃开开发指南这一块,我们就是可以平时如果有这个学习需求啊,可以继续深入的学习,我们只是把最基础的这些要给大家介绍清楚。嗯,你这这个这个时间的话,也确实是不可能说,我们就是说把所有的东西都都都讲讲完的。
86:04
啊,OK,那我们还得加快速度啊。然后最后一个就是复制表啊,这个我们就简单说了,对吧,你复制表的话,有些地方叫广播表啊,还有一些地方叫全局表是吧,其实它很好理解。就是每个分片上都有这个表的一个全量的数据,对吧,那我们这里面了解一下我们TPS这个环境里面,它的一些建表的一些语法。我们写上distributed by replication。那它就是一个复制表格,但是这里面我们要注意一点。注意什么呢?你下边这two group啊,Default就是你默认的这个,这你要写。如果你不写。因为我们知道,我们建这个就是普通的上表的时候,如果你不写不写OK的,我就把这个表它有一个默认的就是这个热热存储组,但是如果说你这个复制表,你这里面你不不指定这个不group指定这个存储组。
87:14
假设说你还有别的存储组,还有那个冷的存储组,那他也会到这些存储组里面都会创建一份。这么一个一个,呃,就是。全量的数据啊,所以说我们尽量因为这个复制表,一般来讲啊,我们基本上还是在热热存储度里面,所以说我们要在这里面把它都指定上。其他的就是呃,建表语句就和正常建表一样,我们只要注意它有它特定的对吧,你去BY,然后后面把这个也记上,加上就行。这是我们说复制表这个,因为我们很多人对他就比较熟悉。然后这一块的话,就是说一个是它的优势,一个是它的劣势是吧,优势肯定就是。
88:01
有用,它不管是任何产品,包括我们T次买搜狗那个那款产品也有,它叫广播表用它就是做关联查询的时候,不需要跨赛的啊,或者我们叫跨DN这种啊,因为他每一个DN上面都有这么一份全量的数据,那我其他的表和他做这种关联查询的时候,我们不需要。呃,跨这种DN,我也不需要做这种数据,DN之间的数据的这个这个这个呃,就是我们说的这这种数据的这种均衡啊。就是就是我们说的拉取数据。但是他的问题就是说。第一这个表你不能是大数据,你大数据量的话,你各个分配上你,你这个数据就很多,再有一个不能对这个表进行大比较多的这种增产改查。因为你要知。因为你比如你现在两个DNA也还好,那你要是64个DNA。那你32个DN呢,你DN多了,你DN多了,你对这个表增删改操作是他每一个DN上面都有一份,你就保证所有这个操作都要成功,要么就都失败,那就是我们有一个分布式数。
89:09
其中64个DN,其中有63个都成功了,那最后一个失败了,那对不起,所有的都得回滚啊,这个成本很大,还有一个就是呃,复制表更新性能也是。比较低啊,高频更新容易产生思索,这些是它的一些问题,所以说一般来讲我们呀,会把一些配置信息的表都经常发生变更的啊,然后呢。呃,这个数据量相对较小的这些表啊,啊,并且经常会和其他大表做关联查询的,我们可能把它定义成复制表啊,这个我们注意一下就OK了。呃,然后呢,呃,今天主要的内容也差不多就就OK了啊,然后呃。就是我大概算了一下这个时间啊,这个时间后边有很多的,你比如说我们讲了那个我这一条复杂查询啊,呃,它底层它是怎么做的,这种我们说的这这种DN之间,相互之间可以拉数据啊等等,我们需要查询需要注意的一些等等这些事项啊呃,确实是这个这个这个时间的话,我们可能就是相对来讲,我们不,呃就是。
90:21
呃,相对来讲可能就是时间不够,但是呢,我们把这个最基础的这些给大家讲,嗯,这几种表啊,他们之间,尤其是这个这个数据是如何路由的等等这些只要。给大家讲清楚了,大家有了这个基础啊,然后呢,我们公有云上应该也有相对应的这个这个开发者来相相对应的部分,或者说我们,呃,平时有这个练习需求的话,我们搭建一个环境,然后去写一些SQ的时候,按照我们这个指导的这个啊抛砖引玉,然后呢,一点一点去摸索。呃,这样的话就就就就等于是给大家带大家入入个门啊,呃,不可能就是这个这个一个半小时就说把所有的这些开发的这些东西,包括他的一些很多的特性啊,呃,就是都讲都讲的面面俱到,呃所以说今天晚上的这个我们主要的和大家呃交流的这个啊。
91:17
就是我们讲的这个PPT的内容啊,我们就暂时到这里,然后剩下几分钟我们看小伙伴们呀,就是我这个手机关了,就有什么有什么。需要就是咱们可以交流的啊。因为今天一开始我也也没有看这个,就是CN有原数据是否有状态,原数据怎么初始化就到。呃,CN,其实有的时候是有一点点状态的,它和那个TSQ买SQL版还不完全一样,你比如说有一些这个。锁呀。呃,包括分布式事务这一块,因为分布式事务的话,我们这个,呃,TP这一块也是采用两阶段提交的。
92:07
你采用两阶段提交的话,我们这个CN节点,它也是一个我们说的这个这个协调节点不是对,就是分布式事务里面的这个这个协调者啊。呃,然后底下的具体的这个执行的DN呢,它是属于执行者是吧,那实际上如果说这个。分级这个协调者啊,这个分布事物的协调者,主如果出现故障的时候,那这个时候实际上我们这个背拉起的时候,如果你要没有这个。被这个这个这个CN这个节点的话,那这个时候如果说你这个CN失败了,那你这个事物。就就是卖了。那实际上如果你是有一个背。CN节点的话,那当它被提升主成主库之后,只要那个CN主和CN被之间采用的强同步,那这个信息,这个分布式事物,呃,相关的这些信息啊,是是还会保存的,就是说这个这个事物啊,是是没有问题。
93:03
它是有一点点的,这个我们说的。嗯。状态信息的啊,它不是说像那个MYL版的那个procy啊,完全是无状态的,它倒不是啊,还有一个就是我们注意一下,不管是我们的这个地点。比如这一组啊,还是我们C这一组,甚至是我们GTM这一组,他们其实从。根上说。都是PG的。数据库有这种补充关系的数据库啊。只不过里面它存储的内容不一样啊,你比如GTM里面,它会可能会存一些原数据信息的。嗯。每次创建都这么写吗?是创建哪个。若是进入了热分区区,热分区区随着时间的推移,会自动进入冷分区去吗?啊这个我们明天讲啊,这个这个这这个上面有那个oss,我们我们会讲这个操作。
94:07
生产环境可以用源码安装吗?生产环境用源码安装,这是什么意思?呃,实际上呃是这样啊,我们这个我们昨天演示的是不是我们有一套管控,有一套管控之后,我们就是安装的时候,就是都按它来安装,但实际上我们把那个管控。抛开。我们直接拿着那个我们具体的那个安装的那个那个那个软件包,就是我们类似于我们那个CN。还有GTM。我们通过有点类似于你们可以了解开源t base,通过命令行的方式,一个个去去给他启动,就去安装部署,然后去启动,然后创建,呃,相互之间要要建立那种关系也是可以的,但是只不过的话,这种这种东西的话,企业那一块肯定是不认的啊,企业那一块如果说采采用的是我们这个这个企业版的这个这个这个TCOP版的话。
95:05
肯定肯定人家有那个要有管控的,我咱们可能要参加工作的就会知道,就是现在的话,银行呃证券呀,他们在做这种国产化替代,呃,他们要做这个数据库这个这个这个这个替代,对吧,数据库这一块的话,他们也有很多要招标的,其中这标书上就已很明确的就写了一点,必须有管控。没有管控,人家根本就就不会采购的,知道吗?现在的话人他和过去不太一样,就是你你你没有管控,那我我我我不可能通过手动或者说跑跑线脚本的方式,再像过去写个什么安装的脚本,那是不可能的,并且。注意啊,我们分布式的这个数据库系统,基本上它组件也比较多,它不像这个原生的,像以前的原生MYSQ啊,呃,PG啊,甚至是我们说Oracle数据库啊,相对来讲。
96:02
他也没有现在这种,我们说它的组件多,所以说啊。我们安装来讲,一般来讲,呃,肯定是需要有管控性的。嗯,我看一下时间啊。呃,CN,它有一部分这个,呃数据它是自己算出来的啊。就是你比如说呃,还有一部分是来自那个GTM,他你比如说他有他他本身他存了有一些有有一部分那个那个表。他这些表啊。你比如说咱们刚才不是说了,它,它上面有那个,呃,存那个那个那个杀的杀的ID跟那个节点呀,呃。这些,呃,就是。就是杀的ID呀,包括那个那个那个节点对应关系的那些表都在他本地有啊。
97:05
它是可以出来的。然后还有一部分原数据是在那个它那个表里面啊呃,就它那个表里面,它隐有那个隐藏列上面也可以获取到啊。还有那个GTM,那个节点GTM的话,你你可以把它理解成啊,它上面除了有一些部分原数据信息啊,它最主要的就是提供相类似于我们说的这个,这个是外地啊,包括还有那个我们知道也有的叫逻辑时钟,也有的叫什么逻辑那个GTS啊,全局的一个一个时间戳啊,包括还有一部分,它里面会有一些你比如sequence啊,自增序列啊,像这些是不可能通过。
98:00
你像单机似的直接在那个DN节点,或者说人家本身PG啊MYSQL人家在这本本地人家就可以有的,那那你你你你这样的话,你是因为你现在是这个多个赛多个这个分片的情况下,呃,或者说多组DN这这这个这个拿到sequence啊,像像自增的这个这些都是在这个GM这块。嗯,我看一下09:34,那OK,那我们今天的这个这个呃。我们今天的这这这个交流就到这里啊好嘞。
我来说两句