1 引言
ClickHouse是一個用於聯機分析(OLAP)的列式數據庫管理系統(DBMS)。我們內部很多的報表、數據看板都基於它進行開發。今天為大家帶來remote方式的ClickHouse數據表遷移的完整過程介紹,如有錯誤,還請各位大佬指正。
以下sql語句為測試使用,如需使用請根據實際情況修改。
2 背景
我們使用的是京東雲提供的分佈式數據庫 JCHDB,原ClickHouse是兩個部門共用的,因涉及相關業務、管理及費用劃分等問題,需進行ClickHouse集羣的分離。原ClickHouse麪包含表有:業務A訂單表與業務B大屏數據表;拆分後需要將業務B的大屏數據表遷移到新ClickHouse集羣中去。
3 遷移方式
經查閲,遷移方式有如下幾種:
1.通過remote函數進行數據遷移
2.通過文件導出導入方式進行數據遷移
3.通過CSV文件導出導入
4.通過Linux pipe管道進行流式導出導入
經過與雲JCHDB負責運維同事溝通及調研,因數據量目前不大,比較適合採用remote方式進行遷移,注意remote使用的前提要求即可。如果數量過大請參考其他遷移方式。
remote方式使用前,請增加max_partitions_per_insert_block參數值,避免語句執行失敗,示例報如下錯誤:
報錯:
Too many partitions for single INSERT block (more than 100). The limit is controlled by 'max_partitions_per_insert_block' setting
原因:
clickhouse 要求每次寫入的數據不能跨越特別多的 partitions,具體受參數 max_partitions_per_insert_block 控制,調整該參數即可。
4 步驟
- 創建新clickhouse集羣:請到雲管平台申請,請先預估好業務未來數據量,再去填寫申請的容量配置;
- 創建數據庫:
CREATE DATABASE IF NOT EXISTS new_database on cluster default;
注意後面的on cluster default;必須帶上。
- 創建表:
根據實際表字段、表引擎編寫sql。參考:https://clickhouse.com/docs/zh/sql-reference/statements/creat...
- 建立測試表
CREATE TABLE
IF NOT EXISTS new_database.test_ck_01_local ON CLUSTER default
(
id String COMMENT '隨機主鍵',
dt Date COMMENT '分區字段'
)
ENGINE = ReplicatedReplacingMergeTree
('/clickhouse/new_database/tables/{shard}/test_ck_01_local', '{replica}')
PARTITION BY toYYYYMMDD
(dt)
ORDER BY id;
CREATE TABLE
IF NOT EXISTS new_database.test_ck_01 ON CLUSTER default AS new_database.test_ck_01_local
ENGINE=Distributed(default, new_database, test_ck_01_local, rand());
- 寫入測試數據:
在原clickhouse裏執行寫入數據語句:
INSERT INTO old_database.test_ck_01 values('1',NOW());
INSERT INTO old_database.test_ck_01 values('2',NOW());
根據實際情況多些一些數據即可。
從新ClickHouse集羣客户端裏執行查詢語句:(如不成功説明網絡不通)
SELECT * from
remote('老集羣地址',old_database.test_ck_01,'user','password')
- 測試遷移命令:
INSERT INTO new_database.test_ck_01
SELECT * from
remote('老集羣地址',old_database.test_ck_01,'user','password')
- 正式遷移步驟如下:
•提前修改代碼裏的clickhouse地址,替換新地址;
•通知大數據實時負責人停止flink等寫入任務;
•進行數據遷移到新ClickHouse集羣(參考以上遷移語句);
•通知大數據實時負責人開啓flink等寫入任務;
•驗證數據是否同步到新ClickHouse集羣;
•在灰度或預發環境部署或重啓,通過代碼調用查詢新ClickHouse集羣看是否正常。
- 遷移語句:(在目標clickhouse集羣客户端內執行)
INSERT INTO new_database.待遷移的數據表
SELECT * from
remote('老集羣地址',old_database.老數據表,'user','password')
- 驗證表數據量是否一致:
SELECT COUNT(1) from 待遷移的數據表 final
注意: 遷移完成後數據量可能不一致,請使用 final合併查詢,會把重複的數據條目進行合併。
5 參考
官方文檔:https://clickhouse.com/docs/zh
京東雲clickhouse學習:https://docs.jdcloud.com/cn/jchdb/product-overview
remote使用:https://blog.csdn.net/u010180815/article/details/115070235
6 總結
以上就是使用remote方式進行ClickHouse數據表遷移的實戰操作。通過這種方式,我們可以將數據表從一個ClickHouse集羣遷移到另一個ClickHouse集羣,從而實現數據的無縫遷移。
作者:京東物流 劉鄧忠
內容來源:京東雲開發者社區