本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
本文介紹了的一站式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 | 同步鏈路狀態信息。 |