00:03
山独自在夜里,山不,嗯,大家能听到声音吗?OK。大家能听到声音吗?如果在直播间能听到声音的话,在呃直播间扣个666啊,我们八点钟开始OK啊,没有签到的同学赶紧签到啊,OK。洒落我心底只有明天,无奈从此缠绵,奈镜子在夜里。
01:44
的见,只剩如和你。风不春,春不起,雨洒落,我心底只有明天,无奈以思心。
03:02
OK,我们马上开始啊,马上开始。
04:17
OK,好,各位同学啊,晚上好啊,欢迎参加腾讯云版的训练营。我是讲师郭军。那么今天晚上呢,给大家讲是t TC po版的产品架构解析。那么在讲这个之前呢,我先做一个简单的自我介绍啊,我叫郭玉军。啊。作为一个it的数据库啊,老兵啊,20年的这个老兵的话,那我为什么会去选择啊,TT数据库呢啊。而且我现在拿了TDQ基于马版瑞版的,呃,全球认证讲师啊,是首位的。
05:04
那之所以选择它呢?就是因为看到的未来数据库的架构,它的发展方向一定是云原生和分布式架构。那么TTC数据库呢,它满足了这两个特性啊,所以呢,在公有云私有云和独立部署啊。都可以满足于我们的各种场景。好。那么今天晚上我给大家讲的这个。这个架构呢,从这么几个方面去啊,让大家更好的去理解这个。T t for版的这个架构,那么这个t t for版呢,之前呢,叫t base啊,所以我在这里分享的时候呢,我也啊叫T贝斯啊,这样解化去叫这个名字。那么我从这个几个方面啊,让大家去了解啊,我从这六个topic里面给大家去讲清楚,基于这个数据库啊,它长得什么样子,它有什么功能,它为什么这么牛逼,对吧,在各种。
06:10
啊。金融证券保险啊,您做到啊。这样的一个满足客户的需求。在第一个,呃,我会给大家整体的介绍这个其这个分布式数据库的这个整个架构,然后进行每个组件进行拆分去讲解。那么TQ里面呢?比较有挑战的就是分布式,那它如何去突破这个分布式的一些挑战,做到保证这个分布式a cid啊,它的这个属性。那么还有一个比较有挑战的就是我们如何在线非常平滑的去扩容。而且呢,您做到这个冷热分离啊。第四个呢,就是啊,它有一个表大表交易啊,能实现这个OLA的这种大表交易的这种高效连接的啊这这些。
07:02
特性。那当然第五的话就是容灾高可用的整个架构啊,它是如何实现啊,当然第六也非常非常重要,数据库里面安全这块是如何做到三全封闭,这个呢,是我今天晚上要讲的。六个topic OK,好,那首先呢,我们来看一下T是数据库的。整体架构。那么这张图呢,可能大家都很清楚。呃,TP数据库,它是个分布式数据库。它是既存分离的,也就是说它的这个计算节点和存储节点是分离的,这样能实现这个啊。高并发。高性能这样的一个特性啊,因为数据库啊,最基本的功能就是存储数据啊。存储完数据之后呢,我要去使用,我要访问读写数据,主要是这两大特性。所以我们可以看到在。这个架构里面我们的存储和计算它是怎么去啊。
08:05
配合起来怎么工作的啊?那我要把这个T啊,这个T啊。它的这个性能发挥到极致啊,那还有就是我要满足啊,它的存储数据量的话,那我们可以看到我们来看这个架构图。这个架构图里面我们,呃,首先我们来看比较重要的一块就是存储。存储是在最下面,大家看到最下面,最下面这个是。存储节点啊,我们也叫数据节点,主要存放这个数据。啊,主要全盘数据的,那我的数据呢可以。以这个为单位这样啊。一个分片一个分配的去存储。那么这一个分片呢?可以在一台物理机。也可以一台物理,下面我多个分片。这个德是分片,就是逻辑上的概念啊,当然唯一个分片,比如说德一一个分片啊。
09:05
我要保障啊,它是高可用,那我有多个副本来实现,那当然这个多个副本了。我这个啊,这个。副本呢,是放在不同的服务器上面,这样保证啊。不会这个丢失啊,就是说不会说把三个副本都放在一个物理上,我们架构这样设计啊。那我这里有,比如说我这个架构图里面有四个分片,也就是说我有一一个大表,我的数据呢,可以拆分放到我四个分片,比方说我现在有个表有啊四千万条记录。那么我可以把这四千万条记录非常均匀的分布到我这四个节点,每个节点可以存放一千万行记录。那么。我要把这个数据均匀的分布的话,那首先肯定啊。有一个是吧。计算节点来这个统一来啊,管控怎么去分配,那就是我们上面看到的。
10:03
我们的协调节点,我们这叫协调节点啊,简称这个CM。那么CM呢,它呢是作为这个业务的一个入口啊,它的上层呢,一般我们会放一个什么。啊,负载均衡,比如说我们的LS啊,然后LS过来之后,把流量请求到我们的计算节点,就是我们的CM啊,所以我们说上面这个CM计算机里跟存储是分离的,完全是不同的物理机啊,一般我们是放在不同的物理机,因为它的功能不一样。那么这个CN呢,它每台。这个是对等的,也就是我们的CN1CN2CN3这个机器是对等,它所它的数据是一样的啊,所以在这个上层啊,我们这个CN啊。他要做计算,那计算这一块呢,啊,主要是做什么呢?SQL解析。以及进行执行计划啊等等这样的工作是吧。那么我们说我计算也有了,我数据也可以存了,也那么这里面还有我如何去保障我这个。
11:07
事物的原子性,数据的一致性呢?那我们有一个另外一个组件叫事物管理器,简称这个GTMGTM啊能保障我整个数据库,把我整个分布的数据库看成一个整体,来实现我整个的数据库的acid的属性就是原子性。啊,一致性隔离性和持久性啊,这个就是。T的三大核心组件。那么我们说这三大组件,这么多组件啊,那如果这么多节点,我如何去管控呢?那我们做了一套自动化运维的平台啊。我们的oss。那oss的核心啊,有两大功能,第一呢,我能监控我底层所有的节点,包括我的GTMCM和GM,同时呢,我能做自动化运维,我要去创建一个实例。
12:01
啊,我要加载数据,我要清理数据。等等,哎,那我们在界面上非常方便的。就能去实现,这样的话提高了我们的效率啊,这个就是整体的。啊,这么一个啊架构,那我们啊。把这个架构呢,简化一下就能看到啊,非常的简单,其实啊,你看我的这个应用节点,我的应用节点啊,把流量打到我的负载均衡,那负载均衡呢。把流量分发到我不同的计算节点CN上面。对吧,那CN呢,要去处理这个CQ呢,他要拿到一个数,那么他会去请求我们的GTM。今天给了他事物的属性的信息之后呢,然后他去解析这个CQ,解析完CQ就能申请出执行计划,然后下发SQL语句到我不同的节点去执行。啊,那我执行完了集,我执行的话是下发到我的数据节点,就是我的存储节点,我存储节点。
13:07
执行完之后的结果。再回到。我的计算机的CN上面,然后CN统一汇总给我们的应用层。那整个的处理啊,其实从这个架构图里面也是比较清晰的。啊,那么我们这个把我们看到的这啊。几个组件,核能组件我们分啊,分别来看一下,呃,首先呢。我们来看一下我们的这个CM,我们说的计算机也可以这么理解。那么这个计算节点,它的上层就是负载均衡,因为负载均衡它啊主要是啊。转发流量啊,做了一个,因为我这个CM有很多,那我不能说我应用直接去连CM是吧,那这样的话应用上要配很多IP值或。配这个这个很多这个CN的这个那个主机名,那这个太复杂,而且我要做到这个自动的去识别出,哎,我哪个CN有问题,我要去踢出来是吧,那所以中间肯定是有个负载均衡,那负载均衡我们用开源的,比如iOS啊,或者是F5,或者说我们这个啊云上的其他的一些负载均的这个组件都可以啊,都能进入。
14:16
那么所以呢,我们可以看到CM其实就是我们业务啊。这个啊,一个入口业务,把所有的请求通过负载均匀达到我们的CNCM之间是相互数据同步的,因为它要实现保证这个全局的,这个整个底层的数据库的一个数据治理的一致性。那CM呢,它作为计算节点,那大家想一下,在数据库里面计算计算,那预示着它肯定要做C解析C执行计划,包括。啊,还有一些这个CQ的一些啊,一些这个数据的聚合跟这个啊。做一些这样的操作对吧,那他把这个SQL解析完之后,会生成出执行计划,当他生成执行计划的时候,他要看他啊。
15:01
上面的什么一些数据字典啊的信息,统一信息统一信息啊,确定完之后,然后把我要执行的这个的这个执行计划命令啊下发到我们的。啊,存储节点就是我们的DM去执行。DN执行完之后的结果再回到我们的CN上面,然后CN啊。把这个结果回到我们的应用层,那我们要如果说我们之前说,哎,我们有些数据库,它是分布的数据库,它是不能去创建存储过程,创建函数的啊。那。T啊,它能去创建存储过程,创建函数,而且它是存在我们的CM节点。这是CM。那么刚才我们提到的数据库啊。的存储节点。存储节点我们叫did node,它主要是存放我们真正的义务的就是我第一次给大家讲的possibility数据库。那么抛数据数据库啊,我要把这个数据治理也好,或者说我这个数据,我要把我业务数据写到我的数据底层物理,物理层的文件上,那这个就是我们的data。
16:12
啊,那not呢,它呢,主要是接收这个CN的请求之后,然后拿到这个CQ去执行啊,去获取数据啊,然后去执行我这个CQ啊。那么因为我底层可能有是做分片的,那我有可能有多个啊DN,那么DN呢,它每个DN呢,各自。处理完之后,然后把各自的结果汇聚给我们的CN,如果说你这个时候做的是一个聚合的,比如说我求一个平均值啊,或者我求一个上,那么每个DM。各自处理完之后的结果再给到CNCN再一次的啊,做一个聚合,聚合完结果再回给我们的。义务。那么DN。它还有一个比较强的功能,就是说如果说我的底层物理机的存储资源不够了,那这个时候我能很方便的加入啊。
17:06
新的D进去,那么数据呢,非常均匀平滑的可以移到新的基地去。我们通过可视化界面,一键操作就可以完成我们整个数据的一个平滑迁移,这个呢,我在后面会详细给大家讲数据的在线扩容。另外他还有功能可以做到。这个数据的冷热分离它是怎么实现的呢?它通过这种group组的概念,主在我们数据库里面,可能大家啊。没怎么听过,但是表空间我想大家也听过了,那么我通过组这种概念,类似于表空间啊,因为我要去操作,我们开发里面,我们要去操作数据库,肯定操作表,那表表是这个数据放哪里呢?我们说放在表空间,那在这个我们这个TB里面,我放到这个组里面,那么这个组呢,它下面组成的是我们的DM啊,比如说我的default group下面DNA有三个D,那么DM最终是落到我们的具体的某个服务器。
18:09
对吧,所以呢,这样的话啊,我通过逻辑上的这样一个。定义之后,然后操作逻辑这个数据就落到我想要的地方,所以呢,我知道冷热分离啊。这样的一个。特性啊。这是DM的这个特性。OKOK,那我们看,我们有了计算节点,有了存储节点,那我们需要一个什么事物的管理节点来保证我整个事务的操作?是不是可以实现这个a cid的四大特性?那么事物啊,事物的一个非常核心,它能分配一个全局的一个事务ID,也就是说因为我这个C下发到多个节点执行的时候,那我要保证这条设备出这条C口是同一条C口,那我要给这条C口啊。
19:01
生成一个全局的一个ID号,就是比如说我要去判断这个人,比如说像我们疫情,我要判断这个人去了哪些城市,那我去拿他的身份证号,就你把这个人串起他的啊这个什么。这个它的流调就能翘啊,串起来就一样的,就是我把这个C口要分发到不同的基体执行的时候,那我要给这个C口生成一串字符串,很长字母串来识别,这是这条C口,所以叫GXID,这是全局事要做到的,另外一个我们是一个分布式的,那我怎么保证我这个什么数据的一致性读。那我们说单机版很容易用我们原生的啊,这个用MVCCC,那我要做到全局的MVC怎么办?这个时候我们需要用GTS全局,他就是我们一个时间戳啊,通过这个时间,这个时间戳是一个逻辑的一个始终来实现这种啊数据的一致性读。那还有呢,就是说我们是个分布式的,那我要保证我这么一张啊,逻辑上的张大表分布到物理上的各个存储上面去,那我如果说我要怎么保证这张大表它也是唯一的一个主见呢?那这个纸保怎么保证唯一呢?那我们在我们的。
20:13
GTM里面来生成一个全局的一个序列号,就是类似于奥AC里面sequence。好。好,有了这些特性之后,那还有非常非常重要的,就我们怎么来保证我数据节点的数据。是一致的。因为我们数据节点,我们是多个副本,就是一份数据我放在多个副本里面,那我要保证在一个。一份数据三个三,在三个副本里面来保证它的一致性的话,那我们用什么?有2PC2阶段提交。啊影响引起的,当然啊也可以用其他的很多方式来实现。啊,这是这个全局事务GTM的一些特性,好,那现在呢,我们对这个。三个核心组件有一定的了解。
21:02
那么我们通过一条SQL语句,我们怎么把这三个组件串起来,给大家做一个总结,我们来看,首先呢。啊,首先。啊,我通过APP这边我的APP。我的APP。啊,我的APP这边发起一条CQL语句啊,这条CQ语句呢,通过负载均衡传到我们的计算机的CM。CN呢,收到这个CQL语句之后,通过网络包解解这个C口,然后它这是一个请求,那么它肯定是首先要其中一个事物,就是begin其一个事物,其中一个事物,那么他要拿到这个C口语句的事物的话,他要给他。要到一个什么全局啊,就gtx ID啊,GXID,那么他会找GTM啊GTM就会申请出一个GTID就全取唯一号。
22:00
给到。我们的CM。啊,同时呢,他还要给啊分配出一个这个GTS全局时机号来保证我们数据的一致性的这种保障,所以呢,它同时呢,还要给到一个啊gcs。那如果说这套CQ呢,是一个因式into插入这种分布式表的话,那GTM呢,还要分配一个什么全局序列sequence。那给到我们的。CM计算节点,CM计算节点拿到这些信息之后,那么。就会对这个C呢进行什么进行解析啊,这个语法词法的解析,解析的时候,那么CN呢,会去拿这些所对应的这个CQL里面的对象表啊这些啊,对象里面的这个。数据字典里面的数据统一信息比表里的行啊快啊各这种数据,然后呢,通过这个成本分析啊,CPU成本的分析。当然如果我这个C口基于我一定特性的规则,它会根据这个r Bo的特性,切,根据r Bo的特性,这个比较简单一些,然后呢,再加上CP,这样结合起来。
23:09
对这个申请啊。执行计划。C音直计划就是生成我C口怎么执行的一个过程啊,那么他找一个存名最低的一个C口。好了之后,那这个时候这个C口呢啊,要进行这个执行,那这个时候它要把C口请求到我们啊下层的D啊,就是我们的存储节点去存,存储节点接收到这个CQ啊,它执行,比如说执行这个CQ是做这个数据的修改,那做出数据修改的话,OK,那我们说数据修改要保障数据的持久化的话,那么我们在修改数据的时候会产生什么W的日志,OK,那么数据节点它是一个什么呢?它是一个一组多重的加多副本的这样一个分片。所以呢,在每个上面啊,它要去执行啊这个C口,因为这个C口假设说是一个分布式的是吧,那么在多个data上面去执行这条C口,根据我们不同的这个。
24:06
啊,分配件下发到我们不同的节点上去执行。执行,那如果说是修改数据的时候,那会产生日志。那么我们要如果说这个场景是我们金融级的,那我保证数据的完全一致,那这个时候我们要开启强同步,那did not的直接的多副本之间的主从是强一致性的话。那么这个主节点啊,会把这个请求的这个W发送给重启点,重启的的任何一个收到了W之后呢,然后回给not一个确认是我收到了,那这个时候我的not再返回给我们的。啊,CMCM拿到啊,计算机的这个啊。请求说我提交啊,可以提交啊,那CN呢,会把这个信息给到今天叫他什么,你给他这个状态保存起来,这是我第一第一阶段的请求啊,在这个提交的这个第一阶段的一个状态,这样的话,第一次每个节点都这么干啊。
25:08
如果说CM接收到每个节点的请求,这个提交的这个状态都是OK的,那。啊,CN认为,诶这个每个数据节点都是可以提交的,这个是最终发起一个最后的一个提交,这样的话,最后提交完之后,那他会把CN这个时候就会把这个执行完了,可见结果汇总给我们的应用,应用就灵看到这个结果,那如果说我的CN其中一个有问题的,OK,那我想办法什么继续什么。去去从事去执行,如果说执行有问题的话,OK,没办法,这个时候啊。他会发起什么回滚回滚,那这个时候从TM啊GTM这个状态里面啊,然后回滚,回滚完之后,那最后返回给应用这边啊,这个执行失败是吧,执行回归回归掉啊之类的,那这个呢,就是整个啊这样一个CQ语句的一个执行啊,我们去理解。
26:03
这个。这几个组件OK。好,那我们呃,先来抽第一波奖啊,第一波奖呃,那这个奖品呢,啊还是有呃,啊腾讯和CN啊CSDN啊提供的啊提供的。那么我们来抽第一波奖啊,那抽奖的话我放点音乐,嗯。嗯。哈喽,小伙伴们大家好,在这里吃鸡,欢迎收看本期。好,OK,那我来点这个奖品啊,好,我们也来第一波奖品,OK,好,给大家一分钟时间啊,这个第一个奖品是什么呢?是这个QQ啊家庭版的毛绒公仔有三份啊,看谁能抽到,OK,有人抽到吗?
27:36
OK,好好。好,那么我们了解了这个T的三大主义之后啊,我们再来看刚才我们讲到什么呢?就是它的一个管控平台OS。
28:01
那么oss是我们做啊,自动化运维啊,我们做这个管控用的一个平台。一个可视化的web平台,那么这个平台的整个架构呢?有五个主题组成的啊。我们来看首先啊,那么啊,我们操作的时候肯定会提供一个web界面啊,那么web界面上面我们说oss两大两大功能,一个是监控我所有的下面的管理节点,另外的话我用我的运维人员,我们要去操作。啊,这里的资源啊,分配资源,操作管控,那么通过web界面啊,发起命令给到我们的啊CGL通用接口,然后这个请求会发给我们的pollutcy pollut这个代理,为什么这里又加个pollution的这个pollut使到请求之后啊,他会把这个请求的这个处理啊,请求的处理呢,写到我们的这个DB里面,想请求啊里面有些这个相关的信息啊,要写到我们的DB,我们的DB呢啊。
29:00
我们这里面的这个po,这里面相关的DB,这一整套是我们的雅典娜架构,是story啊,是这个云原生的po的这种架构啊,里面有几个几个组件啊,那我们的这个数据库呢,里面的这个叫康TB啊,康TB主要是我们整个集群的配置啊,一些相关的一些元数据的信息都放到看DB里面,所以这个请求呢,会写到我们看DB,由我们过来,因为这里加pro的原因在于就是说pro它可以设备出这个请求是要写数据,那么这个时候他会把请求发到我们的抗DB的啊,一组多重的master上面。那。我们每个看DB上面都有一个keep,你可以理解是监控每个节点的相关的信息,那keep的信息呢,会汇总给我们的S是整个集群的视图。精准试图,那么在这个架构里面啊。那整个这个集群的原数据的信息呢,再次给到了我们的etcd啊,Etcd只要存储我们整个集群的高可用的信息,来监管我们整个集群的高可用,那etcd相当类似于就是keep啊这样一个在这个TC马版的这个keep里面这样一个概念,那么它呢,主要这个ECD啊,它主要监管了这个我们的康康复DB啊,一组多重的,一旦我比如我的康复D主库挂了,那么ECAD可以做做自动切换。
30:20
同时呢,E也可以接管我们的。啊,Oss center OS center你理解就整个OS的决策,决策者一个大脑啊,它所有的最终的操作由他来决策调度的,那这个OS因为比较重要,它也是一组多统的,一旦我的OS master挂了,那ET就会做自动切换啊,这是啊。啊,这么一个架构啊。那么我们这个真正的数据节点都在我们下面,就是刚才我们讲的啊,我们的CMDMGTM这个节点。那这些集体上面都有一个oss的agent agent这个主要是啊,来监控我们每个集体的这个信息。
31:06
然后汇总给我们的。Oss,然后oss的把这个数据通过po写到我们的康TV里面去。那么如果说我的web这边要发起一个命令的时候,通过这个CG了,然后过来之后给到我们的po,那么po呢,会把这个信息写进去之后呢,然后再把这个要去做的操作呢,发给我们的oss,那OS作为调度者,他会下发给我们的每个集体上面的oss的agent,那agent呢,啊,最后呢,就具体。处理啊。啊,我我这个请求,然后给到我们的cn.n我们的GTM这个呢,就是一套啊oss的管控平台。OK。好,那么我们说把这个t base说的这么复杂,那对于我们开发人员也好,或者我们运用人说我们去使用这个数据库,到底说我在这个界面里会看到很多吗?啊,其实不难,它在使用的时候就跟我们用单机版的post gra是一模一样的。
32:07
你就理解啊,TB是数据库,虽然说有这么多组件,CNDNGT啊,Oss。那我们去使用的时候,你创建一个实例,就跟创建我们单机版一样的啊,那么我要去访问一个表啊,比如说我要访问我的业务表,那我就到我们的用业务的这个用户模式下面去访问它的业务表索引这些事,如果说我要访问我数据库的这个数数据字典的话,那我到系统模式里面去找他的字典是一模一样的操作啊,所以啊,从逻辑上来讲的话,就是跟我们用单机版的是一模一样的。OK。好,这是这个架构啊,这架构好,那我们刚才讲到了这个GM是保证这个t base分布数的一个。那他是如何去保证它的这个我们说这个,因为这个两阶段提交啊,它这个过程啊是比较复杂的,那它是分为两次操作,那万一这个啊,我们分布时间有个节点,如果坏掉了,那我怎么去保障,那它能做到啊,您把它修复掉,或者说我能发泄是不是。
33:14
啊,那我们来看,那我们说GTM里面它引入了。这些这个啊。GTS2阶段提交啊。这些啊,技术的话,那两阶段提交很简单,就是说我们啊,因为我们这个是一组啊,这个分布式的,那我要保证每个节点提交都是成功的啊。对吧,然后我要保证。这个。一个副本在多个节点数据是一致的,那这个肯定是要两阶段提交啊来啊做这个事情,就是说我两阶段提交。在分布式数据库里面都必须要有这个技术。啊,这是要保证啊。一因为我这这一个表,它是分布在不同的分片上面,就不同的节点,那不同的节点的提交每个是不一定都可以成功是吧,所以我。
34:12
我提交的时候呢,啊,要分两次啊,就两阶段啊,那第一阶段呢,主要是啊,我们要去准备提交,相当于是什么第一啊,他准备提交这个这个操作是比较耗时间的,因为像准备提交呢,相当于是我我这个数据库发起commit命令之后啊,啊因为commit命令下来之后呢,他这个wi这个日志啊,会写到主库,同时呢,我主库的这个。写的日志会发送的备库。那这样的话,每个分片就每个节点都要这么操作。那你们要发现,包括我,我确保备库一定要有一份这个。日志的话,那。那我什么我要去写东西之后要回给主库这边,我确定了我我写了是吧,然后把这个操作的过程啊给到我们的这个GTM里面,告诉他我啊可以提交,因为我的啊W都写进去了,这是第一阶段提交,这个阶段提交他的操作啊,如果把这个两项提交比作一个啊给他一百一百的话,那么大概99%啊,只占用了这个第一项提交这个他的这个。
35:20
这样的这个这个比例啊,那最后如果说每一个啊提交都OK的话,都可以提交的话,那最后就是啊,打个提交标记就可以了啊,这个就是两阶段提交。全体是中国讲了,它是保证我们整个数数据的什么读的一致性来实现。因为我们说数据库里面MVCC啊,MVCC就是要解决这个读不止才写,写不止在读啊这个特性OK。那么我们说两阶段提交,那你第一段第一阶段提交的时候,Prepare的时候呢,有可能啊,一部分prepare成功,一部分prepare不成功,那这种情况下面,而且我们在做prepare时候,我们有加锁,因为为什么呢?我们不能让我们正在成功的让让这个用户是可借的啊,没有成功的不可借,这种是不行的,所以我们让所有的prepare的时候,不管成功还是失败都不可借,因为我是没有完全提交,这个时候会。
36:15
有什么锁的阻塞,那如果说这个时候失败了,它常用在我们这个这个理念的话,那我们怎么去清理这个东西,哎,这个时候我们的TP内核做了优化,它能解决这个啊。在我们提交的时候啊,处在一半的状态,那我可以去清理。啊,可以清理。包括就是我们的这个,呃。啊,我们这个GTM啊,如果说这个时候正在处理事物的时候,他主机挂了,那这个时候切换成新的主播的时候,这个时候整个事物处在这个半状态,那我们怎么来处理。那。TP的核心可以对这种异常的处理做了一系列的这个啊。解决。这是事物的这个保证啊。好。
37:00
好,那我们啊了解了这个事物啊,这个事物因为两阶段提交也好,或者说这个。啊,一次性读也好,等等这些是吧,那所有的这个分布式事物啊,都是很多是通用的,这个呢,大家可以在啊,自己根据自己再去。看看。好,我们再来看一下这个t base这些扩容和冷热分离啊,我认为这是T里面啊,非常。强的一个特性。啊是分布式里面我们来看,我们主要学习这个呢一呢去了解他的这个思想,如果说让你去开发一个数据库,你能不能开发出啊这样的一个啊数据库出来。呃,我们说分布的数据库,那数据呢,是分布在各个节点。我以前呢是做这个,我给大家举个例子啊,以前我刚开始做这个马克的时候啊,因为马克大家知道这个非常流行的什么分库分表现实谁这就理解我们的这个啊叫分布式这样的概念是吧,那以前我们碰到一个,呃,我我我的这个啊,一直这个纠结一个什么问题呢,比如说我们原来。
38:07
一套订单库啊,订单库啊,订单就是我们的订单电商里面很的订单凹库,这个凹库的数据量非常非常大,我们有128个库。128个库,那么如果说一开始设计的时候,我就把这个我的订单库设为128个库,那如果说我业务量上来之后,我发现我128个库这张表数据存在128个库,就把一张表拆分成128份啊,128个分片那。假设我的订单,我们发现我们订单量非常非常大,这个时候128个库已经满足不了我这个存储的需求,这个时候我添加啊64个分批进来。啊,T60个视频变成这个时候你变成。啊,192个分片,那多出这个分片的话,那我们一般来说在数据库里面做分片都是什么球模啊,球模就是类似于这个什么,我这个。
39:00
我这个结解数是吧,啊,这个节点数,我的结解数啊,作为一个啊余数。啊,然后把我们的分片键除以一个余数,然后求模。啊,那我的这个节点数变了,那我的模也要变啊,那这个时候数据要重新分布的时候,要全部重新来一遍,那这个数据是什么。几十个T的,那这个成本是很高的是吧,重新分布,而整个业务是有很大很大影响的啊,类似这样的问题我们肯定会碰到是吧,那我们怎么解决,你看那我们的这个啊替贝斯啊,他是怎么去解决这个问题啊,我们来看。那么我们说分布式数据库啊,它这个数据的这个。分片存放,它是怎么存放呢?有这么三种啊,算法我们来看哈希,哈希就是说我们最好每个表都有一个为界,就是组件啊,这是唯一的,然后通过这个什么啊,求模的方法把我们这个啊。
40:00
数据呢,分布到我们的均匀分布到我们的不同的节点,比如说我余数就是节点数是吧,然后。比如说128,那我的这个余数是吧,就是零到127是吧,那这样相当于128个节点,那我数据呢,去去除,然后如果说这个啊模是一样的,那就放在同一个哈,是桶里面。啊,那这样是肯定均匀的,因为你是通过主界这样的方式来做。就是这一种,为了均匀用哈希,那还有一个呢,就是说啊。第二种是这个啊叫轮询啊,所谓的轮询就是说我现在比如说有三个节点。我有三个节点,那我这个数据呢,第一次写进去写第一个节点,第二第二条记录写进来是写第二个节点,第三个条记录写进来是写第三个节点,然后第四条节点啊,第四条记录写的来的话,是又写第一个节点,这样轮水轮着来写。啊,人人形啊这种。这种也是啊,有这样的场景。
41:00
还有一个复制,你把它看,复制指的是我这条记录进来之后,我写了所有的节点。啊,有这么多种。好,那我们主要来看一下这个哈希,因为哈希这个用的比较多啊,我们来看哈希,那么刚才我讲的一个问题就是如果说你这个分库分表的,你的节点数一旦定下来之后,数据全部进来,你后来发现要扩容,你的节点数多了,你的余数变了,这个时候的膜蔽了,膜蔽了之后呢,那我的数据分布要重新分布了,这个时候。是很麻烦的,所很麻烦的,所以呢,我们之前呢,就是说把这个啊订单库就定死,你128就是128 256,就两个字不要给他。再扩了,把它搞大一些啊,这样来做。那。如果说我一定要比较灵活去做的话,怎么做,我们来看t base是怎么来解决这个这个问题的,我们来看我们在这个数据节点之上。啊,就是我们的CN上面加了一层。
42:02
Map这张表。那么这张表是做什么呢?做映射的,就是说。把我们的分配剂和我们的。存储集体的DM啊,进行映射。那么我们通过一个什么字段呢?就是我们在我们的底层的啊。数据数据行里面加了多加了一个字段啊叫。ID。下ID。你每一行。下载ID。啊,产生每行的时候,我每行就给你生成一个下单ID出来。这个下载ID你理解它是一个什么分片键,这个分片键你这个分片里面有1000条记录,那么这1000条记录所在的需的ID是一样的。那么它对应的DN就是有有这样确定关系的。那么有这样的一个。
43:01
一层的话,那么他就可以做到。他怎么做到,我们来看一下,我们举一个实际的例子来看。你刚才讲的都太抽象了。那么在我们的这个t base里面啊,我们默认了我们的这个节点数啊,我们是拿这个。奥林斯巴。啊,默认是2048个分分片啊是大一些啊是大一些,就是我最大分现在两两千零四十八个分片。啊,这个把它固定死好,那么。那么我这个哈希界就是说我这一个主界啊,比如说我们说哈希这种啊算法的话,我们一般是用啊这个主界啊p key作为一个主界,比如说主界从啊一开始是吧,111直到这个,比如说四个季节是吧,1234567891直到几十亿几百亿是吧,那这个主界这个值这个整整形的除以一个2048,那么它会产生一个什么。下载ID。
44:01
啊,下来。下来,那么。那么呢,我要把这个下的ID存在我们每行的行里面,作为一个字的啊,作为一个伪列啊,就是相当于一个隐藏的列,就是固定时的。那么同时呢,我要把这个下单ID的信息记到我们的CN的一张表里面。Shut ID,那比如说下ID shut ID,这个shut ID。跟DM的关系。啊,求ID跟DNA的关系。我们有这么一张表。这张表。这张表。就能反映出他们的这个。存储位置。啊,你可以理解它是一张路由表,你比如说我现在DN1DN2,我一开始有两个节点,对吧,我一开始有两个节点。一开始有两个节点呢,然后我每个节点有三条记录。是吧,有每个基离三角形,比如说DN有S010305啊,DN有S020406,那这个时候比如说我。
45:07
这六条记录分别在两个节点。那这个时候我想把。其中两条记录移到一个新的节点,比如说这个时候我扩了一个新的节点D3。那我把。DN1的S03这条记录和DN02的S04这条记录写到DN去。OK,那你要让我的这个啊CQ啊,所请求的S03跟S04这条记录啊,去找DN3的话,那这个时候因为物理上已经考过来了,那我要去什么更新一下什么我的这个。这张这张什么,这张映射表。自然学的map的映射表,那这个映射表你看03S03S03对应的就是SDN3吗?OK,找他。那S04就是DN3,找这个距离就可以了。
46:02
就中间加了一层。所以呢,我们的CQ啊,要执行,要执行的时候,那首先会找DCM的这张这张映射表,然后一看这个数据在哪里,相面可以理解路由表,然后我就去找下面的接具体的节点啊,去执行这个CQ啊,所以我们VR条件里面要加上我们的对应的。我们的这个主界啊,主界这样的话,他就走到啊,通过这个主机这个算错的下达下达ID,然后找到对应的DM就过来了。啊,这是这个。它的这个扩容的整个过程啊,就是啊。把数据拷过去,拷过去之后,然后啊。冰心。我们的。路由表更新完之后,然后再去啊。做这个清理啊,那我们看一下具体,如果说具体的在我们的这个,呃里面处理是怎么处理的,我们来看。
47:00
很简单,首先登到我们的oss上面,登到我们OS上面呢,我们添加一个节点,比如说我添加了一个新的节点,就在我们的这个oss界面上面,管理节点上面啊,作为一个我们的DBA管理员,我们进去之后呢,添加一个新的服务器进去啊,这个服务器加进去之后,那这个服务器是属于哪个组的啊,然后这个服务器当然肯定对应的会有IP地址,对吧,添加一个新的服务器进去。那么这台新的服务器加进去之后。那比如说我想把这个,呃,这条记录给搬到新的服务器下面去,比如说把这个T表的啊呃。返回出来第一行里米等于一的这一行记录就是F1这个值的对应的一这个值啊,搬到我们的啊。新的基地上去,那我们看,其实在我们啊,每行里面都会有一个下丁ID,这个下单ID是我们常见的基础设施生成固定好的。啊,它是不会变的,哪怕你修改了这个主机的时候,它是不会啊,它是啊不变的啊不变的,那么我们可以看到这一条记录F1这条一这条记录,它实际上这个销量ID2234,它是存在,通过我们通过一个执行计划X play命令可以看到它存在的节点是什么,DN001就存在第一个节点,一个分配上面。
48:15
OKOK,那么我要去迁移这条记录到第另外一个分片上去的话,我们也是通过界面,哎,我们在这个。啊,这个在线扩容这个地方找到对应的啊,原来那条记录就是原来那记录在我们DN001上面,OK,那我要把它切到我们新的分片上面去目标分片,然后找到那条记录,找到那条记录的时候,我们通过这个,比如说我们通过那个下单ID,因为每次这面啊,最前面这个值啊,就是个下拉ID,你看下ID里面都有什么。几十万啊,几万条记录。10万条记录对不对啊,那我把它移过来,那这10万条记录。把它移到什么,移到我的目目标DN001002上面,然后点确认那个数据就过来了,数据过来了,数据过来啊,数据过来了。
49:06
那生成一个任务的方式啊,就数据就过去了,数据过来之后,然后我们再去查,哎,你会发现这一条记录啊。从第一个节点切到第二个节点去,它的销量ID没变,这个值没变,但是我们看执行计划的时候,它发现从啊变成什么DM00。一变成DN002了啊,这样就过来了,所以说通过界面化啊,就很快的就把数据。当然我们这个迁移是拷贝的方式,就是把原来第一个分配这条记录拷过去,那那条记录在第一个分配上,其实还有的啊,只是说呢,在我们的路由层,它是不可接的,因为路由就把它路由到我们的新的啊上面,因为由那个地方也改了,那个因素值也改了,那这个时候我们最好要做一个清理啊,清理就是把我们原来那个不可记代那个记录放在我们分配一的那条啊,那个值啊,把它清掉,那我们这里有个清理啊,当然这个清理呢,可以做这个啊,在执行啊,清理的时候就就把它清理掉,或者说我执行完之后,我自己再啊,单独再创建一个新的任务去清理,这样的话肯定晚上啊。
50:07
更另外的时间是吧,这样的话可以啊。不会对我们数据有影响啊,清理完之后再做回收啊,清理下来的数据还在回收,那数据就没了啊,这是这个在线扩容啊,这些扩容好,那我们再来看一下冷热风里。啊,这一同学大家了解了啊,这一块里面啊,一个难解是什么呢?就是原来我的啊这个节点数作为我们这个余数啊求模,然后哈是到我们不同的分片,那我增我要迁移的时候,我增加了节点数,那你的余数变了,那球模这个值也变了,这个时候放的位置也不一样了,这个时候我们怎么样平滑的,哎,中间加一层这个表。啊,映射表修改一下,就原数去改一下,那就不会说我把整个数据怎么重新打散去做是吧,很非常啊,非常这个巧妙的一个方法来解决我们这样问题。
51:03
我们再来看一下啊,冷热数据分离,冷热数据分离的思想是什么呢?做到我们存储的啊。分级、分类,分成这种思想,这种思想的核心是什么呢?就是要做到什么。我们的这个啊,降本增效,就是说让我们的热数据放到我们性能更好的存储上面去。让我们用户体验更好。那么对一些冷数据,就是不经常访问的数据,放到我们比较差的存储上面去,比如说我热数据就放到我们的固态盘SSD,那么我的冷数据呢,放到我们比较差的啊沙盘上去。那对于这样的处理,就我们怎么做,就是我们从逻辑上来讲,我要去访问这张表,让他智能的数据,哎。判断出来这个数据进冷,进冷的存储,那个进热的存储怎么做啊怎么做。那么我们说这个啊,我们在定义我们这个数据的时候,我们有一个叫啊组的概念啊group的概念,那类似于数据库的表空间逻辑上的概念,那group底层。
52:15
对应的映射啊,它的底层就是我们的DM数据节点,那数据节点真正的底层就是我们什么是物理服务器所在的磁场。你比如说我现在啊,我现在比如说我的呃,这个做电商业务啊,电商业务里面的数据量非常非常大,订单啊这种业务非常大,特别是我们的订单是吧,那我订单我想只想查我半年啊,这个当前半年半年的啊,这个数据那半年前的我都啊可能查的比较少,查的比较少,那可能用户用户也比较少访问,肯定这个呃访问量也比较少是吧,那这个肯定就这个需求量没这么大是吧,那我录入数据肯定访问量比较大,比如最近我买了什么东西是吧。那么对于这样的这个呃,我们怎么去实现,怎么做呢?首先就是我们要用这样的特性的话,那么我们在设计表的时候,就要把它定义好,这个表要把它定义好,那么这个定义这个表的时候,那么我们在因为我们的表最终数据是要写到我们的组里面去,组对应的就是我们的D安啊,这个我们的数据节点,数据节的底层就是我们物理机所在的磁盘啊,那么我们要定义好我们的组,定义组的话就界面里面是吧,我们去创建这个啊主,这个主这个主它的是吧,主的名字,它对应的IP地址是哪台服务器,这个服务器你可知道吧?这个服务器对应的IP地址你该知道了吧,这个IP地址所在的服务器,它的配置你应该知道吧是吧,它是配的什么什么盘是SD吧。
53:42
把这个组定义好之后呢,然后我们在创建表的时候啊,创建表的时候,创建表的时候呢,我们去这样去创建啊,我创建一张表啊字段这个大家都啊看得懂没问题是吧,我这个主界是F1,然后关键是这里我对这个表呢,这个主界做了一个哈希啊。
54:03
啊哈西,同时呢,我这个表呢,又。做了一个分分区啊,注意一下在T杯四里面表设计的时候啊,我们啊默认会对我们组件啊做这个啊哈希你看下面一个distribuor by sh啊F1F1就是我们组件,那就做了一个分片,就一起分,就是把哈希把整个数据全部打散,分在不同的啊分片上面去。同时呢,我这个数量比较大,我又把它作为一个作用region范围,把它再这个一级分区,分区啊,再做二级分区啊,就分配吧,再做分区,然后通过时间,比如说我用F2 f2就是我们的time step,然后。这个表比是从2019年1月1号开始,也就是我的数据是从2019年二号之后才开始进入,之前的数据不能写进去。然后每个分区啊,可以以年或者月或者天为单位,比如说我一个月一个分区,我创建三个分区,那就2019年1月二月三月三个,如果不够了再加啊,然后对应的这个分片F1 f1就是我们哈西的一级分,F2就是我们的啊这个第二个啊分分区。
55:18
啊,然后你看数据我写的时候,我这个数据呢,默认让它写的什么啊,这个里面有个默认组,默认组我们一般是热的啊热组,然后还有个人组,也就是我数据到底是经热的还是冷的,那怎么做呢?哎,我们可以看到我数据库里面我定的这个字段。啊,F2,我定义了一个时间概念啊。那我们再看。我要判断这个数据人跟热,我们的核心的就是什么,用时间来定义,因为我们刚才讲了,我们要看我们的场景,如果像这种订单啊,比如说像这个电话费啊这种,我不会去查两年前的这个数据吧,对不对,我直接查我最近半年或者一年的吧,对吧,那我不查的话,我这个数据按照时间的方方式,我就把它放到我的另外存储上就可以了。
56:04
啊,通过这样的方法来实现这个啊论数据啊。这样一个处理啊处理。那么啊。我们。举个具体的例子来看。好,我看又到抽奖时间了,抽奖时间我看还啊,我们继续抽奖啊呃。第二个奖品是什么呢?第二个奖品,第二个奖品是。啊,我们来再抽个奖。好,我们的第二个奖品是什么呢?啊是CSDN程序员杂志,这个呢,对技术爱好者,对技术爱好者,对技术爱好者是比较有用的,好给大家一分钟。
57:11
有没有人抽到了?好好,那大家应该有人抽到了吧,就测了个寂寞是吧,好,这个明天可以继续抽吧,明天继续抽,好我们来看,那我们来看具体例子,比如说我有一个保单系统是吧,那这个保单可能呃我呃,我要定义它对应的肯定这个啊保单里面肯定有个时间,那非常非常重要是吧,那我定义比如说我这个保单是2017年1月1号。
58:19
我定义的2017年1月1号是热数据,那我就把它放到热组里面啊。我2017年啊,1月1号之前的,那我就把它放到我们的冷的这个组里面。这么去放。那么具体的放的话,那要注意,就是我们这个系统里面。有两个参数,一个参数呢,是控制这个时间的啊,就是说。我这个冷热的分割点啊,时间点,比如说2017年1月1号做一个我们的冷热数据的一个分界。那么我们可以看到2017年1月1号里面有年是2017年,月是一月,日是一日,所以呢,我们在这个天啊,这个区分冷热数据的时候,我们可以以年为单位,或者以月为单位,或者以什么以这个天为单位啊,非常啊稀度非常。
59:14
非常这个多啊。如果说我设为2017年。这个年为单位,那我还要再设一下我这个啊,设这个。分割的模式设为你啊月啊,如果是月的话就慢是吧。那年的话就是2017年作为一个分界。啊,做一个分界。就是2017年的数据那。做一个分界啊,2017年之前的数据就啊冷的啊,那之后的就变成热的啊,这两个参数很重要,这个设好之后,那我们去创建表的时候,就是刚才讲的我们创建表的时候,那这个表呢,你就要定义啊,它的几个字段,比如说它的F1就是我们的。作为我们的什么呢?
60:00
这个组建啊,哈希到我们所有的。这个分片。然后F2作为一个时间啊,来区分我这个数据是冷还是热的。做一个二级分区在哈奇里面,好,那有了这个之后呢,那我们可以查到,比如说我在我这个系统里面,我创建出两个组,一个是the fort group,这是我们的热组,然后再创建一个冷的组。啊,当然这两个组织下底层肯定是对应的IP地址,对应的服务器,那我们可以看到。啊,我这个啊里面。是吧,对应的我们之前讲过了对象啊OID的对象对应的是哪个节点。啊,通过这个来看到啊,我的。节点对应的一个对象号,然后这个节点你看在。热的啊,默认组里面啊,1638516768这两个节点,那说明什么ND001D002就是热的数据,热的数据就往里面写,就2017年之后呢,就往这个里面两个里面写,那2017年之前的就往什么GN003D003就对应的是什么code group对应的这个它的这个啊OD啊1676。
61:13
九啊,这里看到这两个视图。OK啊,那。我们来看一下,比如说我现在要查一个数据,比如说查大于等于二零呃一六年和呃1月1号跟2017年1月1号这个数据,那这个数据是2017年之前的数据,那我们可以查出来它在哪里,它在我们的DN什么003里面,D2个零三,为什么?因为它是什么小于2017年一号。对吧。好,那我们可以看到,我要查2017年到2018年之间的数据,那我们可以查到这个数据,在执行机里可以看到它这个数据在呢,在我们DM001里面啊。做我们的热数据。啊,所以这里呢,就是我们在用的时候啊,就是先要设计好这个环境,就是说我设这个数据是按什么。
62:06
什么来?时间来设这个冷热的,比如说按照。牵引的力度,年还是月还是日,如果年的话,OK,那就选年份。选好之后。然后啊。那你借表的时候就要注意啊,里面有time steps接触啊,那进行这个迁移。好,那当然贴完之后这个也要做这个啊。空间的清理啊,因为迁移过过去之后要迁移,它肯定是要拷贝嘛,那原来的数据肯定不用了,就要清掉啊,这是它的一个非常重要的特性啊,就是。再现迁移。啊,这些扩容啊,这些扩容和冷热。啊,这样的分离啊,做个自动化的,全自动化了,对吧,全自动化。OK,好,我们再来看一个啊,杯子啊。
63:03
它是个分布式数据库,那我要把分布式数据库里面,它的数据量非常非常大,因为为什么要做分布式,原因在于就是说两点,一,我的数据量是海量的,所以呢,我需要有不同的分片,不同的节点来存放我的数据啊,基于基于什么,基于这种啊。相对纳税。这种架构。那还有一个特点呢,就是我要保证我的什么。响应时间啊,非常非常快。读写要很快,所以呢,T base它怎么做到,比如说我两个大表之间多个表示交易的时候,那提升性能如何来提升,哎,我们先来看看他的思想哎,以及他是怎么做到的。那么。T里面有复制表,哈希表啊。就用啊。复制的这种方式啊,这个复制表呢,在TC方法C版里面叫广播表啊,概念一样啊,就是说我这个表呢,会分布在所有的分片里面。
64:03
那么哈希分布自动表呢?在。我们这个。体里面叫分布式表或者叫普通表,也就是说。即便是它默认就是分布式表,不管你有没有加那个关键字,它默认它里面有个算法它默认。哎,就会去找,如果你在创建表的时候没有加特殊字的话,它会找什么?找主界,如果没有主界,它会找分区界,如果没有分析界,它会找什么?第一个表的第一个字段,它有这样的一套算法。所以呢,我们最好在创建表的时候要加上一个关键字,指定哪个字段做一个哈希分布。OK,那么对于这个region region,你可以理解,他是在哈西之下的。二级分区,就分布式里面再做个分区啊,一般基于什么时间或基于这个啊,这种数值整形这种来分啊来分的好,那我们讲这么多,我们来看例子,比如说。
65:01
复制表,复制表,我们在创建的时候,你要加上关键字啊。Distributed by replication,然后。这是。代表什么?这就是这个负值表。然后To Group default,就是把复制表写到我们的什么这个里面。这是复制表。普通表,也就是我们刚讲的分布式表,那我们最好说你创建普通表分布式表的时候,最好加上什么关键字,就beauty by,虾的括号里面什么这个。字段,这个字段最好是主键或者违建。拿到这里,当然如果说很多同学可能,哎不知道这个有这么个关键字,这个时候直接啊啊。这个地方没写这些关键字啊,就是这个蓝色的没写啊,绿色字没写,就直接到这个括号里面封号回车,实际上它内部也会去找什么呢?找这个组件就key。
66:00
这个作为一个分布式。它很智能,它会默认是找这个主件,如果说你这个表里没有主键,它会找你这个表里面的partition,如果没有partition,它会找这个表的第一个字段做一个哈希分片,OK。大家一定要啊,理解这种思想,就是那我们再来看分区表,哎,这个分片跟分区表我我是吧,我这样听起来被搞混了这个。确实啊,一开始如果你不是搞数据库,或者你长期不是搞分布式数据库的,是吧,搞一般数据库你肯定啊,很容易难理解。实际上在这个t form码C版里面啊,我们叫二级分区分区是吧,那在这里呢,叫分区表直因为它默认这个啊t base就普通表就是就是分布式表对吧,所以呢,这个地方,那但是这个地方借表的时候要注意我们看。那么你看前面这些字段。没问题对吧,主机F1F2是直接说F3是一个挖,那你看by region括号F2F2什么是个region,我们说要么就时间,要么就整形是吧,一般不会用字符的吧啊。
67:08
然后这个分区,那么分区它是从什么地方开始分区呢?它是基于一个什么without time z,就是它没有时间啊时区,如果你这个业务不是国际的这种啊,什么东八区啊,这种没有国际业务的这种时间,它就不没有这个时区啊,从2019年1月1号开始这个数据啊。这个字段是从2019年一二开始记这个这个记录啊,自己的记录,比如我查2018年的插不进去啊。然后他基于每个月一个分区,然后多少个分区,后面是比如说三个分区。那你看它后面写了一个 distributedf1这个就什么,这个就是哈希的什么。哈希的分布式的分片。先把我这个表的所有行的基于这个F1这个组件,把数据打上了我们的各个DN分批里面去。
68:03
同时呢?然后基于时间的方式再给他。划分就是一个分片面一个哈希分片里面又用时间在进行拆分啊,类似于指标这种概念啊好,那我们了解了这个之后啊,我们了解了这个之后呢,然后如果说我们现在啊,经常会碰到这种啊表的脚印。因为这个po它是比较擅长于这个数数据的分析,所以我们说我们popla版我们有两个版本,一个基函数存储。另外一个我们基于这个劣势存储啊,它有两个版本。那劣势存储它的分析的性能更强,因为劣势存储啊。它这个特性就是做分析啊。所以呢。我们这个t base啊,这两个版本啊都啊都有啊,那我们来看,我们如果说做两个表进行交易的话,那这啊复制表也好,普通表分区表他们是怎么来做啊,怎么来做,我们首先来看一下,你比如说你这个表里面啊,我们去join的是这两个表啊,啊是两个这个分布式的表,就是普通表,那普通表肯定都是有什么。
69:14
这个key是吧,那下key下key,那么注意一下,如果说这里优化的核心思想就是首先我们在设计表的时候,我们要让我们的组件作为我们的一个下列key啊,作哈希触魔的方式来啊。做这个数据的分布。所以呢,当我们两个表交易的时候啊,我们的优化的核心思想是什么呢。为了减少我们的网络IO的话,那我们最好什么要选择什么交易比较频繁的字段作为我们的分片键,这个就是优化的核心思想,就是说除了我刚才讲的第一个规则,你要把组件作为一个。哈希,借去除以我们的这个节点数啊,取模的话,把它数据落到我们的不同的DN分片上面。
70:07
那么在真正写C的时候呢,最好要看什么,你后面的这两个表做交易的时候,那它的VR条件里面。这两个啊组件,它对应的分片,那最好是把它作为我们的。这个。分片。所以呢,你在设计表的时候,包括你在业务里面去理解这个业务,它这两个表要正常要交易的这两个字段。是不是?我们把它做成啊这个分配界啊,这是这个事项,这样的话,它在每个分片上面,因为它的ID这个分配界是一样的,所以它落在同一个啊这个节点上面,同一个节点上面啊,那进行这个啊数据的这个交易的话,那本地交易的话,它的内存里面,那就很快了,就能找到数据啊,就在内存直接处理,就不用通过走不用走网络IO了啊,就分布式里面网络IO的开销啊,会直接影响到我们的性能。
71:02
啊,这是这一个,那第二个呢,就是说啊,我记得有一个大表,一个A表是很大,一个B表呢是比较小一些,那这种情况下面。我们的核心思想也是一样的,就是我减少这两个表交易的时候,走了网络IO。那这种小我不让他走网络,因为比如说两个表一个大一个小的话,那我大表跟角表进行交易的话,那那怎么办?那我能不能把这个小表复制到所有节点,因为小表本身这个啊,这个数据量不大啊,我以什么以空间来换时间这种思想来实现什么我的性能。这个时候我们就要体现出复制表,或者我们的广播表这种特性,我们借要借什么,借广播表,这个时候你的性能啊,从这个原来。比较慢,这个是一下子记好之后发现这个提升了什么十倍。这个我之前啊,这个给一些客户啊,做过这样的啊,这个发现这个信任确实啊,一下子就上去了,一下子就上去了。
72:02
我给这些给几个那个上市比较大的上市公司啊,他们用这个t base的时候啊,碰到各种实际的问题,然后我用这样的思想去解决,效果是很快啊,直接可以吊打那种什么劣势群组啊,很多很多啊,就我们都对比过,做做那个啊。记患时OK。那么我们再来看。如果说哎,如果说你的这个啊,这两个表进行交易的时候,那么它的这个表交易的这个两个字段,它不是我们的。这个什么。非配件,那这个时候他就不能在本地。啊进行交易了,那这样又可以走大量的什么网络IO,或者我们这个,所以这个地方啊,我们要解决这样问题,首先我们要是啊,我们设计思想上来看,就是我们究呢要把这个表设计成啊自己的这种分区表,就是在分配里面再接分区表。同时我们这个t base是有什么特性呢?就是有我们在价格里面,还有一个没讲,就是那个数据通道,我们这个有个数据通道这么一个特性,什么意思呢?如果说你这两个分片啊,这个两个分片这数据要进行交易的话啊,那它没有落到同一个分片里面,但是它两个分片,那如果这两个分片刚好在同一个物理机里面,OK,那。
73:25
他不走网络。这个时候我直接把。数据。啊,这两个大的数据啊,重新进行分布,当然分布的时候它不是用了此法,用了这个内存,通过内存进行交换,那很快速的在内存上面进行什么重组啊。OK,那还有一种就是说这两个分配呢。它是不同的物理机,哎,这个时候呢,要走这个网络的IO,然后把数据啊。重组到我们的。啊,这个通道的这个什么内存里面进行交换,然后进行什么,再进行什么交易。所以这个时候我用到那个数据通道。
74:02
啊,那顺道这是我们这个交易。那么我们说。让我们这个交印这个两个大脚啊,跑得更快,只呢更快的时候,我们最好用什么并行的技术,并行,注意并行不是用在任何的CQ里面都快,它是用在一种大表,特别大的表的时候,那他您。体现出这个效能啊性能,如果说你这个表是个小表,这个时候你用并行去做的话,反而更慢,因为并行的时候它启用的进程比较多,会多起出一些进程出来,这个时候会消耗CPU,明明这条C可能是需要一个CPU,这个其多个的话,那反而浪费了,所以呢,它适合于这个啊这个。大表,所以它底层也是用了几个下面几个参数啊,可以配的可以配的啊。啊,第一个参数是每每条这个执行的时候所需要的并行的进程。啊,下面是这个距离,总的我这个啊,整个这个实例里面是吧,我需要多多少个这个进程啊。
75:00
那对这种这个呃,大表的交易的话,我们有这个哈希交易啊,哈希交易的话呢,就是一般是等值连接啊,哈希交易的思想都一样的,就是说我要去构建哈希表,那哈希它有两个表情交易的时候,他一般会选一个比较小一点的表,把小一点的表呢放放到我们的内存里面。然后。对应的这个两个表的交易的这个字段,生成一个哈希地址啊,放到内存里面,那如果说这个放到内存,这个哈希的这个表是虽然是小,但放在内存,内存不够了,这个时候他会把这个表做一个什么。啊,七分复印多个什么,复印多个这个这个区。它腾的方式内部自动去分,分了之后每个区。啊去处理,处理完之后再合并。然后呢,我们的大表啊。然后那个光联的质量啊,它生成一个哈希值,然后到内存里面啊,因为它去分的时候啊,这个哈希在内存里面找数据的时候,哈希是最快的,比那个B加速B去还快,因为我们通过哈希巴ET那个桶啊去找数据啊,哈希只是一样的,它会放在同一个巴列入里面啊,就扫描这个列就可以了,找到那个确就可以了啊,所以呢,这个呢,就是对大表去交易的时候,我们通过哈希哈希的满就是一定要是顶值交易。
76:23
啊,好,这是这个。这个。表达脚印和并行的这种技术。OK,好,我们再来看,我们再看一下这个T贝斯里面这个数据库的容灾架构。的管理和策略。在这个里面啊,我们非常关心的就是说我这个数据库啊。我的数据非常重要,那我要做到什么这个保证数据啊。不会丢。不会有问题是吧,那我们有这种容灾的架构啊,首先我们来看一下第一个架构,同城单中心的架构,那么这种架构呢,就是说我一个城市里面我就一个机房。
77:06
那我们部署的时候呢,大家注意,如果是这种场景的话,那我们部署要注意,你在这个机房里面,你部署的是比如说是这个一组一重的话。或者一组两重是吧。那你这个把这个主从这这一套副本要放在不同的机架里面。否则的话,你如果机架放在一起的话,那这个机架如果出问题的话,那这个整个这个副本就出问题了,那就没法访问了。那在这种场景里面,可能就是说有这么几种情况,就是一呢,就可能这个啊,我这个业务就是这样的需求啊,我不能把这个业务放在两个不同的机房是什么,放在这个同城的两个机房,因为可能我对这个业务的这个啊,主从数据的这个访问啊,这个延迟非常敏感,就是我要尽量保证这个。数据啊,不要有延迟,所以呢,我主从之间放在同一个机房啊,这是这种场景,有可能第二呢,就是说我这个机房就是啊一个啊。
78:03
异地的容灾机场,备份机场而已,对吧,那我就发现这种架构就OK了,就OK了。那还有呢,就是我这个机,我这个环境呢,就是一个测试开发的,我就这个啊,放在同一个机房就可以了,所以呢,这个是如果你选的是同城IC机房的话,这种机房的话,那t base呢,就这样一个架构,那架构的时候我们就把这个服务器放在不同的机架,然后我们可以去。去,去规划部署,去安装。啊,那我们可以看到这个,不管是CN也好,或者DN也好是吧,那我们啊放在这个。两个不同的这个这个机架上面啊,两个不同的机架上面。然后这个复制是吧,我们可以用啊强同步啊,也可以用这个异步的方式,这个可以去选是吧,在我们这个啊OS上面是可以选择的。就是这种。这种,那么。如果说这个你这个业务比较重要说我一个机房啊,万一这个一个机房出问题了,那这个。
79:05
这个可能就会啊,对吧,我的业务就不能访问,那我就搞两个技法,搞两个技法,搞两个技法呢,那TP也是可以部署的。那实际上就是说我们在架构设计这两个机房的时候啊,这个一定要注意啊,这个在几年前啊,呃,全球最牛逼的云厂商啊,他在北京有两个机房啊,然后做做这个云计算的。那么呢?那么我们一般来说啊,这两个机房我们的光纤啊,都是独立的啊,然后一个机房如果光纤被挖了,另外一个机房是啊马马上马上可以切过来用的啊,但是呢。这个有一次呢,这个啊,突然这个云机站都不能用了,整个北京的不能用了,因为有两个有有两个机房为什么都不能用了,后来就查是因为这个挖掘机把这个啊去挖掘的时候呢,这个把光纤挖断了,那么我们想挖纤挖断了,那你这根挖了啊挖断了,那另外一个机房不是可以提供服务了吗?而且是全球最牛逼的云云云厂商,对不对。
80:08
后来发现个什么问题呢?就是这个设计里面就出问题了,这个它呢,这两个机房,比如说IDC1啊,引出一根这个光纤线出来,然后IDC2引出个光纤线出来,光纤啊引出来之后呢,然后这两根光纤线呢。捞出来之后呢,又埋到一个管道里面去了。啊,这个时候挖进去挖下去呢,刚好把这两根这一个管道里面两根管线都挖断了,这个时候其实。这种价格是有问题的,所以我们在架构设计的时候,各种冗余啊,我们尽量要什么打散,这样打散。那我们可以看到。我们在比如说IDC,一是我的这个主机房对吧,那我这里就啊有这个啊一组。啊,一从。对吧,一组一层。啊,一组一冲啊,一组两重,一组两重。
81:02
那这个呢。是我们的,比如说主机法对吧,那。然后。我们在另外一个机房啊,放了一个啊。啊,放了放了一套啊放了一套。放了一套。那我们可以看到就是说我这个啊。我们可以看到我这个结节啊,我这个结点是啊,一组一重啊,这边主机版这个是一组一重啊这一套,那我们可以看到我这个。读写的这种事啊,我业务写进来啊。然后后面我从的话,我们只做这个数据的这个啊报表分析读,所以我适合于什么o lap这种是吧,这种,那么注意一下就是说IDC2如果说我的数据对延迟要求比较啊高的话,就要求比较那个延迟要求比较高的话,那就是说我不要延迟的话,那最好是把IDC2的这个备库啊,接到我们的IDC1的主库上面去啊,这样直接接过来啊,不要通过啊这个串串联的方式啊,激励的方式去读这个IDC1的这个重击法。
82:09
当然如果你去你这个主机房的话,那主库的话,这边的话,那对主库的网络IO或者CPU是有一定的影响的,这个呢,这个时候你要去根据你实际的情况来。啊来去确定我IDC2的这个机房的重库到底是你IDC1的重库还是主库,这个我们是很灵活可以配的,所以呢,这个你要根据这个需求啊,根据我们实际的这个来看。那么。还有一种需求就是我们要做到多活两地三中心,因为我们刚才讲了你同情双中心,那如果说城市级别的容灾啊,产生不可抵抗的自然灾害的话,那我要保证这个数据呢,在另外的城市相差这个什么500公里以上的城市,能不能再做一份。啊,这样的话,我把我的数据备份过去,那这样的话,我在我的。
83:01
异地是吧,再做一套啊。这样的话,那异地的这个接入呢,可以接到同行的备库,也可以提到同性主库,这个看我们的这个需求,这个看我们的需求啊,这是啊整个这个。部署加快来看的话,我们可以做到同城单中心双中心,两地三中心啊。非常灵活啊,非常灵活。那么我们说,那我们怎么来保障,说我能自动切换啊,我数据不会就不会错是吧?那我们用哪些技术来实现。这个呢?我们用了什么?一用了强龙布,强龙布是保证数据不会丢,不会错的。那。我们的设备是吧,用于这种思想,这种思想所以啊强当度,那这个不用多太多说太多,就是我数据肯定是啊,要保留养分,一个足一个辈,至少是吧,这种方式来实现的。
84:01
呃,那么我们啊。还有一波奖品是吧,还有一波奖品,还有最后一个奖品是吧,那我们啊再给大家发一波啊,最后一波福利啊,这个福利呢是呃,CSDN提供的T恤是吧,T恤。行。那么。我给大家再发个奖品啊好,这个是CSDN的定制T恤啊,大家来大家来抽一下,大家来抽一下啊,来看谁能抽到啊,抽的同学在群在那个直播间啊,发发出来啊。
85:11
OK,有没有抽到,有没有抽到。好好,我们继续啊,我们继续。好,那么。一个啊,一旦我的主库是吧,挂了,那我们整个切换啊,全部是自动化的,非常非常啊,这个方便啊,通过几步就可以了,主库一旦挂了之后,那么啊,他会上报给我们的oss master决策者,那决策者这个者通过判断哪个作为新的主库啊,通过日志判断完了之后啊进行选举,比如说选举出我们新的。啊,新的选举完之后啊,那么呢。
86:03
他会啊。它会这个什么啊,然后另外的备库是吧,再进行啊组从进行这个重重建啊,完了之后,那么把这个信息啊归到我们的CN。啊CN啊,下面是CN啊,重新要更新它的路由信息啊,知道新的。新的主。是,是谁?啊,现在是是谁啊,在这个过程啊,还是比较啊。简单了啊,那么整个这个切换啊,我们不管说这个。故障自动切换也好,或者说这个。实际上整个核心思想就是一,我们的架构呢。它啊做到高可用啊,通过去复制的强强同步复制的这种来保证数据不会丢,不会错,然后我们有一套比较完善的这个切换的流程啊,当然我们这个切换可以手工,也可以自呃自自动手工,那就是可能我们要做维护的时候,或者我们正式切换,这个时候我们要做维护计划内的维护等等,而且我们在部署的时候非常灵活,可以同行单中心双中心和两级三中心啊。
87:12
啊,那另外呢,我们也可以非常方便的可以做到什么备份,因为虽然说我做到主从啊,这种已经向上是备份了这从,但是呢,可能有些场景,特别是金融的迎接会这个啊。这个监管的要求一定要有备份,所以我们备份可以备份到我们的哈,啊HDS啊,另外我们搭储存的时候也需要备份,或者我们出现故障的时候,需要用备份来恢复到另一个点,我们是可以做到。好。好,那最后还有一张啊,最后还有一张。呃。还有一张是讲啥呢,就是我们数据如何做到安全和这种加密啊。那么这一张呢,这个比较简单叭,较轻松啊,因为快讲完了,那这张呢,是我们啊,因为很多数据库啊,可能只有一个数据库管理员,很多数据库都没有考虑到我有安全管理员,审计管理员这样的思想,来保障我整个数据库的安全,那在t base里面呢,他通过这个。
88:16
除了数据库管理员,他还有安全管理员、审计管理员,然后这三类角色是相互独立的,相互可以牵制。比如说。我审计员可以审计管理员的所有的操作,你管理员。权利再大,我可以审计你。对吧。呃,那么安全主要考虑我数据。比如数据的脱敏,数据的加密。啊,等等这样的。工作,那审计就是我要把你的各种操作,你的表的操作,对数据库的操作。对你的各种啊行为我都能记下来啊,一旦出问题,我就可以通过审计来追踪到底是谁干什么事情。
89:05
管理员,那当然他呢,就是对整个数据库日常运维,包括我的创建实力,管理资源。处理数据。等等,刚才我们讲的一些啊,都是由管理员来做。那么。我们说这个数据要进到库里面去,那数据对应的进入库,那我们要用呃,不同的用户来实现,那么用户。啊,我们把这个用户呢,又分成这个三元组这样的划分。我们呃,通过不同的这个用户的职能。他的这个。权限啊,来控制到底说这个数据啊你。级别越高,你是你看多少数据是吧,你同一个部门,那你只你只能看你部门的数据是吧?啊是这样的一个啊。
90:00
实现。啊,所以我们这里可以看到是吧,我董事长是可以看所有员工的信息是吧,可以访问所有员工的信息,那我的部门经理是吧,部门总监,那我只能看我这个部门这个所有的信息。是吧,那当然你这个部门下面有这个小组是吧,那我可以看到啊,下层的他可以这样层级来区分。那么那么这个安全员呢,它可以根据我们这个用户的权限,他的这个职能啊,是吧,我们对这个数据呢,进行什么脱敏啊。那虽然说在数据库的底层,它每列自然都是存在的,但是每个不同的。你这个层级的啊。人去看的话,数据看的是不一样的,经过透明之后,这个数据就你看到,就不是说你真正是啊是想样子是吧,他会有这个。对应的那个啊一些这个转换就转换。
91:02
那么对于审计来讲的话,那它的力度是非常非常细的,细到可以什么呢?我对这个语句的一个操作。啊,就是我操作这条,比如说我经常去查我们的工资啊,某个员工的薪水,那这种你肯定是什吧,这种肯定是不合规的吧,所以这种呢,我要做成什么这审计,比如说你是管这个财,这个这个人力资源的啊,这个这个系统,你现在去查别人对吧,那这个啊查的工资还是很敏感啊,或者说啊查财务系统啊。所以呢,这些我们可以做到非常非常细致度,非常细的这种具体的语句的操作。OK。好,那么今天呢,就是说整个架构啊,内容比较多,然后呢,我们分别讲了t base的整体架构啊,对整个t base的核心的三拉组件啊CN。DNGTM啊。这三大组件。它的各种功能,以及啊,这个C口执行的时候,在这三个组件之间是怎么样去,它的流程是怎么样子的,这个非常非常关键。
92:09
那。我们啊。这个数据库里面,这个分布式事物TPS里面,它怎么来保障这个它的安全性啊。它的原子性,它的一致性等等,那由我们的点击量、提交和权力始终来保障。当然我们有一套这样的管控系统是吧,上层oss来实现我们的数据库的一个维护,比如说我们讲的数据库在线扩容,人流分离,其实通过我们上层的可视化界面来实现就可以了,一键操作就能完成。啊,那这些扩容和人的分离,这是我们啊数据库里面经常会碰到的啊,这样的一些场景。那么对于大表or LA的这种场景,那TP呢,也很好的能解决它的这个两个大表多个大表的这种分析啊,这种查询。
93:03
那么还有就是我们在容啊高可用容灾我们部署的时候,那么我们可以设定强同步的方式来实现,保证这个数据是一致的。然后我们可以实现啊,同城三中心啊,两地三呃三三中心这样的啊,以及呢,我们这个啊,数据的安全是怎么保障,我们有三权分立啊,安全员审计员和管理员来实现。OK,那么呃,我希望大家呢,学到这个之后呢,大家可以去做这么一个作业,比如说我,呃你比如说明天是吧,大家听这个,呃胡老师去讲这个安装,大家如果安装好之后呢,哎,通过安装的这种呃环境了,那比如说我我去看看我刚才讲的那些这些这个组件,比如说通过这个进程是吧,比如说诶D它装在哪里,它的进程。是吧,怎么去看啊,他的日志在哪,他的数据放在哪里,他D个数据放哪,他的日志在哪是吧?你说出通过这个装好之后去看到这个,然后你啊,你讲的出了解它的一作用。
94:05
另外呢,比较有挑战的就是我通过一条SQL语句在执行。然后。再去看他后台日志,看到整个数据流啊,他们之间是怎么配合的啊。那这个呢,就是今天我讲的这个内容。好。好好,谢谢大家。我看大家有没有什么问题啊,我看看给大家解下问题。啊,自研的,呃,什么叫自研的分区表是吧?呃,就是格数据库。Po的开源数据库,它的分区的这个技术跟t base自己的分区表是有一些。不一样的。啊,那我们说自己的分区,就是刚才我给大家看到的那个分区的那个语法。
95:03
用这样的语法来做。这个语法来做。就是啊,这样的语法就是字也的。那如果说如果说你不加什么Dis To By的话啊,那其实用part meaning令这个表也是可以借的。但是。他这种效果。肯定不如。这个字眼的。这个呢,呃,像这种这个例子啊,这个之前呢,我们有这个用户啊。他呢,就是开始对这个TPS这些东西都不是很了解,然后他做的时候就按照这个对TPS的了解去创建表,然后发现这个跑起来C比较慢,那后来我们经过这个呃优化,用这样一个表借表的方式去做的话,那个性能就好很多啊。因为我们这么做的话,首先一个呢,就是。本身我们做了优化,第二个就是说我们用这样的语法来做,一定要用这样的语法来做,这种语法来做呢,就是一呢,就能保证我后面实现什么这种这个人流分离。
96:11
然后既这样去写的话,那我的这个partition啊,最好是用我们指定的这个。哈希界就是p kid这个界作为一级分区啊,如果你直接就partition by的话,那么它会。首先会去找组件做一个哈,因为我们的这个分区啊,是基于哈希的一级分区之下的子子分区,那如果说你直接用这个post green part by这个呃,执行来也能执行成功,那它呃,首先它会找这个表里面的组件做一个哈希,如果你是刚好组件用了是比较好的,OK是没问题的,那如果说你这个时候没有设主键,那他会找分居界。找到自己,找到自己这个时候是时间,那就时间做一个一级分区,然后再再什么呢?再用这个再做一个二级的,那就不太好了,就不太,那数据就肯定倾斜了,就倾斜了,哎,那如果说你没有分区的话,那这个对吧,那他这个就会找找第一个字段,那你当然你这里做了分了,那肯定是找这个,所以他要分两次啊,所以这个时候最好是用这个指定的组件做一个哈希key,然作为一级,然在这个之下,这做part啊,这叫自研的。
97:23
听懂了吧?开始忧伤,听懂了吧?啊。好,那么今天就到这里啊,谢谢大家。
我来说两句