文档首页/ 数据仓库服务 GaussDB(DWS)/ 最佳实践/ 数据开发/ 使用GaussDB(DWS)分区自动管理功能降低电商和物联网行业数据分区维护成本
更新时间:2024-10-10 GMT+08:00

使用GaussDB(DWS)分区自动管理功能降低电商和物联网行业数据分区维护成本

场景介绍

对于分区列为时间的分区表,分区自动管理功能可以自动创建新分区和删除过期分区,降低分区表的维护成本,改善查询性能。为了便于查询和维护数据,用户通常使用分区列为时间的分区表来存储时间相关的数据,例如电商的订单信息、 物联网采集的实时数据。这些时间相关的数据导入分区表时,需要保证分区表要有对应时间的分区,由于普通的分区表不会自动创建新的分区和删除过期的分区,所以维护人员需要定期创建新分区和删除过期分区,提高了运维成本。

为解决上述问题,GaussDB(DWS)引入了分区自动管理特性。可通过设置表级参数period、ttl开启分区自动管理功能,使分区表可以自动创建新分区和删除过期分区,降低分区表的维护成本,改善查询性能。

period:设置自动创建分区的间隔时间,默认值为1 day,取值范围:1 hour ~ 100 years。

ttl:设置自动淘汰分区的时间,取值范围:1 hour ~ 100 years。淘汰分区的策略是通过计算nowtime - 分区boundary > ttl,满足该条件的分区将被清理掉。

  • 自动创建新分区

    分区自动管理每隔period的时间就会自动创建分区,每次创建一个或多个时间范围为period的新分区,以推进最大的分区边界时间,保证其大于nowTime+30*period。由于每次创建分区时,都动态地为未来时间创建了预留分区,所以只要有一次自动创建新分区成功,就可以保证在未来30个period的时间之内,都不会出现实时数据因为没有对应分区而导入失败的情况。

    图1 自动创建分区示意图
  • 自动删除过期分区

    边界时间早于nowTime-ttl的分区被认为是过期分区。分区自动管理每隔period的时间就会遍历检测所有分区,并删除其中的过期分区,如果所有的分区都是过期分区,则保留一个分区,并TRUNCATE该表。

约束限制

在使用分区管理功能时,需要满足如下约束:
  • 不支持在小型机、加速集群、单机集群上使用。
  • 支持在8.1.3及以上集群版本中使用。
  • 仅支持行存范围分区表、列存范围分区表、时序表以及冷热表。
  • 分区键唯一且类型仅支持timestamp、timestamptz、date类型。
  • 不支持存在maxvalue分区。
  • (nowTime - boundaryTime) / period需要小于分区个数上限,其中nowTime为当前时间,boundaryTime为现有分区中最早的分区边界时间。
  • period、ttl取值范围为1hour ~ 100years。另外,在兼容Teradata或MySQL的数据库中,分区键类型为date时,period不能小于1day。
  • 表级参数ttl不支持单独存在,必须要提前或同时设置period,并且要大于或等于period。
  • 集群在线扩容期间,自动增加分区会失败,但是由于每次增分区时,都预留了足够的分区,所以不影响使用。

创建ECS

参见购买弹性云服务器购买。购买后,参见登录Linux弹性云服务器进行登录。

创建ECS过程中,注意选择与后续的IoT数仓在同一个区域、可用区和同一个VPC子网下,ECS的操作系统选择与gsql客户端(本例以CentOS 7.6为例),并选择以密码方式登录。

创建集群

  1. 登录华为云管理控制台。
  2. 在“服务列表”中,选择“大数据 > 数据仓库服务”,单击右上角“创建数据仓库集群”。
  3. 参见表1进行参数配置。

    表1 软件配置

    参数名称

    配置方式

    区域

    选择“中国-香港”

    说明:

    本指导以“中国-香港”为例进行介绍,如果您需要选择其他区域进行操作,请确保所有操作均在同一区域进行。

    可用区

    可用区2

    产品类型

    标准数仓

    CPU架构

    X86

    节点规格

    dws2.m6.4xlarge.8(16 vCPU | 128GB | 2000GB SSD)

    说明:

    如规格售罄,可选择其他可用区或规格。

    节点数量

    3

    集群名称

    dws-demo

    管理员用户

    dbadmin

    管理员密码

    -

    确认密码

    -

    数据库端口

    8000

    虚拟私有云

    vpc-default

    子网

    subnet-default(192.168.0.0/24)

    安全组

    自动创建安全组

    公网访问

    现在购买

    宽带

    1Mbit/s

    高级配置

    默认配置

  4. 信息核对无误,单击“立即购买”,单击“提交”。
  5. 等待约6分钟,待集群创建成功后,单击集群名称前面的,弹出集群信息,记录下“公网访问地址”,例如dws-demov.dws.huaweicloud.com。

使用gsql命令行客户端连接集群

  1. 使用root用户远程登录到需要安装gsql的Linux主机,然后在Linux命令窗口,执行以下命令下载gsql客户端:

    1
    wget https://obs.ap-southeast-1.myhuaweicloud.com/dws/download/dws_client_8.1.x_redhat_x64.zip --no-check-certificate
    

  2. 执行以下命令解压客户端工具。

    1
    cd <客户端存放路径> unzip dws_client_8.1.x_redhat_x64.zip
    

    其中:

    • <客户端存放路径>:请替换为实际的客户端存放路径。
    • dws_client_8.1.x_redhat_x64.zip:这是“RedHat x64”对应的客户端工具包名称,请替换为实际下载的包名。

  3. 执行以下命令配置客户端。

    1
    source gsql_env.sh
    

    提示以下信息表示客户端已配置成功。

    1
    All things done.
    

  4. 执行以下命令,使用gsql客户端连接GaussDB(DWS)集群中的数据库,其中password为用户创建集群时自定义的密码。

    1
    gsql -d gaussdb -p 8000 -h 192.168.0.86 -U dbadmin -W password -r
    

    显示如下信息表示gsql工具已经连接成功:

    1
    gaussdb=>
    

分区自动管理

分区管理功能是和表级参数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);