更多技術交流、求職機會,歡迎關注位元組跳動資料平臺微信公眾號,回覆【1】進入官方交流群
社群版 ClickHouse 推出了MaterializedMySQL資料庫引擎,用於將 MySQL 中的表對映到 ClickHouse 中。ClickHouse 服務作為 MySQL 副本,讀取 Binlog 並執行 DDL 和 DML 請求,實現了基於 MySQL Binlog 機制的業務資料庫實時同步功能。
這樣不依賴其他資料同步工具,就能將 MySQL 整庫資料實時同步到 ClickHouse,從而能基於 ClickHouse 構建實時資料倉儲。
ByteHouse 是基於 ClickHouse 增強自研的雲原生資料倉儲,在社群版 ClickHouse 的 MaterializedMySQL 之上進行了功能增強,讓資料同步更穩定,支援便捷地處理同步異常問題。
ClickHouse 社群版通過 DDL 語句在 ClickHouse 上建立一個 database,並將 MySQL 中的指定的一個 database 的全量資料遷移至 ClickHouse,並實時讀取 MySQL 的 binlog 紀錄檔,將 MySQL 中的增量資料實時同步至 ClickHouse 中。
詳細介紹:[experimental] MaterializedMySQL | ClickHouse Docs
同步一個 MySQL 庫至 ClickHouse 的範例建立語句如下:
MaterializedMySQL 資料同步方案的優勢有:
簡單易用:使用一個 DDL 語句就能建立整庫同步任務,能將數百數千張表一鍵同步至 ClickHouse,操作簡單。
架構簡單:使用 ClickHouse 本身的計算資源進行資料增量同步,無需搭建其他的資料同步工具,資料架構簡單。
時效性好:支援實時同步源端資料,ClickHouse 端幾乎是毫秒和秒級延遲,時效體驗非常好。
社群版 MaterializedMySQL 很大程度瞭解決了 MySQL 庫到 ClickHouse 之間的資料實時同步問題,但也存在不少問題導致其很難應用到生產應用中,主要問題如下:
設定選項少
社群版 MaterializedMySQL 不支援同步到分散式表,不支援跳過不相容 DDL 等功能,缺乏這些功能很難將 MaterializedMySQL 用於實際應用中。
運維困難
社群版 MaterializedMySQL 不支援同步異常重新同步命令,沒有同步狀態和紀錄檔資訊,同步任務失敗後很難短時間定位問題和恢復同步。
ByteHouse 的 MaterializedMySQL 功能針對使用過程中的問題和困難,做了多處增強,提高了易用性,降低了運維成本。
通過 MaterializedMySQL 同步到 ByteHouse 的表預設採用 HaUniqueMergeTree 表引擎,該表引擎支援設定 UNIQUE KEY 唯一鍵,提供 upsert 更新寫語意,源端資料的更新操作在目標端可以實時去重更新。不需要依賴_version、_sign 虛擬列來標記刪除更新,簡化了業務邏輯,提高了易用性。
通過 SETTINGS 引數中設定 include_tables 和 exclude_tables 列表,指定該資料庫下需要同步的表清單或者不需要同步的表清單,否則同步該庫所有的表。
在實際應用中,一個資料庫通常有數百乃至數千張表,其中有些表無需同步、或者資料可能存在異常,可以將這些表加入 exclude_tables 清單,不影響其他表的資料同步。
資料同步鏈路無法避免發生異常情況導致同步中斷,ByteHouse 提高了多個功能來簡化異常問題處理。
跳過不支援的語句
MySQL 支援的 DDL 語句非常豐富,有很多語法與 clickhouse 不相容,在 ClickHouse 端執行會報錯中斷同步任務。
可以通過設定 skip_ddl_patterns 引數,用 1 個或多個正規表示式將匹配的 DDL 語句過濾掉,從而避免了報錯和中斷同步任務。
系統紀錄檔表
ByteHouse 提供兩個系統表:system.materialize_mysql_status,system.materialize_mysql_log,分別記錄了每個同步任務的狀態,引數設定和執行紀錄檔。便於實時檢視同步狀態和排查異常問題。
出錯後運維
當同步任務出現了同步異常後,通過檢視執行紀錄檔系統表定為問題。
針對性處理了異常問題後,通過 resync 命令重啟同步任務。
社群版 MaterializedMySQL 的每個同步任務會將源端的一個庫同步至 ClickHouse 的某個節點,不支援按分片邏輯將資料分佈到所有節點,無法利用 ClickHouse 叢集的分散式計算儲存能力;如果在叢集中每個節點都建一個同步庫,則源端一份資料會被同步一份全量至每個 ClickHouse 節點,既浪費了儲存空間,降低了查詢效能,又會對源端產生巨大的壓力。
ByteHouse 支援構建分散式模式的 MaterializedMySQL 庫,將每個表都對應同步至 ByteHouse 的一個分散式表,資料不重複儲存,能充分利用分散式叢集的計算能力,又降低了對源端的同步壓力。
ByteHouse 同時提供了視覺化運維模組,能實時檢視同步狀態,暴露同步異常,支援線上修復同步異常問題和重啟同步任務。
下午將演示將 MySQL 庫中的若干張表同步至 ByteHouse 的全過程。
在 MySQL 資料庫端需要設定的引數如下。
使用者許可權 MaterializeMySQL 表引擎使用者必須具備 MySQL 庫的 RELOAD、REPLICATION SLAVE、REPLICATION CLIENT 以及 SELECT PRIVILEGE 許可權 支援的 MySQL 版本 5.65.78.0
在 MySQL 資料庫裡面建立一個 database,建立兩張表,並插入若干資料。
在 ByteHouse 的控制檯資料查詢視窗,建立 MaterializeMySQL 庫。
引數解釋:
shard_mode:true 表示是同步至分散式表。
allows_query_when_mysql_lost:1 表示同步中斷的時候也允許查詢資料。
include_tables:同步源端 db 庫中 user 和 data 兩張表,其他表跳過不同步。
OVERRIDE :ByteHouse 中的 data 表按照 date_time 欄位分割區。
切換到 ByteHouse 資料管理模組,搜尋 shard_mode_true_mysql_sync 庫,並檢視庫同步狀態
建立庫後預設是同步狀態
可以手動停止同步
停止中的庫可以手動開始同步
選擇一個同步庫,點選「重置同步」可以從頭開始重新同步整庫
選擇一個同步中的表 A,點選「重置同步」按鈕,系統將執行以下行為:
關閉同步任務
從源端全量拉取該表的資料至臨時表(A_CHTMP,表名字尾會加上_CHTMP)
刪除目標端原有表 A(如果存在)
將臨時表 A_CHTMP RENAME 為 A
開始增量同步
刪除 ByteHouse 中的庫以及同步關係。
在 ByteHouse 管理控制檯,通過下列語句檢視任務同步狀態和錯誤資訊。
在源端執行下列 Alter table 語句以後,庫同步會失敗
恢復辦法:
在 ByteHouse 介面上進入表詳情,點選重新同步按鈕。
進入庫詳情頁面,點選開始同步按鈕,即可恢復同步。
在 ByteHouse 中執行下列語句,也可以恢復資料同步
通過下列語句修改 include 和 exclude 引數,來修改同步表範圍。
ByteHouse 提供監控報警功能,在庫同步異常停止或單表同步失敗的時候,可以向管理員傳送報警資訊。
點選跳轉 ByteHouse雲原生資料倉儲 瞭解更多