华为云用户手册

  • pgxc_get_small_cu_info(rel_name text, row_count int) 描述:该函数用于获取目标表的小CU信息。其中第二个参数row_count 为可选参数,表示小CU的阈值,存活元组数小于这个值的就会被认为是小CU,默认值200。该函数仅8.2.1.300及以上集群版本支持。 返回值类型:record 返回值: node_name:DN节点名。 part_name:分区名,非分区表此列为空。 zero_cu_count:0CU的数量。当一个CU中的所有数据都被删除时,称之为0 CU。 small_cu_count:小CU数量。当一个CU中有存活数据且存活数量小于阈值时,称之为小CU。 total_cu_count:总的CU的数量。 sec_part_cu_num:每个二级分区的CU数量。当secondary_part_column被指定时,该列才会显示。该字段仅8.3.0及以上集群版本支持。 需要注意的是,这里的CU是跨列的概念,并非一列一个的CU。 示例: 1 2 3 4 5 6 SELECT * FROM pgxc_get_small_cu_info('hs'); node_name | part_name | zero_cu_count | small_cu_count | total_cu_count | sec_part_cu_num -----------+-----------+---------------+----------------+----------------+------------------------------------------ datanode1 | | 0 | 4 | 4 | p1:1 p2:0 p3:1 p4:0 p5:1 p6:0 p7:1 p8:0 datanode2 | | 0 | 4 | 4 | p1:0 p2:1 p3:0 p4:1 p5:0 p6:1 p7:0 p8:1 (2 rows)
  • pgxc_get_hstore_delta_info(rel_name text) 描述:该函数用于获取目标表的delta表信息,包括delta表的大小,insert/delete/update各种类型记录的数量等。该函数仅8.2.1.100及以上集群版本支持。 返回值类型:record 返回值: node_name:DN节点名。 part_name:分区名,非分区表此列为non partition table。 live_tup:存活的元组数量。 n_ui_type:type 是 ui (小cu合并和upsert走update插入) 的记录的数量。一条ui记录表示一次插入,可以是单插或者批插。该参数仅8.3.0.100及以上版本支持。 n_i_type:type 是 i (insert) 的记录的数量。一条i记录表示一次插入,可以是单插或者批插。 n_d_type:type 是 d (delete) 的记录的数量。一条d记录表示一次删除,可以是单条删或者批量删除。 n_x_type:type 是 x (由update产生的delete) 记录的数量。 n_u_type:type 是 u (轻量化update) 的记录数量。 n_m_type:type 是 m (merge) 的记录数量。 data_size:delta表的总大小(包括delta上的索引与toast数据的大小)。 示例: 1 2 3 4 5 6 7 SELECT * FROM pgxc_get_hstore_delta_info('hs_part'); node_name | part_name | live_tup | n_ui_type | n_i_type | n_d_type | n_x_type | n_u_type | n_m_type | data_size -----------+-----------+----------+-----------+----------+----------+----------+----------+----------+----------- dn_1 | p1 | 2 | 0 | 2 | 0 | 0 | 0 | 0 | 8192 dn_1 | p2 | 2 | 0 | 2 | 0 | 0 | 0 | 0 | 8192 dn_1 | p3 | 2 | 0 | 2 | 0 | 0 | 0 | 0 | 8192 (3 rows)
  • 数据保护技术 代码检查通过多种数据保护手段和特性,保障数据安全可靠。 数据保护手段 简要说明 详细介绍 传输加密(HTTPS) 为保证数据传输的安全性,代码检查使用HTTPS传输数据。 构造请求 个人数据保护 通过控制个人数据访问权限以及记录操作日志等方法防止个人数据泄露,保证您的个人数据安全。 权限控制 隐私数据保护 代码检查不消费、不存储用户数据。 - 数据销毁 用户主动删除业务数据或销户的情况下: 非关键数据会实时物理删除。 关键数据会被标记软删除后,7天再后物理删除。 - 父主题: 安全
  • 增删CN 增删CN属于DWS数据库实例收缩操作,可以扩展和收缩数据库CN实例。 CN全称协调节点(Coordinator Node)是和用户关系最密切也是DWS内部非常重要的一个组件,它负责提供外部应用接口、优化全局执行计划、向Datanode分发执行计划,以及汇总、处理执行结果。 CN是外部应用的接口,CN的并发能力直接决定了业务的并发度。因此可以通过增加CN来扩展分布式能力,提升业务并发度。 同时由于CN是多主多活架构,为了保证数据一致性,如果部分CN数据损坏,DDL业务将受到阻塞,可以通过删除故障CN来快速恢复DDL业务。 DWS标准数仓、实时数仓支持增删CN功能,在8.1.1及以后版本支持。 增加CN过程中会同步元数据,因此增加CN耗时和元数据数量正相关,8.1.3版本支持在线增删CN,增加CN过程中DWS服务不重启,持续对外提供服务,DDL业务会短暂阻塞(不报错),其余业务不受影响。 图8 增删CN
  • 功能对比 以上各种弹性伸缩功能的对比如下。 表2 功能对比 功能 伸缩对象 伸缩范围 业务影响 试用范围 弹性磁盘扩容 磁盘容量调整。 原集群的所有E CS 挂载的EVS盘。 通常会在5-10分钟内完成,也不涉及服务重启,不影响业务,但建议业务低峰期进行。 集群版本:8.1.1.203及以后 产品形态:标准数仓、实时数仓 弹性变更规格 算力调整。 原集群的所有ECS规格(CPU核数,内存大小)。 通常会在5-10分钟内完成,但是过程中会重启一次,涉及业务分钟级别中断,建议业务低峰期进行。 集群版本:8.1.1.300及以后 产品形态:标准数仓、实时数仓 集群扩容 磁盘容量调整、算力调整。 分布式架构扩展对等同构的ECS节点。 支持在线,在线扩容过程中,DWS服务不重启,持续对外提供服务。 耗时与用户的数据库对象数量和数据量正相关。 集群版本:所有版本,8.1.1开始支持在线 产品形态:标准数仓、实时数仓 集群缩容 磁盘容量调整、算力调整。 分布式架构收缩部分ECS节点。 支持在线,在线缩容过程中,DWS服务不重启,持续对外提供服务。 耗时与用户的数据库对象数量和数据量正相关。 集群版本:8.1.1.300 产品形态:标准数仓、实时数仓 集群调整大小 磁盘容量调整、算力调整、集群拓扑结构。 使用新规格(硬件规格调整),新拓扑(集群规模调整)新建集群,再做新老集群数据重分布。 数据库只读,耗时与用户的数据库对象数量和数据量正相关。 集群版本:agent8.2.0.2及以后版本 产品形态:标准数仓 增删CN 数据库CN实例。 增加CN扩展业务并发度提升,删除CN快速恢复DDL业务。 支持在线,增删CN过程中,DWS服务不重启,持续对外提供服务。 集群版本:8.1.1版本,8.1.3开始支持在线 产品形态:标准数仓、实时数仓
  • 弹性伸缩应用场景 不同的弹性伸缩功能应用在不同的业务场景下,具体参见表3。 表3 应用场景 分类 弹性伸缩诉求 推荐弹性伸缩方式 业务影响评估 预估耗时评估 存储 存储空间不够, CPU,内存,磁盘IO非瓶颈。 磁盘扩容。 在线。 不涉及数据搬迁,5-10分钟。 存储空间太大,降本 CPU,内存,磁盘IO非瓶颈。 创建同规格、小存储容量集群,通过容灾方式把主集群迁移到备集群。 容灾切换过程中集群只读,一般30分钟内。 耗时与数据量正相关。 算力 CPU或内存存在瓶颈。 弹性规格变更。 重启一次集群。 不涉及数据搬迁,5-10分钟。 磁盘IO存在瓶颈。 创建同规格、小存储容量集群,通过容灾方式把主集群迁移到备集群。 容灾切换过程中集群只读,一般30分钟内。 耗时与数据量正相关。 分布式算力 & 存储 节点数不足导致分布式能力弱。 集群扩容。 在线(部分限制)。 涉及数据搬迁,耗时和数据量与元数量正相关。 节点数多导致成本高。 集群缩容。 在线(部分限制)。 涉及数据搬迁,耗时和数据量正相关。 拓扑结构 同时修改拓扑和规格诉求(DN数不一致)。 调整集群大小。 只读。 涉及数据搬迁,耗时和数据量与元数量正相关。 同时修改拓扑和规格诉求(DN数一致)。 集群容灾迁移。 在线(部分限制)。 涉及数据搬迁,耗时和数据量正相关。 并发度不够。 增删CN。 在线(部分限制)。 涉及数据搬迁,耗时和元数据量正相关。
  • 集群调整大小 集群调整大小也叫集群resize,是一个非常全面的功能,它能满足你所有的弹性伸缩需求,它既支持集群规模的Scale out、Scale in,也支持硬件规格的Scale up,Scale down,同时支持集群拓扑结构的重组。 DWS resize基于多nodegroup和数据重分布实现,resize过程中会按照新的资源诉求(硬件升降配)和集群规划(集群规模扩缩)部署一套新集群,然后和老集群做数据重分布,数据迁移完成后,会把业务迁移到新集群,然后释放老集群。 集群resize涉及数据搬迁,会把老集群节点上的数据重分布到新集群节点上(老集群节点上数据还在),因此集群resize耗时与用户的数据库对象数量和数据量正相关。 DWS标准数仓支持集群resize功能,需agent升级到8.2.0.2版本后支持。目前resize期间老集群只支持只读业务。后续会提供在线能力。 具体操作参见经典变更规格。 图9 集群调整大小
  • 弹性磁盘扩容 弹性磁盘扩容是指调整当前集群的所有的ECS节点上挂载的所有EVS磁盘大小,主要针对需要快速调整磁盘扩容的需求。 仅支持磁盘扩容,不支持缩容。 磁盘扩容是轻量级操作,不涉及数据搬迁,通常会在5-10分钟内完成,也不涉及服务重启,不影响业务,建议选择在业务低峰期进行存储扩容。 弹性磁盘扩容支持 GaussDB (DWS)标准数仓,实时数仓的EVS盘规格。集群版本在8.1.1.203及以后版本支持。 具体操作参见EVS集群磁盘扩容。 图3 弹性磁盘扩容
  • 集群扩容 集群扩容是分布式MPPDB架构横向扩展的典型场景,通过添加对等同构的节点到当前集群来完成集群规模横向扩展的能力。DWS 2.0属于存算一体架构,因此集群扩容同时扩容了计算能力和存储能力。 为了扩容后集群内各节点负载均衡,性能最优,集群扩容会进行元数据复制和数据重分布,把数据重新均匀分布到新节点,因此集群扩容耗时与用户的数据库对象数量和数据量正相关。同时为了架构可靠性,新扩容的节点会自动组织成环,因此每次扩容至少扩容3个节点。 图5 集群扩容 8.1.1版本以后支持了在线扩容。在线扩容过程中,DWS服务不重启,持续对外提供服务。表重分布期间用户可以对该表执行插入、更新、删除,但重分布过程仍然会短时间阻塞用户的数据更新操作,会影响用户语句的执行性能。扩容重分布过程会消耗大量的CPU和IO资源,因此会对用户作业性能影响较大,用户应该尽可能在停止业务或业务轻载的情况下执行扩容重分布。用户也可以考虑分段扩容重分布策略,在系统负载很小的情况下采用高并发进行扩容重分布,在系统负载大的情况下停止扩容重分布或采用低并发进行扩容重分布。 集群扩容分为分段扩容和一键式扩容两种操作方式。 分段扩容把扩容操作分成添加主机,扩容,数据重分布三个阶段,用户可分段操作,把变更风险和业务影响降低到最低。 直接扩容是一键式操作,用户操作便捷度更高。 表1 扩容方式对比 扩容方式 特点 业务影响 分段扩容 把扩容操作分成添加主机,扩容,数据重分布三个阶段,用户可分段操作。 把变更风险和业务影响降低到最低。 一键式扩容 一键式操作,自动做DWS主机发放,扩容添加节点和数据重分布。 用户操作便捷度更高。
  • 弹性变更规格 弹性规格变更是指调整当前集群的节点规格,主要针对CPU、内存两种资源的变更。适用于需要快速调整CPU以及内存规格的需求。 规格是指不同数量的CPU和内存的一种组合,例如:dwsx.16xlarge(CPU:64 Memory:512G )。 弹性规格变更是轻量级操作,不涉及数据搬迁,通常会在5-10分钟内完成,但是过程中会重启一次,涉及业务分钟级别中断,建议选择在业务低峰期进行。 弹性规格变更支持GaussDB(DWS)标准数仓、实时数仓的EVS规格。集群版本在8.1.1.300及以后版本支持。 具体操作参见弹性变更规格。 图4 弹性变更规格
  • 集群拓扑详解 要想充分理解DWS的弹性伸缩能力,首先需要了解DWS的集群拓扑结构。如下是DWS的简单的ECS+EVS部署结构: ECS提供计算资源,包括CPU、内存配置,DWS数据库实例(CN、DN等)都部署在ECS上。 EVS提供存储资源,每个DN都会挂载一块EVS云盘。 而组成DWS集群的所有ECS节点都部署在同一个VPC内部,提供高速网络通道。 部署在ECS上的所有数据库实例逻辑上组成一个分布式的MPPDB架构集群,对外提供数据分析处理能力。 图1 集群拓扑
  • DWS集群安全环 集群扩容和缩容都和安全环相关,安全环是指DN多副本横向部署的最小主机集合。安全环主要作用是故障隔离。环内主机出现故障,故障不会扩散到环外。 DWS属于主备从架构,因此最小安全环节点数为3个节点。环内出现故障时,对环外无影响,对整个集群的影响的节点范围最小(3节点),对环内每个节点的影响为1/(N-1),即1/2。极端场景下整个集群是一个安全环。环内出现故障,对整个集群的影响的节点范围最大(整个集群),对环内每个节点的影响最小,为1/(N-1)。 一种常见的做法是N+1成环,每个节点把他的N个备机均匀分散部署到环内的其余N个节点上。环内出现故障时,对整个集群的影响的节点范围为N+1,对环内每个节点的影响为1/N。 图6 典型N+1安全环
  • 集群缩容 相对于集群扩容,集群缩容是分布式MPPDB架构横向收缩的典型场景,通过缩减当前集群部分节点来完成收缩集群规模的能力。集群缩容会同时收缩计算能力和存储能力。 DWS集群物理上由多个ECS节点组合,而为了提升架构可靠性,多个ECS节点(一般3个)又会组成一个逻辑安全环,多个安全环就组成了DWS集群。而缩容则是以安全环为单位缩减,优先缩容集群尾部的安全环。 集群缩容涉及数据搬迁,会把被缩减节点上的数据重分布到剩余节点上,因此缩容耗时与用户的数据库对象数量和数据量正相关。 集群缩容支持GaussDB(DWS)标准数仓、实时数仓,在线缩容在8.1.1.300版本开始支持,在线缩容过程中,DWS服务不重启,持续对外提供服务。表重分布期间用户可以对该表执行插入、更新、删除,但重分布过程仍然会短时间阻塞用户的数据更新操作,会影响用户语句的执行性能。缩容重分布过程会消耗大量的CPU和IO资源,因此会对用户作业性能影响较大,用户应该尽可能在停止业务情况下或业务轻载的情况下执行缩容重分布。 图7 集群缩容
  • 支持区域 当前已上传OBS数据的区域如表1所示。 表1 区域和OBS桶名 区域 OBS桶名 华北-北京一 dws-demo-cn-north-1 华北-北京二 dws-demo-cn-north-2 华北-北京四 dws-demo-cn-north-4 华北-乌兰察布一 dws-demo-cn-north-9 华东-上海一 dws-demo-cn-east-3 华东-上海二 dws-demo-cn-east-2 华南-广州 dws-demo-cn-south-1 华南-广州友好 dws-demo-cn-south-4 中国-香港 dws-demo-ap-southeast-1 亚太-新加坡 dws-demo-ap-southeast-3 亚太-曼谷 dws-demo-ap-southeast-2 拉美-圣地亚哥 dws-demo-la-south-2 非洲-约翰内斯堡 dws-demo-af-south-1 拉美-墨西哥城一 dws-demo-na-mexico-1 拉美-墨西哥城二 dws-demo-la-north-2 莫斯科二 dws-demo-ru-northwest-2 拉美-圣保罗一 dws-demo-sa-brazil-1
  • 步骤四:车辆分析 执行ANALYZE。 用于收集与数据库中普通表内容相关的统计信息,统计结果存储在系统表PG_STATISTIC中。执行计划生成器会使用这些统计数据,以生成最有效的查询执行计划。 执行以下语句生成表统计信息: 1 ANALYZE; 查询数据表中的数据量。 执行如下语句,可以查看已加载的数据条数。 1 2 SET current_schema= traffic_data; SELECT count(*) FROM traffic_data.gcjl; 车辆精确查询。 执行以下语句,指定车牌号码和时间段查询车辆行驶路线。GaussDB(DWS)在应对点查时秒级响应。 1 2 3 4 5 6 SET current_schema= traffic_data; SELECT hphm, kkbh, gcsj FROM traffic_data.gcjl where hphm = 'YD38641' and gcsj between '2016-01-06' and '2016-01-07' order by gcsj desc; 车辆模糊查询。 执行以下语句,指定车牌号码和时间段查询车辆行驶路线,GaussDB(DWS) 在应对模糊查询时秒级响应。 1 2 3 4 5 6 7 SET current_schema= traffic_data; SELECT hphm, kkbh, gcsj FROM traffic_data.gcjl where hphm like 'YA23F%' and kkbh in('508', '1125', '2120') and gcsj between '2016-01-01' and '2016-01-07' order by hphm,gcsj desc;
  • 查看冷热表数据分布 查看单表数据分布情况。 1 2 3 4 5 6 7 SELECT * FROM pg_catalog.pg_lifecycle_table_data_distribute('lifecycle_table'); schemaname | tablename | nodename | hotpartition | coldpartition | switchablepartition | hotdatasize | colddatasize | switchabledatasize ------------+-----------------+--------------+--------------+---------------+---------------------+-------------+--------------+-------------------- public | lifecycle_table | dn_6001_6002 | p1,p2,p3,p8 | | | 96 KB | 0 bytes | 0 bytes public | lifecycle_table | dn_6003_6004 | p1,p2,p3,p8 | | | 96 KB | 0 bytes | 0 bytes public | lifecycle_table | dn_6005_6006 | p1,p2,p3,p8 | | | 96 KB | 0 bytes | 0 bytes (3 rows) 查看所有冷热表数据分布情况。 1 2 3 4 5 6 7 SELECT * FROM pg_catalog.pg_lifecycle_node_data_distribute(); schemaname | tablename | nodename | hotpartition | coldpartition | switchablepartition | hotdatasize | colddatasize | switchabledatasize ------------+-----------------+--------------+--------------+---------------+---------------------+-------------+--------------+-------------------- public | lifecycle_table | dn_6001_6002 | p1,p2,p3,p8 | | | 98304 | 0 | 0 public | lifecycle_table | dn_6003_6004 | p1,p2,p3,p8 | | | 98304 | 0 | 0 public | lifecycle_table | dn_6005_6006 | p1,p2,p3,p8 | | | 98304 | 0 | 0 (3 rows)
  • 冷热数据切换 将热分区数据切换成冷分区数据。 自动切换:每日0点调度框架自动触发,无需关注切换情况。 可使用函数pg_obs_cold_refresh_time(table_name, time)自定义自动切换时间。例如,根据业务情况调整自动触发时间为每天早晨6点30分。 1 2 3 4 5 SELECT * FROM pg_obs_cold_refresh_time('lifecycle_table', '06:30:00'); pg_obs_cold_refresh_time -------------------------- SUC CES S (1 row) 手动切换。 使用ALTER TABLE语句手动切换单表: 1 2 ALTER TABLE lifecycle_table refresh storage; ALTER TABLE 使用函数pg_refresh_storage()批量切换所有冷热表: 1 2 3 4 5 SELECT pg_catalog.pg_refresh_storage(); pg_refresh_storage -------------------- (1,0) (1 row)
  • 场景介绍 海量大数据场景下,随着业务和数据量的不断增长,数据存储与消耗的资源也日益增长。根据业务系统中用户对不同时期数据的不同使用需求,对膨胀的数据进行“冷热”分级管理,不仅可以提高数据分析性能还能降低业务成本。针对数据使用的一些场景,可以将数据按照时间分为:热数据、冷数据。 冷热数据主要从数据访问频率、更新频率进行划分。 Hot(热数据):访问、更新频率较高,对访问的响应时间要求很高的数据。 Cold(冷数据):不允许更新或更新访问频率较低,对访问的响应时间要求不高的数据。 用户可以定义冷热管理表,将符合规则的冷数据切换至OBS上进行存储,可以按照分区自动进行冷热数据的判断和迁移。 图1 冷热数据管理 GaussDB(DWS)列存数据写入时,数据首先进入热分区进行存储,分区数据较多后,可通过手动或自动的方式,将符合冷数据规则的数据切换至OBS上进行存储。在数据切换至OBS上后,其元数据、Desc表信息以及索引信息仍在本地进行存储,保证了读取的性能。 冷热切换的策略名称支持LMT(last modify time)和HPN(hot partition number),LMT指按分区的最后更新时间切换,HPN指保留热分区的个数切换。 LMT:表示切换[day]时间前修改的热分区数据为冷分区,将该数据迁至OBS表空间中。其中[day]为整型,范围[0, 36500],单位为天。 如下图中,设置day为2,即在冷热切换时,根据分区数据的最晚修改时间,保留2日内所修改的分区为热分区,其余数据为冷分区数据。假设当前时间为4月30日,4月30日对[4-26]分区进行了delete操作,4月29日对[4-27]分区进行了insert操作,故在冷热切换时,保留[4-26][4-27][4-29][4-30]四个分区为热分区。 HPN:表示保留HPN个有数据的分区为热分区。分区顺序按照分区的Sequence ID来确定,分区的Sequence ID是根据分区边界值的大小,内置生成的序号,此序号不对外呈现。对于RANGE分区,分区的边界值越大,分区对应的Sequence ID越大;对于LIST分区,分区边界枚举值中的最大值越大,分区对应的Sequence ID越大。在冷热切换时,需要将数据迁移至OBS表空间中。其中HPN为整型,范围为[0,1600]。其中HPN为0时,表示不保留热分区,在进行冷热切换时,将所有有数据的分区都转为冷分区并存储在OBS上。 如下图中,设置HPN为3,即在冷热切换时,保留最新的3个有数据的分区为热分区数据,其余分区均切为冷分区。
  • 约束限制 支持对冷热表的insert、copy、delete、update、select等表相关的DML操作。 支持对冷热表的权限管理等DCL操作。 支持对冷热表进行analyze、vacuum、merge into等操作和一些分区的操作。 支持从普通列存分区表升级为冷热数据表。 支持带有冷热数据管理表的升级、扩容、缩容和重分布。 8.3.0及以上版本支持冷热分区互相转换,8.3.0版本之前仅支持从热数据切换为冷数据。 对于同时存在冷热分区的表,查询时会变慢,因为冷数据存储在OBS上,读写速度和时延都比在本地查询要慢。 目前冷热表只支持列存2.0版本的分区表,外表不支持冷热分区。 只支持修改冷热表的冷热切换策略,不支持修改冷热表的冷数据的表空间。 冷热表的分区操作约束: 不支持对冷分区的数据进行exchange操作。 Merge partition分区只支持热分区和热分区合并、冷分区和冷分区合并,不支持冷热分区合并。 ADD/Merge/Split Partition等分区操作不支持指定表空间为OBS表空间。 不支持创建时指定和修改冷热表分区的表空间。 冷热切换不是只要满足条件就立刻进行冷热数据切换,依赖用户手动调用切换命令,或者通过调度器调用切换命令后才真正进行数据切换。目前自动调度时间为每日0点,可进行修改。 冷热数据表不支持物理细粒度备份和恢复,由于物理备份时只备份热数据,在备份恢复前后OBS上冷数据为同一份,不支持truncate和drop table等涉及删除文件操作语句的备份恢复操作。
  • 创建冷热表 创建列存冷热数据管理表lifecycle_table,指定热数据有效期LMT为100天。 1 2 3 4 5 6 7 8 9 CREATE TABLE lifecycle_table(i int, val text) WITH (ORIENTATION = COLUMN, storage_policy = 'LMT:100') PARTITION BY RANGE (i) ( PARTITION P1 VALUES LESS THAN(5), PARTITION P2 VALUES LESS THAN(10), PARTITION P3 VALUES LESS THAN(15), PARTITION P8 VALUES LESS THAN(MAXVALUE) ) ENABLE ROW MOVEMENT;
  • 调优后表的评估 加载时间减少了24.7%。 分布方式对加载的影响明显,Hash分布方式提升加载效率,Replication分布方式会降低加载效率。在CPU和I/O均充足的情况下,压缩级别对加载效率影响不大。通常,列存表的加载效率比行存要高。 存储占用减少了64.3%。 压缩级别、列存和Hash分布均能够节省存储空间。Replication表会明显加大存储占用,但是可以减小网络开销。通过对小表采用Replication方式,是使用小量空间换取性能的正向做法。 查询性能(速度)提升了54.4%,即查询时间减少了54.4%。 查询性能方面的提升源于对存储方式、分布方式和分布列的优化。在多字段表,统计分析类查询场景下,列存可以提升查询性能。对于Hash分布表,在读/写数据时可以利用各个节点的IO资源,提升表的读/写速度。 重写查询和配置工作负载管理 (WLM) 通常可进一步提升查询性能。有关更多信息,请参阅优化查询性能概述。 基于调优表实践的具体步骤,您可以进一步应用“基于表结构设计和调优提升GaussDB(DWS)查询性能”中的优秀实践方法来改进表的分配,以达到您所期望的数据加载、存储和查询方面的效果。
  • 清除资源 在完成本次实践之后,应删除集群。 如果需要保留集群,删除SS表,请执行以下命令。 1 2 3 4 5 6 7 8 9 10 11 DROP TABLE store_sales; DROP TABLE date_dim; DROP TABLE store; DROP TABLE item; DROP TABLE time_dim; DROP TABLE promotion; DROP TABLE customer_demographics; DROP TABLE customer_address; DROP TABLE household_demographics; DROP TABLE customer; DROP TABLE income_band;
  • 通过外表导入远端DWS数据 参见7在ECS上连接第二套集群,其中连接地址改为第二套集群的地址,本例为192.168.0.86。 创建普通用户jim,并赋予创建外表和server的权限。FOREIGN DATA WRAPPER固定为gc_fdw。 1 2 3 CREATE USER jim WITH PASSWORD 'password'; ALTER USER jim USEFT; GRANT ALL ON FOREIGN DATA WRAPPER gc_fdw TO jim; 切换到jim用户,创建server。 1 2 3 4 5 6 7 SET ROLE jim PASSWORD 'password'; CREATE SERVER server_remote FOREIGN DATA WRAPPER gc_fdw OPTIONS (address '192.168.0.8:8000,192.168.0.158:8000' , dbname 'gaussdb', username 'leo', password 'password' ); address:第一套集群的两个内网IP和端口,参见6获取,本例为192.168.0.8:8000,192.168.0.158:8000。 dbname:连接的第一套集群的数据库名,本例为gaussdb。 username:连接的第一套集群的用户名,本例为leo。 password:用户名密码。 创建外表。 外表的字段和约束,必须与待访问表的字段和约束保持一致。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 CREATE FOREIGN TABLE region ( product_price integer , product_id char(30) , product_time date , product_level char(10) , product_name varchar(200) , product_type1 varchar(20) , product_type2 char(10) , product_monthly_sales_cnt integer , product_comment_time date , product_comment_num integer , product_comment_content varchar(200) ) SERVER server_remote OPTIONS ( schema_name 'leo', table_name 'product_info', encoding 'utf8' ); SERVER:上一步创建的server的名称,本例为server_remote。 schema_name:待访问的第一套集群的schema名称,本例为leo。 table_name:待访问的第一套集群的表名,参见10获取,本例为product_info。 encoding:保持与第一套集群的数据库编码一致,参见9获取,本例为utf8。 查看创建的server和外表。 1 2 \des+ server_remote \d+ region 创建本地表。 表的字段和约束,必须与待访问表的字段和约束保持一致。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CREATE TABLE local_region ( product_price integer not null, product_id char(30) not null, product_time date , product_level char(10) , product_name varchar(200) , product_type1 varchar(20) , product_type2 char(10) , product_monthly_sales_cnt integer , product_comment_time date , product_comment_num integer , product_comment_content varchar(200) ) WITH ( orientation = column, compression=middle ) DISTRIBUTE BY hash (product_id); 通过外表导入数据到本地表。 1 2 INSERT INTO local_region SELECT * FROM region; SELECT * FROM local_region; 您也可以直接查询外表而无需将数据导入。 1 SELECT * FROM region;
  • 使用GDS导入数据源 使用root账户登录ECS,使用文件传输工具将7下载好的工具包上传到/opt目录下。 在/opt目录下解压工具包。 cd /opt unzip dws_client_8.1.x_redhat_x64.zip 创建GDS用户,并修改数据源目录和GDS目录的属主。 groupadd gdsgrp useradd -g gdsgrp gds_user chown -R gds_user:gdsgrp /opt/gds chown -R gds_user:gdsgrp /input_data 切换到gds_user用户。 su - gds_user 导入GDS环境变量。 仅8.1.x及以上版本需要执行,低版本请跳过。 cd /opt/gds/bin source gds_env 启动GDS。 /opt/gds/bin/gds -d /input_data/ -p 192.168.0.90:5000 -H 192.168.0.0/24 -l /opt/gds/gds_log.txt -D -d dir:保存有待导入数据的数据文件所在目录。本教程中为“/input_data/”。 -p ip:port:GDS监听IP和监听端口。配置为GDS所在的ECS的内网IP,可与DWS通讯,本例为192.168.0.90:5000。 -H address_string:允许哪些主机连接和使用GDS服务。参数需为CIDR格式。本例设置为DWS的内网IP所在的网段即可。 -l log_file:存放GDS的日志文件路径及文件名。本教程为“/opt/gds/gds_log.txt”。 -D:后台运行GDS。 使用gsql连接第一套DWS集群。 执行exit切换root用户,进入ECS的/opt目录,导入gsql的环境变量。 exit cd /opt source gsql_env.sh 进入/opt/bin目录,使用gsql连接第一套DWS集群。 cd /opt/bin gsql -d gaussdb -h 192.168.0.8 -p 8000 -U dbadmin -W password -r -d: 连接的数据库名,本例为默认数据库gaussdb。 -h:连接的DWS内网IP,即6查询到的内网IP,本例为192.168.0.8。 -p:DWS端口,固定为8000。 -U:数据库管理员用户,默认为dbadmin。 -W:管理员用户的密码,为3创建集群时设置的密码,本例password为用户创建集群设置的密码。 创建普通用户leo,并赋予创建外表的权限。 1 2 CREATE USER leo WITH PASSWORD 'password'; ALTER USER leo USEFT; 切换到leo用户,创建GDS外表。 以下LOCATION参数请填写为6的GDS的监听IP和端口,后面加上/*,例如:gsfs://192.168.0.90:5000/* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 SET ROLE leo PASSWORD 'password'; DROP FOREIGN TABLE IF EXISTS product_info_ext; CREATE FOREIGN TABLE product_info_ext ( product_price integer not null, product_id char(30) not null, product_time date , product_level char(10) , product_name varchar(200) , product_type1 varchar(20) , product_type2 char(10) , product_monthly_sales_cnt integer , product_comment_time date , product_comment_num integer , product_comment_content varchar(200) ) SERVER gsmpp_server OPTIONS( LOCATION 'gsfs://192.168.0.90:5000/*', FORMAT 'CSV' , DELIMITER ',', ENCODING 'utf8', HEADER 'false', FILL_MISSING_FIELDS 'true', IGNORE_EXTRA_DATA 'true' ) READ ONLY LOG INTO product_info_err PER NODE REJECT LIMIT 'unlimited'; 创建本地表。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 DROP TABLE IF EXISTS product_info; CREATE TABLE product_info ( product_price integer not null, product_id char(30) not null, product_time date , product_level char(10) , product_name varchar(200) , product_type1 varchar(20) , product_type2 char(10) , product_monthly_sales_cnt integer , product_comment_time date , product_comment_num integer , product_comment_content varchar(200) ) WITH ( orientation = column, compression=middle ) DISTRIBUTE BY hash (product_id); 从GDS外表导入数据并查询,数据导入成功。 1 2 INSERT INTO product_info SELECT * FROM product_info_ext ; SELECT count(*) FROM product_info;
  • 准备源数据 在本地PC指定目录下,创建以下3个.csv格式的文件,数据样例如下。 数据文件“product_info0.csv” 1 2 3 4 5 100,XHDK-A,2017-09-01,A,2017 Shirt Women,red,M,328,2017-09-04,715,good! 205,KDKE-B,2017-09-01,A,2017 T-shirt Women,pink,L,584,2017-09-05,40,very good! 300,JODL-X,2017-09-01,A,2017 T-shirt men,red,XL,15,2017-09-03,502,Bad. 310,QQPX-R,2017-09-02,B,2017 jacket women,red,L,411,2017-09-05,436,It's nice. 150,ABEF-C,2017-09-03,B,2017 Jeans Women,blue,M,123,2017-09-06,120,good. 数据文件“product_info1.csv” 1 2 3 4 5 200,BCQP-E,2017-09-04,B,2017 casual pants men,black,L,997,2017-09-10,301,good quality. 250,EABE-D,2017-09-10,A,2017 dress women,black,S,841,2017-09-15,299,This dress fits well. 108,CDXK-F,2017-09-11,A,2017 dress women,red,M,85,2017-09-14,22,It's really amazing to buy. 450,MMCE-H,2017-09-11,A,2017 jacket women,white,M,114,2017-09-14,22,very good. 260,OCDA-G,2017-09-12,B,2017 woolen coat women,red,L,2004,2017-09-15,826,Very comfortable. 数据文件“product_info2.csv” 1 2 3 4 5 6 7 8 9 10 980,"ZKDS-J",2017-09-13,"B","2017 Women's Cotton Clothing","red","M",112,,, 98,"FKQB-I",2017-09-15,"B","2017 new shoes men","red","M",4345,2017-09-18,5473 50,"DMQY-K",2017-09-21,"A","2017 pants men","red","37",28,2017-09-25,58,"good","good","good" 80,"GKLW-l",2017-09-22,"A","2017 Jeans Men","red","39",58,2017-09-25,72,"Very comfortable." 30,"HWEC-L",2017-09-23,"A","2017 shoes women","red","M",403,2017-09-26,607,"good!" 40,"IQPD-M",2017-09-24,"B","2017 new pants Women","red","M",35,2017-09-27,52,"very good." 50,"LPEC-N",2017-09-25,"B","2017 dress Women","red","M",29,2017-09-28,47,"not good at all." 60,"NQAB-O",2017-09-26,"B","2017 jacket women","red","S",69,2017-09-29,70,"It's beautiful." 70,"HWNB-P",2017-09-27,"B","2017 jacket women","red","L",30,2017-09-30,55,"I like it so much" 80,"JKHU-Q",2017-09-29,"C","2017 T-shirt","red","M",90,2017-10-02,82,"very good." 使用root账户登录已创建好的ECS,执行以下命令创建数据源文件目录。 mkdir -p /input_data 使用文件传输工具,将以上数据文档上传到ECS的/input_data目录下。
  • 约束限制 在使用分区管理功能时,需要满足如下约束: 不支持在小型机、加速集群、单机集群上使用。 支持在8.1.3及以上集群版本中使用。 仅支持行存范围分区表、列存范围分区表、时序表以及冷热表。 分区键唯一且类型仅支持timestamp、timestamptz、date类型。 不支持存在maxvalue分区。 (nowTime - boundaryTime) / period需要小于分区个数上限,其中nowTime为当前时间,boundaryTime为现有分区中最早的分区边界时间。 period、ttl取值范围为1hour ~ 100years。另外,在兼容Teradata或MySQL的数据库中,分区键类型为date时,period不能小于1day。 表级参数ttl不支持单独存在,必须要提前或同时设置period,并且要大于或等于period。 集群在线扩容期间,自动增加分区会失败,但是由于每次增分区时,都预留了足够的分区,所以不影响使用。
  • 分区自动管理 分区管理功能是和表级参数period、ttl绑定的,只要成功设置了表级参数period,即开启了自动创建新分区功能;成功设置了表级参数ttl,即开启了自动删除过期分区功能。第一次自动创建分区或删除分区的时间为设置period或ttl后30秒。 有如下两种开启分区管理功能的方式: 建表时指定period、ttl。 该方式适用于新建分区管理表时使用。新建分区管理表有两种语法:一种是建表时指定分区,另一种是建表时不指定分区。 建分区管理表时如果指定分区,则语法规则和建普通分区表相同,唯一的区别就是会指定表级参数period、ttl。 示例:创建分区管理表CPU1,指定分区。 1 2 3 4 5 6 7 8 9 10 CREATE TABLE CPU1( id integer, IP text, time timestamp ) with (TTL='7 days',PERIOD='1 day') partition by range(time) ( PARTITION P1 VALUES LESS THAN('2023-02-13 16:32:45'), PARTITION P2 VALUES LESS THAN('2023-02-15 16:48:12') ); 建分区管理表时可以只指定分区键不指定分区,此时将创建两个默认分区,这两个默认分区的分区时间范围均为period。其中,第一个默认分区的边界时间是大于当前时间的第一个整时/整天/整周/整月/整年的时间,具体选择哪种整点时间取决于period的最大单位;第二个默认分区的边界时间是第一个分区边界时间加period。假设当前时间是2023-02-17 16:32:45,各种情况的第一个默认分区的分区边界选择如下表: 表2 period参数说明 period period最大单位 第一个默认分区的分区边界 1hour Hour 2023-02-17 17:00:00 1day Day 2023-02-18 00:00:00 1month Month 2023-03-01 00:00:00 13months Year 2024-01-01 00:00:00 创建分区管理表CPU2,不指定分区: 1 2 3 4 5 6 CREATE TABLE CPU2( id integer, IP text, time timestamp ) with (TTL='7 days',PERIOD='1 day') partition by range(time); 使用ALTER TABLE RESET的方式设置period、ttl。 该方式适用于给一张满足分区管理约束的普通分区表增加分区管理功能。 创建普通分区表CPU3: 1 2 3 4 5 6 7 8 9 10 CREATE TABLE CPU3( id integer, IP text, time timestamp ) partition by range(time) ( PARTITION P1 VALUES LESS THAN('2023-02-14 16:32:45'), PARTITION P2 VALUES LESS THAN('2023-02-15 16:56:12') ); 同时开启自动创建和自动删除分区功能: 1 ALTER TABLE CPU3 SET (PERIOD='1 day',TTL='7 days'); 只开启自动创建分区功能: 1 ALTER TABLE CPU3 SET (PERIOD='1 day'); 只开启自动删除分区功能,如果没有提前开启自动创建分区功能,则开启失败: 1 ALTER TABLE CPU3 SET (TTL='7 days'); 通过修改period和ttl修改分区管理功能: 1 ALTER TABLE CPU3 SET (TTL='10 days',PERIOD='2 days'); 关闭分区管理功能。 使用ALTER TABLE RESET语句可以删除表级参数period、ttl,即可关闭相应的分区管理功能。 不能在存在ttl的情况下,单独删除period。 时序表不支持ALTER TABLE RESET。 同时关闭自动创建和自动删除分区功能: 1 ALTER TABLE CPU1 RESET (PERIOD,TTL); 只关闭自动删除分区功能: 1 ALTER TABLE CPU3 RESET (TTL); 只关闭自动创建分区功能,如果该表有ttl参数,则关闭失败: 1 ALTER TABLE CPU3 RESET (PERIOD);
  • 创建LakeFormation数据连接 创建LakeFormation数据连接的功能,需要联系技术支持申请开通白名单。 登录 MRS 控制台,在导航栏选择“数据连接”。 单击“新建数据连接 ”。 参考表1配置相关参数,单击“确定”完成创建。 表1 配置LakeFormation数据连接 参数 说明 类型 选择“LakeFormation”,当前仅MRS 3.3.0-LTS及之后版本支持连接该类型。 名称 数据连接的名称。 LakeFormation实例 选择LakeFormation实例名称。 该实例需要先在LakeFormation实例创建后在此处引用,具体请参考创建LakeFormation实例。单击“查看LakeFormation实例”查看已创建的实例。 虚拟私有云 需要与待对接的MRS集群在同一虚拟私有云。 子网 选择子网名称。 VPC终端节点 选择VPC终端节点,或单击“创建对应LakeFormation实例的VPC终端节点”进行创建。 选择VPC终端节点后,产生的费用将由VPCEP服务收取。 LakeFormation委托 选择“现有委托”,并选择创建对接LakeFormation权限的委托创建的委托,例如“visit_lakeformation_agency”。 图2 新建LakeFormation数据连接 创建完成后,在“数据连接”页面记录已创建数据连接的ID。
  • 创建对接ECS/BMS云服务委托 登录华为云管理控制台,选择“ 统一身份认证 服务”。 在左侧导航栏选择“委托”,单击右上角的“创建委托”,设置相关参数,单击“下一步”。 参数选择如下: 委托名称:例如“lakeformation_test” 委托类型:选择“云服务” 云服务:选择“ECS BMS” 持续时间:根据实际情况自定义 在选择策略界面右上角单击“新建策略”,配置如下信息,单击“下一步”。 策略名称:自定义 策略配置方式:选择JSON视图 策略内容:配置如下信息 { "Version": "1.1", "Statement": [ { "Action": [ "iam:agencies:assume" ], "Resource": { "uri": [ "/iam/agencies/授予给自身账号具备访问LakeFormation权限的委托ID", "/iam/agencies/授予给自身账号具备访问OBS权限的委托ID" ] }, "Effect": "Allow" } ] } 授予给自身账号具备访问LakeFormation权限的委托ID:可参考6获取。 授予给自身账号具备访问OBS权限的委托ID:可参考6获取。 选择新创建的自定义委托名称,单击“下一步”。 “设置最小授权范围”根据实际情况选择授权的资源范围,单击“确定”,创建委托完成。
  • 创建对接OBS权限的委托 登录华为云管理控制台,选择“统一身份认证服务”。 在左侧导航栏选择“委托”,单击右上角的“创建委托”,选择相关参数,单击“下一步”。 参数选择如下: 委托名称:例如“visit_obs_agency” 委托类型:选择“普通账号” 委托的账号:输入被委托的华为云账号名称 持续时间:根据实际情况自定义 在选择策略界面右上角单击“新建策略”,配置如下信息,单击“下一步”。 策略名称:例如“dev_visit_obs” 策略配置方式:JSON视图 策略内容:填入如下信息。 { "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "obs:bucket:GetBucketLocation", "obs:bucket:ListBucketMultipartUploads", "obs:object:GetObject", "obs:object:ModifyObjectMetaData", "obs:object:DeleteObject", "obs:object:ListMultipartUploadParts", "obs:bucket:HeadBucket", "obs:object:AbortMultipartUpload", "obs:bucket:ListBucket", "obs:object:PutObject" ], "Resource": [ "OBS:*:*:bucket:*", "OBS:*:*:object:*" ] } ] } Resource参数中“bucket”的参数值表示OBS桶名称,“object”的参数值表示OBS对象名称,可根据需要指定名称。配置为“*”表示对所有OBS桶或OBS对象适用此策略。 其他参数按照实际需求进行配置。 勾选新建的策略名称例如“dev_visit_obs”,单击“下一步”。 “设置最小授权范围”根据实际情况选择授权的资源范围,单击“确定”,创建委托。 在“委托”页面,将鼠标移动到新创建的委托名称上,获取具备访问OBS权限的委托ID。
共100000条