Apache Doris 代碼倉庫地址:apache/incubator-doris 歡迎大家關(guān)注加星
1. 安裝配置 Mysql
-
安裝Mysql
快速使用Docker安裝配置Mysql议惰,具體參照下面的連接
https://segmentfault.com/a/1190000021523570
如果是在物理機上安裝可以參考下面的連接:
-
開啟Mysql binlog
進入 Docker 容器或者物理機上修改/etc/my.cnf 文件,在 [mysqld] 下面添加以下內(nèi)容,
log_bin=mysql_bin binlog-format=Row server-id=1
然后重啟Mysql
systemctl restart mysqld
-
創(chuàng)建 Mysql 表
create database demo; CREATE TABLE `test_cdc` ( `id` int NOT NULL AUTO_INCREMENT, `sex` TINYINT(1) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `address` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB
2. 安裝配置Canal
下載canal-1.1.5: https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz
-
解壓Canal到指定目錄:
tar zxvf canal.deployer-1.1.5.tar.gz -C ./canal
-
在conf文件夾下新建目錄并重命名拒逮,作為instance的根目錄巡雨,目錄名你可以自己命名便于識別即可
例如我這里的命名是和我的數(shù)據(jù)庫庫名一致:demo
vi conf/demo/instance.properties
下面給出的是一個我的示例配置:
這里面的參數(shù)說明請參考Canal官方文檔:QuickStart
################################################# ## mysql serverId , v1.0.26+ will autoGen canal.instance.mysql.slaveId=12115 # enable gtid use true/false canal.instance.gtidon=false # position info canal.instance.master.address=10.220.146.11:3306 canal.instance.master.journal.name= canal.instance.master.position= canal.instance.master.timestamp= canal.instance.master.gtid= # rds oss binlog canal.instance.rds.accesskey= canal.instance.rds.secretkey= canal.instance.rds.instanceId= # table meta tsdb info canal.instance.tsdb.enable=true #canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb #canal.instance.tsdb.dbUsername=canal #canal.instance.tsdb.dbPassword=canal #canal.instance.standby.address = #canal.instance.standby.journal.name = #canal.instance.standby.position = #canal.instance.standby.timestamp = #canal.instance.standby.gtid= # username/password canal.instance.dbUsername=zhangfeng canal.instance.dbPassword=zhangfeng800729)(*Q canal.instance.connectionCharset = UTF-8 # enable druid Decrypt database password canal.instance.enableDruid=false #canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ== # table regex canal.instance.filter.regex=demo\\..* # table black regex canal.instance.filter.black.regex= # table field filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2) #canal.instance.filter.field=test1.t_product:id/subject/keywords,test2.t_company:id/name/contact/ch # table field black filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2) #canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch # mq config #canal.mq.topic= # dynamic topic route by schema or table regex #canal.mq.dynamicTopic=mytest1.user,mytest2\\..*,.*\\..* #canal.mq.partition=0 # hash partition config #canal.mq.partitionsNum=3 #canal.mq.partitionHash=test.table:id^name,.*\\..* #################################################
-
啟動Canal
sh bin/startup.sh
注意:canal instance user/passwd
1.1.5 版本,在canal.properties里加上這兩個配置
canal.user = canal canal.passwd = E3619321C1A937C46A0D8BD1DAC39F93B27D4458
默認密碼為canal/canal,canal.passwd的密碼值可以通過select password(“xxx”) 來獲取
-
驗證是否啟動成功
tail -200f logs/demo/demo.log
image-20211110145044815
3.開始同步數(shù)據(jù)
3.1 創(chuàng)建Doris目標(biāo)表
用戶需要先在Doris端創(chuàng)建好與Mysql端對應(yīng)的目標(biāo)表
Binlog Load只能支持Unique類型的目標(biāo)表阱扬,且必須激活目標(biāo)表的Batch Delete功能馍刮。
開啟Batch Delete的方法可以參考help alter table
中的批量刪除功能。
CREATE TABLE `doris_mysql_binlog_demo` (
`id` int NOT NULL,
`sex` TINYINT(1),
`name` varchar(20),
`address` varchar(255)
) ENGINE=OLAP
UNIQUE KEY(`id`,sex)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`sex`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 3",
"in_memory" = "false",
"storage_format" = "V2"
);
-- enable batch delete
ALTER TABLE test_2.doris_mysql_binlog_demo ENABLE FEATURE "BATCH_DELETE";
3.1 創(chuàng)建同步作業(yè)
3.1.1 Create Sync Job 語法說明
Name: ‘CREATE SYNC JOB’ Description:
數(shù)據(jù)同步(Sync Job)功能,支持用戶提交一個常駐的數(shù)據(jù)同步作業(yè)亡脸,通過從指定的遠端地址讀取Binlog日志,增量同步用戶在Mysql數(shù)據(jù)庫的對數(shù)據(jù)更新操作的CDC(Change Data Capture)功能垂谢。
目前數(shù)據(jù)同步作業(yè)只支持對接Canal,從Canal Server上獲取解析好的Binlog數(shù)據(jù),導(dǎo)入到Doris內(nèi)鹃栽。
用戶可通過 SHOW SYNC JOB
查看數(shù)據(jù)同步作業(yè)狀態(tài)薇芝。
語法:
CREATE SYNC [db.]job_name
(
channel_desc,
channel_desc
...
)
binlog_desc
-
job_name
同步作業(yè)名稱饮亏,是作業(yè)在當(dāng)前數(shù)據(jù)庫內(nèi)的唯一標(biāo)識荐开,相同
job_name
的作業(yè)只能有一個在運行。 -
channel_desc
作業(yè)下的數(shù)據(jù)通道能扒,用來描述mysql源表到doris目標(biāo)表的映射關(guān)系。
語法:
FROM mysql_db.src_tbl INTO des_tbl [partitions] [columns_mapping]
-
mysql_db.src_tbl
指定mysql端的數(shù)據(jù)庫和源表见秤。
-
des_tbl
指定doris端的目標(biāo)表瀑粥,只支持Unique表狞换,且需開啟表的batch delete功能(開啟方法請看help alter table的’批量刪除功能’)路媚。
-
partitions
指定導(dǎo)入目的表的哪些 partition 中脏款。如果不指定撤师,則會自動導(dǎo)入到對應(yīng)的 partition 中。
示例:
PARTITION(p1, p2, p3)
-
column_mapping
指定mysql源表和doris目標(biāo)表的列之間的映射關(guān)系衰伯。如果不指定库倘,F(xiàn)E會默認源表和目標(biāo)表的列按順序一一對應(yīng)。
不支持 col_name = expr 的形式表示列彪笼。
示例:
假設(shè)目標(biāo)表列為(k1, k2, v1), 改變列k1和k2的順序 COLUMNS(k2, k1, v1) 忽略源數(shù)據(jù)的第四列 COLUMNS(k2, k1, v1, dummy_column)
-
-
binlog_desc
用來描述遠端數(shù)據(jù)源配猫,目前僅支持canal一種幅恋。
語法:
FROM BINLOG ( "key1" = "value1", "key2" = "value2" )
-
Canal 數(shù)據(jù)源對應(yīng)的屬性,以
canal.
為前綴- canal.server.ip: canal server的地址
- canal.server.port: canal server的端口
- canal.destination: instance的標(biāo)識
- canal.batchSize: 獲取的batch大小的最大值泵肄,默認8192
- canal.username: instance的用戶名
- canal.password: instance的密碼
- canal.debug: 可選捆交,設(shè)置為true時,會將batch和每一行數(shù)據(jù)的詳細信息都打印出來 Examples:
-
-
簡單為
test_db
的test_tbl
創(chuàng)建一個名為job1
的數(shù)據(jù)同步作業(yè)腐巢,連接本地的Canal服務(wù)器品追,對應(yīng)Mysql源表mysql_db1.tbl1
。CREATE SYNC `test_db`.`job1` ( FROM `mysql_db1`.`tbl1` INTO `test_tbl ` ) FROM BINLOG ( "type" = "canal", "canal.server.ip" = "127.0.0.1", "canal.server.port" = "11111", "canal.destination" = "example", "canal.username" = "", "canal.password" = "" );
-
為
test_db
的多張表創(chuàng)建一個名為job1
的數(shù)據(jù)同步作業(yè)冯丙,一一對應(yīng)多張Mysql源表肉瓦,并顯式的指定列映射。CREATE SYNC `test_db`.`job1` ( FROM `mysql_db`.`t1` INTO `test1` COLUMNS(k1, k2, v1) PARTITIONS (p1, p2), FROM `mysql_db`.`t2` INTO `test2` COLUMNS(k3, k4, v2) PARTITION p1 ) FROM BINLOG ( "type" = "canal", "canal.server.ip" = "xx.xxx.xxx.xx", "canal.server.port" = "12111", "canal.destination" = "example", "canal.username" = "username", "canal.password" = "password" );
3.1.2 開始同步mysql表里數(shù)據(jù)到Doris
注意:
創(chuàng)建同步任務(wù)之前,首先要在fe.conf里配置enable_create_sync_job=true泞莉,這個默認是false不啟用洁墙,否則就不能創(chuàng)建同步任務(wù)
CREATE SYNC test_2.doris_mysql_binlog_demo_job
(
FROM demo.test_cdc INTO doris_mysql_binlog_demo
)
FROM BINLOG
(
"type" = "canal",
"canal.server.ip" = "10.220.146.10",
"canal.server.port" = "11111",
"canal.destination" = "demo",
"canal.username" = "canal",
"canal.password" = "canal"
);
3.1.3 查看同步任務(wù)
SHOW SYNC JOB from test_2;
3.1.4 查看表里的數(shù)據(jù)
select * from doris_mysql_binlog_demo;
3.1.5 刪除數(shù)據(jù)
我們在Mysql 數(shù)據(jù)表里刪除數(shù)據(jù)笤妙,然后看Doris表里的變化
delete from test_cdc where id in (12,13)
我們在去看Doris表里响迂,id是12,13這兩條數(shù)據(jù)已經(jīng)被刪除
3.1.6 多表同步
多表同步只需要像下面這樣寫法就可以了
CREATE SYNC test_2.doris_mysql_binlog_demo_job
(
FROM demo.test_cdc INTO doris_mysql_binlog_demo,
FROM demo.test_cdc_1 INTO doris_mysql_binlog_demo,
FROM demo.test_cdc_2 INTO doris_mysql_binlog_demo,
FROM demo.test_cdc_3 INTO doris_mysql_binlog_demo
)