本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
本文介绍了的一站式HTAP服务。
背景信息
是擅长事务处理的OLTP数据库,将每一行数据以连续的形式保存在存储介质上,使用迭代器模型的执行器对数据进行增删改查。这种存储形式和执行模型能够很高效地完成高并发的事务处理负载,但无法高效应对大规模的数据分析负载。
在重度OLAP的业务场景中,通常需要将数据从OLTP数据库中导出,然后将数据迁移并导入到专业的OLAP数据仓库,在数据仓库中进行大规模的分析型查询。专业的数据仓库通常会把每个列的数据以连续的形式保存在存储介质上,并提供向量化模型的执行器:
列式存储能够方便地对数据进行压缩,大幅提升I/O效率。
向量化执行模型能够批量化处理元组,降低表达式计算过程中的解释开销,并且使编译器能够更好地通过循环流水线来减少数据库程序运行时CPU的空转。
然而,数据的导出、迁移、变换、导入(ETL、Extract、Transform、Load)以及同时运维OLTP、OLAP两套数据库,都将引入额外的时间及人力成本。维护两份数据的一致性也是一个非常麻烦的问题。
提供了弹性跨机并行查询(ePQ),能够在行存数据格式上充分利用多个节点的计算资源和I/O带宽,透明地完成轻量级的分析型查询。此外,还提供了一站式HTAP云服务,通过简单的SQL就可以将OLTP引擎的数据快速迁移到内置的OLAP存储和引擎上,内置的同步链路将会自动维持两份数据的一致性。
其中,常规的事务型查询可以继续在的OLTP引擎上进行,轻量级的分析型业务可以在OLTP引擎上使用ePQ快速完成,重度的分析型业务可以被路由到OLAP引擎上,由向量化执行引擎完成。被同步到OLAP引擎的数据范围可以通过执行SQL来动态扩大或缩小。
功能优势
高性价比
传统方案中,若您想通过PolarDB实现HTAP,您需要额外购买分析型数据库(如云原生数据仓库 AnalyticDB PostgreSQL 版),并购买DTS服务实现数据同步,整体费用较高。
一站式HTAP服务相比传统方案:
价格上:一站式HTAP服务整体方案成本可降低30%。
性能上:在复杂查询方面,一站式HTAP服务的查询性能最高可提升百倍。
数据一致性
一站式HTAP服务实现了PolarDB和内置的OLAP存储和引擎之间的数据同步,保证了数据一致性。
维护成本低
一站式HTAP服务配置简单,灵活易用。您无需配置其他数据同步工具,只需在PolarDB控制台简单配置,并通过简单的SQL语句,即可完成HTAP服务配置和数据同步。
支持地域
目前华东1(杭州)、华北2(北京)、华南1(深圳)、华东2(上海)、新加坡地域支持使用一站式HTAP服务。
费用说明
一站式HTAP服务目前仅收取分析节点产生的计算和存储费用,具体计费规则如下:
分析节点计算费用
分析节点目前仅支持按量付费,价格与节点规格和使用时长有关,具体价格如下:
表 1. 单个分析节点的按量付费价格(元/小时)
分析节点规格码 | CPU和内存 | 中国内地 | 新加坡 |
polar.pga.x4.medium | 2核8 GB | 0.583元/小时 | 1.022元/小时 |
polar.pga.x4.large | 4核16 GB | 1.458元/小时 | 2.555元/小时 |
polar.pga.x4.xlarge | 8核32 GB | 2.583元/小时 | 4.526元/小时 |
polar.pga.x4.2xlarge | 16核64 GB | 5元/小时 | 8.76元/小时 |
当前分析节点的计算用量暂不支持使用固定规格计算包抵扣。
分析节点存储费用
分析节点的数据默认使用ESSD PL1云盘进行存储,且根据实际数据存储用量按量付费,具体价格如下:
表 2. 每GB存储空间的按量付费价格(元/GB/小时)
ESSD云盘类型 | 中国内地 | 新加坡 |
ESSD PL1 | 0.00208元/GB/小时 | 0.00396元/GB/小时 |
在增加分析节点时,您无需选择其存储空间大小,将根据具体数据的存储用量进行自动扩缩容。
分析节点的数据存储用量暂不支持使用存储包抵扣。
版本要求
当前仅标准版支持一站式HTAP服务,并且内核小版本需为14.8.11.0及以上。
前置操作
请在初次使用一站式HTAP功能前确保已为当前集群所属的阿里云账号完成如下权限配置。
配置DTS RAM授权
请确保当前集群所属的阿里云账号已经授权DTS的RAM角色访问其云资源,详情请参见授予DTS访问云资源的权限。
配置HTAP RAM授权
您需要为当前集群所属的阿里云账号配置RAM授权,确保正常使用HTAP功能。
创建RAM角色。
使用当前集群所属的阿里云账号,登录RAM控制台。
在左侧导航栏,选择身份管理>角色。
在角色页面,单击创建角色。
在创建角色面板,选择可信实体类型为阿里云账号,然后单击下一步。
在弹出的对话框中,配置RAM角色信息。
说明其中:
角色名称:填写ram-for-htap。
选择信任的云账号:选择为其他云账号,并填写1317334647812936。
单击完成。
在角色页面,为创建好的RAM角色授权,单击精确授权。
在添加权限对话框中选择权限类型为系统策略。
在输入策略名称下方的文本框中,输入AliyunDTSRolePolicy。
单击确定。
精确授权成功后,单击关闭。
修改信任策略。
在角色页面,找到刚刚创建的RAM角色,单击对应的RAM角色名称。
在RAM角色的基本信息页面,单击信任策略管理页签。
在信任策略管理页签中,单击修改信任策略。
将下述代码复制至策略框中。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::1317334647812936:root" ], "Service": [ "1317334647812936@dts.aliyuncs.com" ] } } ], "Version": "1" }
单击确定。
使用说明
步骤一:设置WAL日志等级
在使用一站式HTAP功能前,请先设置wal_level参数为logical,否则无法在OLTP和OLAP引擎之间同步数据。
您可通过PolarDB控制台参数配置页面进行参数设置,具体请参见设置集群参数。
该参数提交修改后,需要重启集群才能生效。请在重启集群前做好业务安排,谨慎操作。
步骤二:增加分析节点
在使用一站式HTAP功能前,需要为PolarDB集群添加至少两个分析节点。分析集群的计算能力将随着分析节点数量的增加线性提升。
增加一个分析节点预计耗时5分钟(具体耗时与数据库负载、库表数量等因素有关),整个过程对数据库无任何影响。
登录PolarDB控制台。
在控制台左上角,选择集群所在地域。
您可以按照如下两种方式进入增删节点向导页面。
找到目标集群,在操作列单击增删节点。
找到目标集群,单击集群ID,进入基本信息页面,在数据库节点区域单击增删节点。
选中增加分析节点并单击确定。
选择分析节点规格,并设置分析节点数量。
说明分析节点的规格无需与主节点规格保持一致,但分析节点之间其规格需要保持一致。例如,若您已添加2个4C16G的分析节点,若还需添加分析节点,其规格必须为4C16G。
您无需选择其存储空间大小,将根据具体数据的存储用量进行自动扩缩容。
勾选服务协议,单击立即购买。
在支付页面确认订单信息,单击支付。
步骤三:开启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 table1 SET (polar_htap=true);
表必须有主键。
当前只支持普通表、根级分区表。不支持非根级分区表、继承表、临时表等其他对象。
表的列类型只能包含PostgreSQL内置的数据类型。
表上的触发器、行级别安全策略在 HTAP 执行过程中不起作用
在执行完上述命令后,内置同步链路会自动把这张表的全量数据迁移转换到OLAP引擎上,并自动同步对该表的后续增量修改。
查询HTAP表状态
执行以下命令,查询当前数据库中所有的HTAP表,以及它们各自的同步状态。
SELECT * FROM polar_htap.htap_tables;
显示结果如下:
oid | relschema | relname | relkind | dist_policy | dist_cols | sync_timeout | sync_status | sync_start_time | sync_end_time | sync_duration | synced_tuples | total_tuples | sync_percentage | table_size
-------+-----------+----------+---------+-------------+-----------+--------------+-------------+-------------------------------+-------------------------------+-----------------+---------------+--------------+-----------------+-------------
17572 | public | table1 | r | p | 1 | 0 | sync | 2023-07-18 14:07:57.738061+00 | 2023-07-18 14:09:22.472374+00 | 00:01:24.734313 | 0 | 1e+06 | 100 | 37789696
17305 | public | lineitem | r | p | 1 4 | 0 | loading | 2023-07-19 06:11:18.557619+00 | | | 600037902 | 5.99977e+08 | 100 | 92224692224
(2 row)
各列含义如下:
oid
:表 OIDrelschema
:表所属 schema 的名称relname
:表名relkind
:表类型dist_policy
/dist_cols
:表在 OLAP 引擎上的分布模式和分布列sync_status
:表数据的同步状态sync_start_time
:表数据同步的开始时间sync_end_time
:表数据同步的结束时间sync_duration
:表数据同步的持续时间synced_tuples
:表中已被同步的元组数量total_tuples
:表中的元组总量(估算值)sync_percentage
:表的数据同步进度百分比table_size
:表大小
当table1
表数据的同步状态sync_status
变为sync
时,表示这张表在OLAP引擎上的数据已经与OLTP存储引擎一致,具备进行HTAP查询的前提。
(可选)删除HTAP表
执行以下命令,删除HTAP表。
ALTER TABLE table1 RESET (polar_htap);
上述命令执行完成后,该表在OLAP引擎上的副本会被完全移除。后续如果将这张表重新设置为HTAP表,需要重新进行全量数据的同步。
步骤五:开启HTAP查询
当查询中引用的所有表全都是HTAP表,且这些HTAP表的同步状态都为sync
后(可通过查询HTAP表状态查看所有HTAP表的同步状态),即可开启HTAP查询。
全局开启HTAP查询
您可以在控制台参数配置页面设置polar_htap.enable_htap_query参数为ON
,从而全局开启HTAP查询。
但为了保证查询性能,我们建议以较细的粒度来控制HTAP查询的启用或关闭,例如根据需要在数据库级别、用户级别或会话级别开启HTAP查询。
在数据库级别开启HTAP查询
您可根据需要,对需要做OLAP分析的某个数据库开启HTAP查询。只有连接到指定数据库的会话才会默认启用该参数:
ALTER DATABASE xxx SET polar_htap.enable_htap_query = ON;
在用户级别开启HTAP查询
您可根据需要,对某个用户开启HTAP查询。只有以指定用户登录的会话才会默认启用该参数:
ALTER ROLE xxx SET polar_htap.enable_htap_query = ON;
在当前会话内开启HTAP查询
您可根据需要,设置如下参数,即可在当前会话内开启HTAP查询:
SET polar_htap.enable_htap_query = ON;
进行HTAP查询
执行以下命令,进行HTAP查询。
SELECT * FROM table1;
显示结果如下:
NOTICE: Query is under HTAP execution...
在HTAP查询过程中发生以下情况时,将会回退为本地执行:
查询中使用的表不是HTAP表,或HTAP表未处于
sync
状态。OLAP引擎增量同步超时。
OLAP引擎连接信息错误。
OLAP引擎执行异常。
查询处于事务块中。
事务隔离级别不是
READ_COMMITTED
。
(可选)关闭HTAP查询
执行以下命令,关闭HTAP查询。
SET polar_htap.enable_htap_query = OFF;
步骤六:设置查询一致性
在的一站式HTAP服务中,OLTP引擎(PolarDB)和OLAP引擎上分别保存了一份数据,两份数据的一致性受到内置同步链路延迟的影响。
提供了数据查询一致性的设置方法,您可通过polar_htap.forward_replay_wait
和polar_htap.forward_replay_wait_lsn_diff
参数对两份数据的一致性进行把控:
若您对两份数据的一致性有强一致的需求:
在进行HTAP查询时,PolarDB默认启用了
polar_htap.forward_replay_wait
参数,以及polar_htap.forward_replay_wait_lsn_diff
参数默认取值为0。此时只有当OLAP引擎已经回放到当前查询的LSN位点时,才会将查询路由到OLAP引擎上执行,从而保证查询结果的强一致性。此时您只需要保持这两个参数的默认设置,即可达到强一致的目的。
若能够容忍在一段时间范围以内的不一致性,则可在
polar_htap.forward_replay_wait
参数为开启状态下,设置polar_htap.forward_replay_wait_lsn_diff
参数,指定OLTP引擎与OLAP引擎之间可以进行查询路由的最大LSN位点差距:当OLAP引擎与OLTP引擎的LSN位点小于该差距时,查询将会被立刻路由到OLAP引擎上执行;
否则,将会等待OLAP引擎回放到小于这个位点差距后,再进行查询路由。
=> SET polar_htap.forward_replay_wait = ON; => SET polar_htap.forward_replay_wait_lsn_diff = 8192; => SELECT * FROM test_2; NOTICE: Query is under HTAP execution... ...
若无需保证查询结果的强一致性,则可以关闭
polar_htap.forward_replay_wait
参数,使当前会话中执行HTAP查询时无需等待OLAP引擎的回放进度,立刻将查询路由到OLAP引擎:=> SET polar_htap.forward_replay_wait = OFF; => SELECT * FROM test_2; NOTICE: Query is under HTAP execution... ...
步骤七:查看增量同步状态
通过查询以下视图可以查询到同步链路的增量同步状态。
SELECT * FROM polar_htap.htap_replication_status;
-[ RECORD 1 ]-------+------------------------------------------------
slot_name | dts_sync_i2a1165s14xy091
active | t
wal_status | reserved
restart_lsn | 0/BFB096F8
confirmed_flush_lsn | 0/BFC48C88
current_insert_lsn | 1/DD220A8
apply_lsn | 0/C74711D8
apply_latency_size | 1129 MB
apply_latency_time | 00:00:27.393406
sync_update_time | 2023-11-17 07:25:58.319876+00
sync_status | {"last_commit_time": "2023-11-17 15:25:31+08"}
视图各列含义如下表所示:
名称 | 说明 |
slot_name | 用于进行增量同步的复制槽名称。 |
active | 复制槽是否处于活跃状态。 |
wal_status | 复制槽的WAL日志可用性。 |
restart_lsn | 同步链路所需的最旧LSN。 |
confirmed_flush_lsn | 同步链路已经确认接收的LSN。 |
current_insert_lsn | OLTP引擎当前插入的LSN。 |
apply_lsn | OLAP引擎已经回放完的LSN。 |
apply_latency_size | OLTP引擎与OLAP引擎的同步延迟字节数。 |
apply_latency_time | OLTP引擎与OLAP引擎的同步延迟时间间隔。 |
sync_update_time | 同步链路状态信息更新时间。 |
sync_status | 同步链路状态信息。 |