本文將介紹如何生成列存快照的快照點,以及生成快照點后對列存只讀實例和主實例的數據同步延遲所產生的影響。
版本限制
實例版本需要在5.4.20及以上,且引擎版本為MySQL 5.7或MySQL 8.0。
手動生成
執行如下代碼,生成實例級別的快照點:
CALL polardbx.columnar_flush();
說明執行
CALL polardbx.columnar_flush()
函數會產生一個快照點,并返回一個unsigned long
類型的值,代表該快照點的版本(一個與時區無關的時間戳)。執行如下代碼,對指定的列存索引生成快照點:
CALL polardbx.columnar_flush(schema_name, table_name, index_name); -- 例如:索引名可添加實際后綴,或不加后綴(通過 show columnar status 可查看后綴) CALL polardbx.columnar_flush('db1', 'tb1', 'cci'); CALL polardbx.columnar_flush('db1', 'tb1', 'cci_$09a9');
說明其中
index_name
為列存索引名稱。如何獲取index_name
,請參見SHOW COLUMNAR STATUS。列存索引級別快照點是整個實例的一致性快照,并不是單個表的一致性快照。效果等同于實例級別快照點。
自動生成
執行如下代碼,可以讓系統定期地生成快照點:
-- 調整生成的間隔,單位:分鐘
CALL polardbx.columnar_config(cci_id, 'auto_gen_columnar_snapshot_interval', 10);
使用快照點查詢快照
執行如下代碼,查詢
INFORMATION_SCHEMA.COLUMNAR_SNAPSHOTS
視圖,來獲取當前可用的快照點(包括手動生成和自動生成的快照點):SELECT * FROM INFORMATION_SCHEMA.COLUMNAR_SNAPSHOTS;
返回結果示例如下:
+------------------------+------------+------------+---------------------+ | SCHEMA_NAME | TABLE_NAME | INDEX_NAME | TSO | +------------------------+------------+------------+---------------------+ | test_columnar_snapshot | tb1 | cci_$09a9 | 7249374192586457152 | | polardbx | __global__ | __global__ | 7249332223843762240 | | polardbx | __global__ | __global__ | 7249374271451955264 | +------------------------+------------+------------+---------------------+
參數說明:
參數名稱
說明
SCHEMA_NAME
模式名稱。值為
polardbx
時,表示該快照點是一個實例級別的快照點。SCHEMA_NAME
為其他值時,表示該快照點是一個列存索引級別的快照點。INDEX_NAME
列存索引的物理名稱,相比創建索引時指定的邏輯名字,會帶有一個隨機后綴
_$09a9
。更多信息,請參見SHOW COLUMNAR STATUS。TABLE_NAME
列存索引對應的邏輯表名。
說明如果快照點個數過多,建議您使用
SCHEMA_NAME
、TABLE_NAME
、INDEX_NAME
、TSO
這些列作為條件進行過濾。否則可能會對實例性能造成影響。使用
TIME_TO_TSO()
函數將時間戳轉成TSO值后,作為過濾條件查詢,以提升查詢效率。
執行如下代碼,可以查詢特定列存索引在某個時間段內的所有快照點:
-- 查詢 2024-07-01 14:00:00 到 2024-07-01 18:00:00 之間的快照點 SELECT TIME_TO_TSO("2024-07-01 14:00:00") as tso; +---------------------+ | tso | +---------------------+ | 7213421061734400000 | +---------------------+ SELECT TIME_TO_TSO("2024-07-01 18:00:00") as tso; +---------------------+ | tso | +---------------------+ | 7213481459712000000 | +---------------------+ -- 獲取指定列存索引的快照點 SELECT * FROM INFORMATION_SCHEMA.COLUMNAR_SNAPSHOTS WHERE SCHEMA_NAME = 'your_schema' AND TABLE_NAME = 'your_table' AND INDEX_NAME = 'your_snapshot_cci_name' AND TSO >= 7213421061734400000 AND TSO <= 7213481459712000000; +-------------+------------+------------------------+---------------------+ | SCHEMA_NAME | TABLE_NAME | INDEX_NAME | TSO | +-------------+------------+------------------------+---------------------+ | polardbx | __global__ | __global__ | 7213421061734400000 | | your_schema | your_table | your_snapshot_cci_name | 7213481459712000000 | +-------------+------------+------------------------+---------------------+
性能影響測試
使用CALL polardbx.columnar_flush()
函數生成快照點不會對行存上的讀寫造成影響,但頻繁調用CALL polardbx.columnar_flush()
時,可能會增大列存只讀實例和主實例的數據同步延遲。
測試設計
測試數據量
基于1000 Warehouse,其中主要表的數據量如下:
bmsql_order_line
表3億行。bmsql_stock
表1億行。bmsql_customer
、bmsql_history
、bmsql_oorder
各3000萬行。
測試所用實例規格
節點名稱
節點規格
節點數
計算節點
4核16 G
2
存儲節點
4核16 G
4
列存引擎
4核32 G
2
測試所用壓力機規格
ecs.g6.4xlarge(16核64 GB)。如何購買ECS實例,請參見控制臺自定義購買并使用ECS實例。
測試方法
完成TPC-C測試的環境搭建。具體操作,請參見TPC-C測試。
執行如下代碼,對測試數據庫中最大的三個表
bmsql_stock
,bmsql_customer
,bmsql_order_line
分別創建列存快照:CREATE CLUSTERED COLUMNAR INDEX cci ON `bmsql_stock`(s_i_id) PARTITION BY KEY(s_w_id) COLUMNAR_OPTIONS='{ "type":"snapshot", "snapshot_retention_days":"30", "auto_gen_columnar_snapshot_interval":"-1" }'; CREATE CLUSTERED COLUMNAR INDEX cci ON `bmsql_customer`(c_id) PARTITION BY KEY(c_w_id) COLUMNAR_OPTIONS='{ "type":"snapshot", "snapshot_retention_days":"7", "auto_gen_columnar_snapshot_interval":"-1" }'; CREATE CLUSTERED COLUMNAR INDEX cci ON `bmsql_order_line`(ol_i_id) PARTITION BY KEY(ol_w_id) columnar_options='{ "type":"snapshot", "snapshot_retention_days":"365", "auto_gen_columnar_snapshot_interval":"-1" }';
當壓測到計算節點和存儲節點的CPU占用都接近50%時,以不同的頻率調用
CALL polardbx.columnar_flush()
生成快照點,并觀察列存只讀實例和主實例的數據同步延遲。
測試結果
每分鐘60次調用
CALL polardbx.columnar_flush()
生成快照點時,列存只讀實例和主實例的數據同步延遲如下圖所示:每分鐘480次調用
CALL polardbx.columnar_flush()
生成快照點時,列存只讀實例和主實例的數據同步延遲如下圖所示:說明壓測的過程中,同步延遲穩定在1秒左右,最高在4秒左右。
每分鐘960次調用
CALL polardbx.columnar_flush()
生成快照點時,列存只讀實例和主實例的數據同步延遲如下圖所示:說明在頻率加大到每分鐘960次時,列存只讀實例和主實例的數據同步延遲出現了明顯增長,最高達到了50秒。
測試總結
在上述測試中,以小于每分鐘500次的頻率調用CALL polardbx.columnar_flush()
時,并沒有明顯的增加列存只讀實例和主實例的數據同步延遲。但是當以每分鐘約1000次的頻率調用CALL polardbx.columnar_flush()
時,列存只讀實例和主實例的數據同步延遲會出現明顯增大。在實際業務環境中,因為CALL polardbx.columnar_flush()
的調用頻率對列存只讀實例和主實例的數據同步延遲的影響,和實際地業務流量、列存快照地個數等都息息相關,所以建議您控制調用CALL polardbx.columnar_flush()
地頻率不超過每秒1次,如果需要以更高頻率調用(超過每秒1次),請務必進行充分地測試。