聊斋志异中的同性恋,麻豆最好看的女演员,魔兽剑圣异界纵横


聊斋志异中的同性恋,麻豆最好看的女演员,魔兽剑圣异界纵横
聊斋志异中的同性恋,麻豆最好看的女演员,魔兽剑圣异界纵横

原标题:HDC。Cloud2021|5分钟,教您如何设计高斯数据库数据分发策略

麻豆最好看的女演员
麻豆最好看的女演员

数据库是应用和计算机的核心组成部分。试想一下,如果没有数据库,就像人脑没有内存,信息无法共享一样,那么开发人员设计一个高效易用的数据库是非常重要的。

魔兽剑圣异界纵横
魔兽剑圣异界纵横

高斯数据库(for openGauss)是企业级分布式数据库,具有分布式一致性强、有效降低灾难恢复成本、支持PB级海量数据、智能诊断等优点。是目前最热门的主流数据库,那么如何更好的设计分布式数据库的数据分布策略呢?首先介绍GaussDB(针对openGauss)的基本架构,方便理解后面的分析。

这是一个典型的基于数据碎片的分布式体系结构(不共享任何东西)。底层数据通过哈希、列表或范围等规则分散分布到不同的数据节点。计算时,底部的多个节点参与计算。同时可以扩展数据节点,上层由协调节点分析转发。

从图中可以看出,节点主要有三种类型:协调节点、数据节点和集群节点(最重要的是全局事务管理器)。协调节点负责SQL解析和转发,作用类似代理,数据节点负责计算和数据存储,全局事务管理器负责保证全局事务的读取一致性。

分布式SQL执行过程

一般执行流程:

业务应用向协调器发送SQL,SQL可以包含对数据的CRUD操作;协调器使用数据库的优化器生成执行计划,每个DN都会根据执行计划的要求处理数据;数据基于一致的哈希算法分布在每个域名中,因此域名在数据处理过程中可能需要从其他域名获取数据。GaussDB提供三个流(广播流、聚合流、再分发流),实现DN之间的数据流;DN将结果集返回到坐标进行汇总;协调员将汇总的结果返回给业务应用程序。

数据分发策略的场景实践

以电子商城为例。一个完整的商城会包含很多信息,比如用户、产品、订单、仓库、物流、支付等等。下面以订单、付款方式、快递公司三个信息为例,在这三个信息中只列举了几个关键属性作为例子。

第一步。数据库逻辑模型的设计

第二步。作用设计

常见场景1。查看子订单列表

常见场景2。查看子订单详细信息

第三步,物理数据模型设计

电子商城日订单量巨大,传统的主备模式显然无法满足如此大量数据的需求和存储需求。然而,跨节点、水平可扩展的分布式数据库可以很好地解决大规模海量数据的计算和存储问题。高斯数据库(对于openGauss)分布式模式可以支持多达1000个节点,PB级存储,分布式事务一致性强等特点,可以很好地满足政府、交通、金融、能源等行业对互联网的需求。

在这种情况下,订单表和付款方式表代表两种类型的数据。前者与客户数量和时间正相关。中型商场日数据可能达到一百万条记录,暂记为A类数据;后者数据变化不大,往往是配置数据,暂时记录为B类数据。在功能模块中,a类数据之间以及a类和b类数据之间存在相关性。那么,在分布式数据库下,当数据分布在不同的节点上时,以上两者是否可以直接相关呢?如果可以关联,设计如何更好的满足性能要求?

对于分布式数据库,如何让以上场景得到更好的性能,关键是选择表的数据分布策略,分区、索引之类的设计和传统的单机没有太大区别。所以要回答这个问题,需要了解高斯数据库(对于openGauss)的数据分布策略。

数据分发策略

高斯数据库支持的数据分发策略

分布式存储和并发查询是MPP架构数据库的主要优势。根据适当的分布策略,将数据分散存储在多个域名实例的大数据表中,可以大大提高数据库的性能。

高斯数据库V5支持下表所示的数据分发策略:

下图可以帮助我们清楚地理解复制表和分发表。前者是每个DN上的一个完整的表,后者只是每个DN上的一个片段。

语法:

看到这里,很多人马上就会明白,配送表适合订单表和子订单表,复制表适合支付方式表和快递公司表。那么为什么呢?我们先来了解一下分布表和复制表的关联过程。

分发表和复制表关联过程

(1)分发表和复制表之间的关联查询

T1是哈希表,T2是复制表。T1表的每个部分都与每个域名上的T2表相连。每个域名上的连接结果集在域名上聚合,以生成最终的输出结果集。

(2)分发表和分发表关联查询

T1表和T3表都是分布表。在DN1实例上,T1表的p1部分与T3表的T1部分相关联。T3表的P2、p3和p4被复制到DN1,并与T1的p1相关联。DN2、DN3和DN4的示例操作与DN1相似。CN节点聚合每个DN生成的结果集,生成最终的数据结果集。

注意:细心的朋友可能会看到,不同的DNs之间可能会发生数据同步。这种情况下,执行效率会变差。下面将讨论如何避免这种情况。

分发密钥的选择

尝试选择具有更多不同值的列,以确保数据的均匀分布。均匀分布是为了避免桶效应,每台主机表现均等。尝试选择连接列或组

p 列做分布列。尽量选择Join列或group 列是为了避免数据节点之间数据流动, 提高性能。

避免数据广播

在分布表关联分布时,分布列不同时,存在Streaming(type: BROADCAST)广播,不同DN节点之间数据存在交互,会增加网络开销,而分布列相同或关联复制表数据时,不存在DN节点间数据交互。下面我们进行下实际测试:

例如对于表t1,t2,我们使用不同的分片列进行关联:select * from t1, t2 where t1.a = t2.b;

方式1:t1、t2都选择a做分布列

create table t1 (a int, b int) distribute by hash (a);

create table t2 (a int, b int) distribute by hash (a);

其执行计划如下:

方式2:将a作为t1的分布列,将b作为t2的分布列:

create table t1 (a int, b int) distribute by hash (a);

create table t2 (a int, b int) distribute by hash (b);

重新查看执行计划如下:

分析:方式1由于存在“Streaming”,导致Datanode之间存在较大通信数据量。

避免数据倾斜

判断是否已发生数据倾斜现象

SELECT a.count,b.node_name FROM (SELECT count(*) AS count,xc_node_id FROM tablename GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count DESC;

如果各DN内元组数目相差较大(如相差数倍、数十倍),则表明已发生数据倾斜现象,请按照下面原则调整分布列。

重新选择分布列,重新建表

当前不支持通过ALTER TABLE语句调整分布列,因此,调整分布列时需要重新建表。

选择原则如下: 分布列的列值应比较离散,以便数据能够均分布到各个DN。

例如,考虑选择表的主键为分布列,如在人员信息表中选择身份证号码为分布列。 在满足上面原则的情况下,考虑选择查询中的连接条件为分布列,以便Join任务能够下推到DN中执行,且减少DN之间的通信数据量。

总结

GaussDB(for openGauss)是分布式架构,数据分布在各个DN上,设计好的数据分布策略是分布式数据库设计中最关键的环节。本文结合电子商城场景讲述了支持的数据分布策略、分布键的选择以及关联过程,还讲述了应该规避的问题。理解了以上这些内容后,相信你可以结合自己的业务场景,设计出最佳的数据分布策略。

分享到