暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一站式HTAP服务

成子 2023-07-24
153

本文介绍了PolarDB PostgreSQL版的一站式HTAP服务。

背景信息

PolarDB PostgreSQL版是擅长事务处理的OLTP数据库,将每一行数据以连续的形式保存在存储介质上,使用迭代器模型的执行器对数据进行增删改查。这种存储形式和执行模型能够很高效地完成高并发的事务处理负载,但无法高效应对大规模的数据分析负载。

在重度OLAP的业务场景中,通常需要将数据从OLTP数据库中导出,然后将数据迁移并导入到专业的OLAP数据仓库,在数据仓库中进行大规模的分析型查询。专业的数据仓库通常会把每个列的数据以连续的形式保存在存储介质上,并提供向量化模型的执行器:

  • 列式存储能够方便地对数据进行压缩,大幅提升I/O效率。

  • 向量化执行模型能够批量化处理元组,降低表达式计算过程中的解释开销,并且使编译器能够更好地通过循环流水线来减少数据库程序运行时CPU的空转。

然而,数据的导出、迁移、变换、导入(ETL、Extract、Transform、Load)以及同时运维OLTP、OLAP两套数据库,都将引入额外的时间及人力成本。维护两份数据的一致性也是一个非常麻烦的问题。

PolarDB PostgreSQL版提供了弹性跨机并行查询(ePQ),能够在行存数据格式上充分利用多个节点的计算资源和I/O带宽,透明地完成轻量级的分析型查询。此外,PolarDB PostgreSQL版还提供了一站式HTAP云服务,通过简单的SQL就可以将OLTP引擎的数据快速迁移到内置的OLAP存储和引擎上,内置的同步链路将会自动维持两份数据的一致性。

其中,常规的事务型查询可以继续在PolarDB PostgreSQL版的OLTP引擎上进行,轻量级的分析型业务可以在OLTP引擎上使用ePQ快速完成,重度的分析型业务可以被路由到OLAP引擎上,由向量化执行引擎完成。被同步到OLAP引擎的数据范围可以通过执行SQL来动态扩大或缩小。

前提条件

  • 目前仅新加坡地域支持使用一站式HTAP服务。

  • PolarDB PostgreSQL版需为单节点版本,并且内核小版本为14.6.6.1及以上。

  • 使用一站式HTAP功能前,需确保PolarDB PostgreSQL版集群中至少有一个分析节点,您可以在PolarDB控制台增删节点。分析集群的计算能力将随着分析节点数量的增加线性提升。

  • 一站式HTAP功能的内置同步链路需要将wal_level参数设置为logical,否则无法在OLTP和OLAP引擎之前同步数据,修改该参数需要重启集群。修改参数的具体操作请参见设置集群参数

  • 当前集群所属的阿里云账号已经授权DTS的RAM角色访问其云资源,详情请参见授予DTS访问云资源的权限

  • 您需要为当前集群所属的阿里云账号配置RAM授权,确保正常使用HTAP功能。具体操作请参见配置RAM授权

使用指南

开启或关闭HTAP功能

使用高权限用户执行以下命令,创建polar_htap_db插件。

CREATE EXTENSION IF NOT EXISTS polar_htap_db;

该插件会提供三个函数,分别用于打开、查询、关闭当前数据库的HTAP功能。

开启HTAP功能

执行以下命令,使用polar_htap_db.enable_htap()函数开启当前数据库的HTAP功能。

SELECT polar_htap_db.enable_htap();

该函数会使当前数据库的HTAP状态从初始的disable状态变为init状态:

 enable_htap
-------------

(1 row)

查询HTAP状态

后台服务会自动响应当前数据库开启HTAP功能的请求,在OLAP引擎上建立相同的数据库,并拉起一个空的同步链路,然后修改HTAP状态。当HTAP状态变为ready时,表示当前数据库的HTAP功能已经开启完毕,HTAP功能可以正常使用。

执行以下命令,使用polar_htap_db.get_htap_status()函数查看当前数据库的HTAP状态。

SELECT polar_htap_db.get_htap_status();

显示结果如下:

 get_htap_status
-----------------
 ready
(1 row)

关闭HTAP功能

执行以下命令,使用polar_htap_db.disable_htap()函数关闭当前数据库的HTAP功能。

SELECT polar_htap_db.disable_htap();

该函数会使当前数据库的HTAP状态变为cleanup,后台服务将会自动响应,对当前数据库在OLAP引擎上的数据副本和内置同步链路进行清理。清理完毕后,当前数据库的HTAP状态会恢复为disable

 disable_htap
--------------

(1 row)

创建或删除HTAP表

创建HTAP表

在数据库的HTAP状态为ready后,您可以自行选择将这个数据库中的一部分表迁移同步到OLAP引擎上,以便后续进行分析查询。

执行以下命令,开启一张表的HTAP功能。

ALTER TABLE xxx SET (polar_htap=true);

说明

  • 表必须有主键。

  • 当前只支持普通表,不支持分区表、继承表等其他对象。

  • 表的列类型只能包含PostgreSQL内置的数据类型。

在执行完上述命令后,内置同步链路会自动把这张表的全量数据迁移转换到OLAP引擎上,并自动同步对该表的后续增量修改。

执行以下命令,查询当前数据库中所有的HTAP表,以及它们各自的同步状态。

SELECT * FROM polar_htap.htap_tables;

显示结果如下:

   oid  | relname | relkind | sync_timeout | synced_tuples | total_tuples | sync_percentage | dist_policy | dist_cols | sync_status
-------+---------+---------+--------------+---------------+--------------+-----------------+-------------+-----------+-------------
 16446 | test_1  | r       |            0 |             0 |          100 |               0 | p           | 1         | waiting
 16478 | test_2  | r       |            0 |             0 |          100 |             100 | p           | 1         | sync
(2 row)

当表的同步状态变为sync时,表示这张表在OLAP引擎上的数据已经与OLTP存储引擎一致,具备进行HTAP查询的前提。

删除HTAP表

执行以下命令,删除HTAP表。

ALTER TABLE xxx RESET (polar_htap);

上述命令执行完成后,该表在OLAP引擎上的副本会被完全移除。后续如果将这张表重新设置为HTAP表,需要重新进行全量数据的同步。

开启或关闭HTAP查询

能进行HTAP查询的前提是查询中引用的所有表全都是HTAP表,并且同步状态全部为sync。否则,查询将会回退到本地执行。

开启HTAP查询

执行以下命令,开启HTAP查询。

SET polar_htap.enable_htap_query = ON;

执行以下命令,进行HTAP查询。

SELECT * FROM test_2;

显示结果如下:

NOTICE: Query is under HTAP execution...

说明 

在HTAP查询过程中发生以下情况时,将会回退为本地执行:

  • 查询中使用的表不是HTAP表,或HTAP表未处于sync状态。

  • OLAP引擎增量同步超时。

  • OLAP引擎连接信息错误。

  • OLAP引擎执行异常。

  • 查询处于事务块中。

  • 事务隔离级别不是READ_COMMITTED

关闭HTAP查询

执行以下命令,关闭HTAP查询。

SET polar_htap.enable_htap_query = OFF;

配置RAM授权

  1. 创建RAM角色。

    1. 使用当前集群所属的阿里云账号,登录RAM控制台

    2. 在左侧导航栏,选择身份管理>角色

    3. 角色页面,单击创建角色

    4. 创建角色面板,选择可信实体类型为阿里云账号,然后单击下一步

    5. 在弹出的对话框中,配置RAM角色信息。

      说明 

      其中:

      • 角色名称:填写ram-for-htap。

      • 选择信任的云账号:选择为其他云账号,并填写1317334647812936

    6. 单击完成

  2. 角色页面,为创建好的RAM角色授权,单击精确授权

    1. 添加权限对话框中选择权限类型为系统策略

    2. 输入策略名称下方的文本框中,输入AliyunDTSRolePolicy

    3. 单击确定

    4. 精确授权成功后,单击关闭

  3. 修改信任策略。

    1. 角色页面,找到刚刚创建的RAM角色,单击对应的RAM角色名称。

    2. 在RAM角色的基本信息页面,单击信任策略管理页签。

    3. 信任策略管理页签中,单击修改信任策略

    4. 将下述代码复制至策略框中。

      {
        "Statement": [
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
              "RAM": [
                "acs:ram::1317334647812936:root"
              ],
              "Service": [
                "1317334647812936@dts.aliyuncs.com"
              ]
            }
          }
        ],
        "Version": "1"
      }
    5. 单击确定

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论