MySQL?遷移至?Doris?最佳實(shí)踐方案(最新整理)
在數(shù)據(jù)架構(gòu)不斷演進(jìn)的背景下,從 MySQL 遷移至 Doris 成為許多企業(yè)提升數(shù)據(jù)處理效率的關(guān)鍵選擇。本文將深入剖析三種經(jīng)過(guò)實(shí)踐驗(yàn)證的 MySQL 遷移至 Doris 的最佳方案,涵蓋全量遷移、增量同步、混合遷移以及基于 CDC(Change Data Capture)的實(shí)時(shí)遷移。每種方案都將從技術(shù)原理、實(shí)施步驟、適用場(chǎng)景、資源消耗等維度展開(kāi)分析,并通過(guò)對(duì)比選型幫助讀者結(jié)合自身業(yè)務(wù)需求與技術(shù)棧,找到最契合的遷移路徑,實(shí)現(xiàn)數(shù)據(jù)平穩(wěn)過(guò)渡與性能躍升。
一、JDBC Catalog 聯(lián)邦查詢(xún)方案(適合跨庫(kù)實(shí)時(shí)查詢(xún))
1. 方案概述
通過(guò) Doris 1.2 + 引入的JDBC Catalog功能,直接通過(guò)標(biāo)準(zhǔn) JDBC 協(xié)議連接 MySQL 數(shù)據(jù)庫(kù),實(shí)現(xiàn)跨庫(kù)聯(lián)邦查詢(xún)和數(shù)據(jù)寫(xiě)入。相比 ODBC,JDBC 接口更統(tǒng)一、兼容性更強(qiáng),且無(wú)需復(fù)雜的驅(qū)動(dòng)安裝和版本匹配。
2. 環(huán)境要求
組件 | 版本要求 | 說(shuō)明 |
---|---|---|
Doris | 1.2.0+ | 支持 JDBC Catalog 功能 |
MySQL | MySQL 5.7, 8.0 或更高版本 | 需開(kāi)啟遠(yuǎn)程訪問(wèn)權(quán)限 |
MySQL JDBC | 8.0.28+ | 驅(qū)動(dòng)下載:MySQL JDBC 驅(qū)動(dòng) |
3. 實(shí)施步驟
3.1 安裝 JDBC 驅(qū)動(dòng)(所有 FE/BE 節(jié)點(diǎn))
步驟 1:創(chuàng)建驅(qū)動(dòng)目錄
mkdir -p /your_path/doris/jdbc_drivers
步驟 2:上傳驅(qū)動(dòng)包下載 MySQL JDBC 驅(qū)動(dòng)(如mysql-connector-java-8.0.31.jar
),并上傳至所有 FE/BE 節(jié)點(diǎn)的/your_path/doris/jdbc_drivers
目錄。
步驟 3:配置驅(qū)動(dòng)路徑編輯fe.conf
和be.conf
,添加以下配置(如果你使用的是默認(rèn)的路徑就不需要修改這個(gè)了):
jdbc_drivers_dir = /opt/doris/jdbc_drivers
步驟 4:重啟服務(wù)
# 重啟FE cd /opt/doris/fe bin/stop_fe.sh && bin/start_fe.sh --daemon # 重啟BE cd /opt/doris/be bin/stop_be.sh && bin/start_be.sh --daemon
3.2 創(chuàng)建 JDBC Catalog
使用 MySQL 客戶(hù)端連接 Doris,執(zhí)行以下 SQL 創(chuàng)建 Catalog:
CREATE CATALOG mysql PROPERTIES ( "type"="jdbc", "user"="root", "password"="secret", "jdbc_url" = "jdbc:mysql://example.net:3306", "driver_url" = "mysql-connector-j-8.3.0.jar", "driver_class" = "com.mysql.cj.jdbc.Driver" )
jdbc_url
:MySQL 連接地址,可指定數(shù)據(jù)庫(kù)(如jdbc:mysql://host:port/dbname
)。
driver_url
:驅(qū)動(dòng)文件名,需與/opt/doris/jdbc_drivers
目錄下的文件一致,默認(rèn)就是/your_path/doris/jdbc_drivers
。
3.3 創(chuàng)建查詢(xún)或者導(dǎo)入
執(zhí)行聯(lián)邦查詢(xún)
-- 直接查詢(xún)mysql表 SELECT * FROM mysql_catalog.mysql_db.user_table LIMIT 10; -- 與Doris表關(guān)聯(lián)查詢(xún) SELECT a.id, a.name, b.sales FROM mysql_catalog.mysql_db.user_table a JOIN doris_table b ON a.id = b.user_id;
執(zhí)行數(shù)據(jù)導(dǎo)入
-- 建表 create table as select mysql_catalog.mysql_db.user_table -- 導(dǎo)入 insert into doris_table select * from mysql_catalog.mysql_db.user_table
4. 注意事項(xiàng)
數(shù)據(jù)類(lèi)型映射:
MySQL 的BIT
類(lèi)型映射為 Doris 的STRING
,需在查詢(xún)時(shí)轉(zhuǎn)換(如CAST(bit_col AS BOOLEAN)
)。
大字段類(lèi)型(如BLOB
)建議通過(guò)VARCHAR
映射,避免查詢(xún)性能問(wèn)題。
權(quán)限控制:
為 Doris 創(chuàng)建專(zhuān)用 MySQL 用戶(hù),僅授予SELECT
權(quán)限,避免數(shù)據(jù)泄露。
在 Doris 中通過(guò)GRANT
語(yǔ)句限制外部表訪問(wèn)權(quán)限。
連接安全
如果您使用數(shù)據(jù)源上安裝的全局信任證書(shū)配置了 TLS,則可以通過(guò)將參數(shù)附加到在 jdbc_url 屬性中設(shè)置的 JDBC 連接字符串來(lái)啟用集群和數(shù)據(jù)源之間的 TLS。
二、Binlog 實(shí)時(shí)同步方案(適合增量數(shù)據(jù)同步)
1. 方案概述
通過(guò) Canal 解析 MySQL Binlog,實(shí)時(shí)同步增量數(shù)據(jù)至 Doris,支持 INSERT/UPDATE/DELETE 操作,適用于實(shí)時(shí)數(shù)據(jù)倉(cāng)庫(kù)場(chǎng)景。
2. 環(huán)境要求
組件 | 版本要求 | 說(shuō)明 |
---|---|---|
MySQL | 5.7+ | 需開(kāi)啟 Binlog(ROW 模式) |
Canal | 1.1.5+ | 下載地址:Canal 官網(wǎng) |
Doris | 1.2.0+ | 支持 BATCH_DELETE 特性 |
3. 實(shí)施步驟
3.1 配置 MySQL 開(kāi)啟 Binlog
步驟 1:編輯 my.cnf
[mysqld] log-bin=mysql-bin # 開(kāi)啟Binlog binlog-format=ROW # 使用ROW模式 binlog-row-image=FULL # 記錄完整行數(shù)據(jù) server-id=1 # 唯一服務(wù)器ID
步驟 2:重啟 MySQL 服務(wù)
sudo systemctl restart mysqld
3.2 部署 Canal 服務(wù)
步驟 1:下載并解壓
wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz tar -zxvf canal.deployer-1.1.5.tar.gz
步驟 2:創(chuàng)建 Instance 配置
mkdir conf/demo cp conf/example/instance.properties conf/demo/ vim conf/demo/instance.properties
關(guān)鍵配置:
canal.instance.master.address=192.168.1.100:3306 # MySQL地址 canal.instance.dbUsername=canal # 具有Binlog讀取權(quán)限的用戶(hù) canal.instance.dbPassword=canal # 用戶(hù)密碼 canal.destination=demo # Instance名稱(chēng)
步驟 3:?jiǎn)?dòng) Canal
sh bin/startup.sh # 驗(yàn)證日志:cat logs/demo/demo.log,顯示"start successful"表示啟動(dòng)成功
3.3 在 Doris 中創(chuàng)建同步任務(wù)
步驟 1:創(chuàng)建 Doris 目標(biāo)表(需開(kāi)啟 BATCH_DELETE)
--create Mysql table CREATE TABLE `test.source_test` ( `id` int(11) NOT NULL COMMENT "", `name` int(11) NOT NULL COMMENT "" ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -- create Doris table CREATE TABLE `target_test` ( `id` int(11) NOT NULL COMMENT "", `name` int(11) NOT NULL COMMENT "" ) ENGINE=OLAP UNIQUE KEY(`id`) COMMENT "OLAP" DISTRIBUTED BY HASH(`id`) BUCKETS 8 PROPERTIES ( "replication_allocation" = "tag.location.default: 3" );
步驟 2:創(chuàng)建同步作業(yè)
CREATE SYNC demo_job ( FROM mysql.test_table INTO target_test (id, name) ) FROM BINLOG ( "type" = "canal", "canal.server.ip" = "192.168.1.101", # Canal服務(wù)器IP "canal.server.port" = "11111", # Canal默認(rèn)端口 "canal.destination" = "demo", # Canal Instance名稱(chēng) "canal.username" = "canal", "canal.password" = "canal", "sync.mode" = "incremental" # 增量同步模式 );
4. 注意事項(xiàng)
權(quán)限要求:需為 Canal 創(chuàng)建專(zhuān)用用戶(hù)(如 canal),并授予REPLICATION SLAVE
權(quán)限:
CREATE USER 'canal'@'%' IDENTIFIED BY 'canal'; GRANT REPLICATION SLAVE ON *.* TO 'canal'@'%'; FLUSH PRIVILEGES;
數(shù)據(jù)一致性:建議在 Doris 目標(biāo)表中使用UNIQUE KEY
模型,并確保 MySQL 源表與 Doris 表字段一一對(duì)應(yīng)。
三、Flink CDC 流式同步方案(適合高實(shí)時(shí)性場(chǎng)景)
1. 方案概述
基于 Flink CDC(Change Data Capture)實(shí)時(shí)捕獲 MySQL 變更數(shù)據(jù),通過(guò) Flink-Doris 連接器寫(xiě)入 Doris,支持秒級(jí)延遲,適用于實(shí)時(shí)分析、實(shí)時(shí)報(bào)表場(chǎng)景。
2. 環(huán)境要求
組件 | 版本要求 | 說(shuō)明 |
---|---|---|
Flink | 1.13+ | 支持 Flink CDC 2.0+ |
Doris | 1.2.0+ | 支持 Delete 操作 |
依賴(lài)庫(kù) | flink-cdc-2.1.0, flink-doris-connector-1.1.0 | 需下載對(duì)應(yīng)版本 JAR 包 |
3. 實(shí)施步驟
3.1 構(gòu)建 Flink 作業(yè)
步驟 1:添加 Maven 依賴(lài)
<dependency> <groupId>org.apache.doris</groupId> <artifactId>flink-doris-connector-1.16</artifactId> <version>25.1.0</version> </dependency>
步驟 2:編寫(xiě) Flink SQL 腳本
-- enable checkpoint SET 'execution.checkpointing.interval' = '30s'; -- 創(chuàng)建MySQL CDC源表 CREATE TABLE mysql_cdc_source ( id INT PRIMARY KEY NOT ENFORCED, name STRING, age INT, ts TIMESTAMP(3) METADATA FROM 'source_ts' VIRTUAL ) WITH ( 'connector' = 'mysql-cdc', 'hostname' = '192.168.1.100', 'port' = '3306', 'username' = 'root', 'password' = 'your_mysql_password', 'database-name' = 'test', 'table-name' = 'user_table' ); -- 創(chuàng)建Doris目標(biāo)表 CREATE TABLE doris_sink ( id INT, name STRING, age INT, update_time TIMESTAMP(3) ) WITH ( 'connector' = 'doris', 'fenodes' = 'doris-fe:8030', 'table.identifier' = 'test.user_table', 'username' = 'root', 'password' = '', 'sink.properties.format' = 'json', 'sink.enable-delete' = 'true', 'sink.label-prefix' = 'flink_cdc_' ); -- 啟動(dòng)數(shù)據(jù)同步 INSERT INTO doris_sink SELECT id, name, age, ts FROM mysql_cdc_source;
3.2 提交 Flink 作業(yè)
<FLINK_HOME>bin/flink run \ -Dexecution.checkpointing.interval=10s \ -Dparallelism.default=1 \ -c org.apache.doris.flink.tools.cdc.CdcTools \ lib/flink-doris-connector-1.16-24.0.1.jar \ mysql-sync-database \ --database test_db \ --mysql-conf hostname=127.0.0.1 \ --mysql-conf port=3306 \ --mysql-conf username=root \ --mysql-conf password=123456 \ --mysql-conf database-name=mysql_db \ --including-tables "tbl1|test.*" \ --sink-conf fenodes=127.0.0.1:8030 \ --sink-conf username=root \ --sink-conf password=123456 \ --sink-conf jdbc-url=jdbc:mysql://127.0.0.1:9030 \ --sink-conf sink.label-prefix=label \ --table-conf replication_num=1
4. 注意事項(xiàng)
并行度優(yōu)化:根據(jù) MySQL 表數(shù)量和數(shù)據(jù)量調(diào)整 Flink 作業(yè)并行度,避免單任務(wù)壓力過(guò)大。
寫(xiě)入機(jī)制:開(kāi)啟 Flink Checkpoint,Doris Flink Connector 提供了兩種攢批模式,默認(rèn)使用基于 Flink Checkpoint 的流式寫(xiě)入方式。
寫(xiě)入方式 | 流式寫(xiě)入 | 批量寫(xiě)入 |
---|---|---|
觸發(fā)條件 | 依賴(lài) Flink 的 Checkpoint,跟隨 Flink 的 Checkpoint 周期寫(xiě)入到 Doris 中 | 基于 Connector 內(nèi)的時(shí)間閾值、數(shù)據(jù)量閾值進(jìn)行周期性提交,寫(xiě)入到 Doris 中 |
一致性 | Exactly-Once | At-Least-Once,基于主鍵模型可以保證 Exactly-Once |
延遲 | 受 Checkpoint 時(shí)間間隔限制,通常較高 | 獨(dú)立的批處理機(jī)制,靈活調(diào)整 |
容錯(cuò)與恢復(fù) | 與 Flink 狀態(tài)恢復(fù)完全一致 | 依賴(lài)外部去重邏輯(如 Doris 主鍵去重) |
四、Datax 同步方案(適合全量 / 批量數(shù)據(jù)遷移)
1. 方案概述
Datax 是一款異構(gòu)數(shù)據(jù)源之間數(shù)據(jù)同步工具,通過(guò)編寫(xiě) JSON 格式的配置文件,實(shí)現(xiàn) MySQL 與 Doris 之間的數(shù)據(jù)抽取、轉(zhuǎn)換和加載(ETL)。該方案適用于全量數(shù)據(jù)遷移、定期批量數(shù)據(jù)同步場(chǎng)景,對(duì)實(shí)時(shí)性要求不高,但配置靈活,可自定義數(shù)據(jù)處理邏輯。
2. 環(huán)境要求
組件 | 版本要求 | 說(shuō)明 |
---|---|---|
Datax | 3.0+ | 下載地址:Datax 官網(wǎng) |
MySQL | 5.6+ | 支持標(biāo)準(zhǔn) JDBC 協(xié)議 |
Doris | 1.0+ | 支持通過(guò) JDBC 或 Broker 導(dǎo)入數(shù)據(jù) |
3. 實(shí)施步驟
3.1 安裝 Datax
# 下載Datax壓縮包 wget https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202308/datax.tar.gz tar -zxvf datax.tar.gz
3.2 編寫(xiě)同步配置文件
創(chuàng)建mysql_to_doris.json
文件,示例配置如下:
{ "job": { "content": [ { "reader": { "name": "mysqlreader", "parameter": { "column": [xxx], "connection": [ { "jdbcUrl": ["jdbc:mysql://localhost:3306/demo"], "table": ["table_name"] } ], "username": "root", "password": "xxxxx", "where": "" } }, "writer": { "name": "doriswriter", "parameter": { "loadUrl": ["127.0.0.1:8030"], "column": [xxxx], "username": "root", "password": "xxxxxx", "postSql": ["select count(1) from table_name"], "preSql": [], "flushInterval":30000, "connection": [ { "jdbcUrl": "jdbc:mysql://127.0.0.1:9030/demo", "selectedDatabase": "demo", "table": ["table_name"] } ], "loadProps": { "format": "json", "strip_outer_array":"true", "line_delimiter": "\\x02" } } } } ], "setting": { "speed": { "channel": "1" } } } }
3.3 執(zhí)行同步任務(wù)
python bin/datax.py mysql_to_doris.json
4. 注意事項(xiàng)
數(shù)據(jù)類(lèi)型映射:確保 MySQL 與 Doris 字段類(lèi)型兼容,如 MySQL 的DATETIME
對(duì)應(yīng) Doris 的DATETIME
,避免類(lèi)型轉(zhuǎn)換錯(cuò)誤。
性能調(diào)優(yōu):通過(guò)調(diào)整channel
參數(shù)控制并發(fā)度,但過(guò)高的并發(fā)可能導(dǎo)致資源耗盡,建議根據(jù)數(shù)據(jù)庫(kù)負(fù)載測(cè)試后設(shè)置。
五、方案對(duì)比與選型建議
方案 | 適用場(chǎng)景 | 復(fù)雜度 | 資源依賴(lài) |
---|---|---|---|
JDBC Catalog | 跨庫(kù)實(shí)時(shí)查詢(xún)、聯(lián)邦分析 | ★★☆☆☆ | 依賴(lài) Doris JDBC 功能 |
Binlog 同步 | 增量數(shù)據(jù)實(shí)時(shí)同步 | ★★★☆☆ | 需部署 Canal 及相關(guān)組件 |
Flink CDC 同步 | 高實(shí)時(shí)性流式處理、復(fù)雜清洗 | ★★★★☆ | 依賴(lài) Flink 集群 |
Datax 同步 | 全量 / 批量數(shù)據(jù)遷移、離線同步 | ★★★☆☆ | 輕量級(jí)工具,獨(dú)立部署 |
優(yōu)先選擇 JDBC Catalog:當(dāng)需要快速驗(yàn)證跨庫(kù)查詢(xún)功能,或需要與 Doris 本地表進(jìn)行關(guān)聯(lián)分析時(shí)。
推薦 Binlog 同步:常規(guī)增量同步場(chǎng)景,兼顧實(shí)時(shí)性和部署復(fù)雜度。
選擇 Flink CDC:對(duì)實(shí)時(shí)性要求高(如實(shí)時(shí)看板),或需要復(fù)雜數(shù)據(jù)清洗(通過(guò) Flink SQL 實(shí)現(xiàn))。
使用 Datax 同步:適合一次性全量遷移,或周期性批量同步歷史數(shù)據(jù)。
五、數(shù)據(jù)遷移最佳實(shí)踐要點(diǎn)
全量初始化與增量同步結(jié)合:
首次遷移時(shí),先通過(guò)DataX
導(dǎo)入 MySQL 全量數(shù)據(jù),再啟動(dòng) Binlog 或 Flink CDC 同步增量數(shù)據(jù),避免歷史數(shù)據(jù)積壓。
數(shù)據(jù)類(lèi)型兼容性測(cè)試:
重點(diǎn)驗(yàn)證 MySQL 的ENUM
、SET
、BIT
等類(lèi)型在 Doris 中的映射是否符合預(yù)期。
監(jiān)控與告警體系:
結(jié)合 Prometheus + Grafana 監(jiān)控或者Doris Manager工具觀察資源使用情況。
這份文檔已涵蓋多種遷移方式。若還想對(duì)某個(gè)遷移方式補(bǔ)充更多細(xì)節(jié),或增加其他方面的內(nèi)容,歡迎討論。
到此這篇關(guān)于MySQL 遷移至 Doris 最佳實(shí)踐方案的文章就介紹到這了,更多相關(guān)MySQL 遷移至 Doris內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql 操作總結(jié) INSERT和REPLACE
用于操作數(shù)據(jù)庫(kù)的SQL一般分為兩種,一種是查詢(xún)語(yǔ)句,也就是我們所說(shuō)的SELECT語(yǔ)句,另外一種就是更新語(yǔ)句,也叫做數(shù)據(jù)操作語(yǔ)句。2009-07-07MySQL中一條update語(yǔ)句是如何執(zhí)行的
這篇文章主要給大家介紹了關(guān)于MySQL中一條update語(yǔ)句是如何執(zhí)行的相關(guān)資料,由于update涉及到數(shù)據(jù)的修改,所以很容易推斷,update語(yǔ)句比select語(yǔ)句會(huì)更復(fù)雜一些,需要的朋友可以參考下2022-03-03linux環(huán)境下安裝mysql數(shù)據(jù)庫(kù)的詳細(xì)教程
這篇文章主要介紹了linux環(huán)境下安裝mysql數(shù)據(jù)庫(kù)的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06mysql5.7.18.zip免安裝版本配置教程(windows)
這篇文章主要為大家詳細(xì)介紹了mysql5.7.18.zip安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05mysql查找刪除表中重復(fù)數(shù)據(jù)方法總結(jié)
在本篇文章中小編給大家整理了關(guān)于mysql查找刪除表中重復(fù)數(shù)據(jù)方法和相關(guān)知識(shí)點(diǎn),需要的朋友們參考下。2019-05-05