資料同步:教你如何實時把資料從 MySQL 同步到 OceanBase
作者簡介:海芊,一個對技術充滿熱情的文件工程師。
背景介紹
我們都知道,很多使用者並不是一開始就是使用 OceanBase 的。所以在他們決定使用 OceanBase 的時候,一定要把之前的業務資料遷移到 OceanBase 上來。如果是全量資料遷移,可以藉助離線資料同步工具 DataX 。但是,如果在全量遷移過程中業務產生了新資料,這些新資料又如何遷移呢?此時就需要對資料進行增量遷移。這也是本文的主題:如何使用資料同步工具 Canal 實時把資料從 MySQL 同步到 OceanBase 。
【特別說明】這個教程使用的都是單機部署,只能用來演示。生產環境多為分散式叢集部署。 Canal 的部署也是支援叢集的,需要配合 ZooKeeper 進行叢集管理。
P.S. 配合影片教程一起食用效果更佳噢~~影片教程,點選 OceanBase 監控工具 OceanBaseAgent 。
Canal 介紹
那麼什麼是 Canal 呢?官方給出的解釋, Canal 是個資料同步工具,主要用途是基於 MySQL 資料庫增量日誌解析,提供增量資料訂閱和消費。基於日誌增量訂閱和消費,Canal 有以下功能:
- 資料庫映象
- 資料庫實時備份
- 索引構建和實時維護(拆分異構索引、倒排索引等)
- 業務 cache 重新整理
- 帶業務邏輯的增量資料處理
忽略官方的解釋,通俗來說, Canal 就是一個資料同步工具。它能讓 MySQL 和 OceanBase 建立聯絡,你在 MySQL 上進行的 DDL 、DML 操作,都能同步到 OceanBase 上。當然前提是 SQL 是兩個資料庫都支援的語法。
Canal 工作原理
MySQL master 將資料變更寫入二進位制日誌( binary log , 其中記錄叫做二進位制日誌事件 binary log events ,可以透過 show binlog events 進行檢視)
- MySQL slave 將 master 的 binary log events 複製到它的中繼日誌( relay log )
- MySQL slave 重放 relay log 中事件,將資料變更反映它自己的資料
- canal 模擬 MySQL slave 的互動協議,偽裝自己為 MySQL slave ,向 MySQL master 傳送dump 協議
- MySQL master 收到 dump 請求,開始推送 binary log 給 slave (即 canal )
- canal 解析 binary log 物件(原始為 byte 流)
以上內容部分摘自 Canal 官方 GitHub 倉庫,更多資訊,檢視 Canal GitHub 倉庫 。
操作步驟
從 MySQL 增量同步資料到 OceanBase 總共分 3 步:
- 第 1 步,設定 MySQL
- 第 2 步,部署 Canal
- 第 3 步,寫一些資料,測試實時同步功能
接下來我們按照上述步驟,來一起試一把資料同步。
第 1 步:設定 MySQL
MySQL 的安裝本文就不介紹了,比較簡單,網上也有很多教程。對於自建 MySQL ,需要先開啟 Binlog 寫入功能,開啟 my.cnf 配置檔案:
# 開啟配置檔案vim /etc/my.cnf
新增這些配置:
[mysqld]log-bin=mysql-bin # 開啟 binlogbinlog-format=ROW # 選擇 ROW 模式server_id=1 # 配置 MySQL replaction 需要定義,不要和 canal 的 slaveId 重複
更改配置之後需要重啟 MySQL 新的配置才能生效。連線 MySQL ,檢視是否生效:
mysql -uroot -p
可以看到此時 log_bin 已經開啟,並且 binlog_format 的值為 ROW 。
mysql> show variables like 'log_bin'; +---------------+-------+| Variable_name | Value | +---------------+-------+| log_bin | ON | +---------------+-------+mysql> show variables like 'binlog_format'; +---------------+-------+| Variable_name | Value | +---------------+-------+| binlog_format | ROW | +---------------+-------+
現在建立 Canal 使用者:
# 建立 Canal 使用者CREATE USER canal IDENTIFIED BY 'Canal123';
這裡說一個我踩的坑,在設定密碼時,如果不滿足當前密碼強度規則,會報錯:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
我們看看當前密碼強度規則:
SHOW VARIABLES LIKE 'validate_password%';
密碼包括 1 個特殊字元,按照要求重置密碼,成功
CREATE USER canal IDENTIFIED BY 'Canal@123'; Query OK, 0 rows affected (0.00 sec)
# 現在為 canal 使用者授權,*.* 表示所有庫GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; -- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ; FLUSH PRIVILEGES;
第 2 步:部署 Canal
本文使用的 Canal 是 OceanBase 的定製版本,詳細資訊,參考 Canal for OceanBase。
部署 Canal Deployer
Canal Deployer 是 Canal 的 server 端,它用來進行 binlog 到 CanalEntry 的轉換。來到 Canal for OceanBase 倉庫的 Rlease 頁面,下載 Deployer 的安裝包。然後建立解壓目錄並解壓:
mkdir /tmp/canal2 tar zxvf canal.deployer-$version.tar.gz -C /tmp/canal2
來到安裝目錄,檢視目錄結構:
cd /tmp/canal ls bin :canal啟動、重啟、停止檔案 conf :canal配置檔案lib :canal執行所需的jar包,注意資料庫驅動包版本,可手動更換logs :canal執行日誌 plugin :一些擴充套件包,如訊息佇列
修改例項屬性配置檔案
vi conf/example/instance.properties
這裡只介紹我用到的配置,我們把使用者名稱、密碼改了就行
# username/passwordcanal.instance.dbUsername=canalcanal.instance.dbPassword=Canal@123
啟動 Canal:
sh bin/startup.sh
注意 Canal 啟動需要安裝 JAVA JDK,安裝命令如下:
yum install java-1.8.0-openjdk* -y
生產環境建議用二進位制包裝,這樣不會影響其他使用者。解壓以後配置環境變數就可以了。
現在檢視日誌,看看 Canal 有沒有啟動成功:
vi logs/canal/canal.log# 檢視 Canal 例項的日誌 vi logs/example/example.log
透過日誌,我們看到已經啟動成功,接下來我們部署 Canal Adaptor。
部署 Canal Adaptor
Canal Adapter 是 Canal 的客戶端介面卡,它用來解析 CanalEntry 並將增量變動同步到目的端。還是從剛才提到的 Release 頁面,下載對應的包,解壓方式同上。我們直接來到安裝目錄,修改啟動器配置檔案,還是隻介紹我用到的配置:
vim conf/application.yml canalAdapters:- instance: example # canal instance Name or mq topic namegroups:- groupId: g1outerAdapters:- name: logger- name: rdb # 指定為 rdb 型別同步key: mysql1 # 指定 adapter 的唯一 key, 與表對映配置中 outerAdapterKey 對應properties:jdbc.driverClassName: com.mysql.jdbc.Driverjdbc.url: jdbc:mysql://127.0.0.1:2881/amber?useUnicode=true #這裡amber是待同步的database名稱jdbc.username: root@amber_babe # jdbc username,ob的使用者@業務租戶,建立業務租戶我就不演示了jdbc.password: root # jdbc password ob業務租戶密碼
預設的配置是註釋的,我們需要開啟。由於社群版 OceanBase 完全相容 MySQL 協議,因此在使用時,將其視為 MySQL 配置即可。Adapter 服務在啟動時,會載入對應型別 Adapter 配置目錄(此處即conf/rdb/)下的所有配置檔案。表對映有兩種配置形式:按表對映同步和整庫同步。我們直接同步資料庫映象,因為生產環境往往有多個表需要同步,修改 RDB 表對映檔案有點麻煩。
vim conf/rdb/mytest_user.yml## Mirror schema synchronize configdataSourceKey: defaultDSdestination: examplegroupId: g1outerAdapterKey: mysql1concurrent: truedbMapping:mirrorDb: truedatabase: amber # 只改這個,需要源庫、目標庫一模一樣
第 3 步:同步資料
建立 database 和 table 我就不演示了,我們直接測試資料同步:
開啟一個新的視窗,把日誌列印出來,這樣方便在插入資料時看到日誌的變化。
tail -f x.log
可以看到,左側插入的資料
mysql> insert into amber1 values (7,8);
已經同步過來了,詳情見螢幕右側的日誌。此時,你也可以連線到 OceanBase ,確認資料是不是真的同步過來了。
寫在最後
最後,來個小彩蛋, canal 的正確讀法是 [kə'næl] ,是運河的意思,比如著名的 Panama Canal(巴拿馬運河)。我發現很多小夥伴會讀成 ['kænəl] ,記住是 [kə'næl] 哦,重音在後面啦~~
參與更多技術交流,請至 OceanBase 社群版 。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69909943/viewspace-2842779/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 到Oracle 實時資料同步HYXSMySqlOracle
- Mysql資料實時同步實踐MySql
- MySQL 資料主從同步MySql主從同步
- 透過 Canal 將 MySQL 資料實時同步到 EasysearchMySql
- 如何將本地資料同步到 shopify 或 shopify 資料同步到本地
- [資料庫]MYSQL主從同步資料庫MySql主從同步
- flnkcdc+datastream實現mysql到mysql資料同步ASTMySql
- Mysql 到 Hbase 資料如何實時同步,強大的 Streamsets 告訴你MySql
- 如何把資料從Mysql匯入到GreenplumMySql
- 阿里 Canal 實時同步 MySQL 增量資料至 ClickHouse 資料庫阿里MySql資料庫
- DataX將MySql資料庫資料同步到Oracle資料庫MySql資料庫Oracle
- 【PG】mysql時時同步資料至greenplumMySql
- 什麼是資料實時同步,為什麼資料實時同步很重要
- mysql到sqlserver資料庫實時同步工具syncnavigator註冊使用MySqlServer資料庫
- mysql和redis實時同步資料怎麼實現MySqlRedis
- Mysql主主同步-配置資料同步MySql
- clickhouse 同步mysql資料MySql
- 資料傳輸 | 利用 DTLE 將 MySQL 資料同步到 DBLEMySql
- 教你如何運用python實現不同資料庫間資料同步功能Python資料庫
- 如何高效實現 MySQL 與 elasticsearch 的資料同步MySqlElasticsearch
- MYSQL資料庫主從同步(一主一從)MySql資料庫主從同步
- TiDB 作為 MySQL Slave 實現實時資料同步TiDBMySql
- canal+mysql+kafka實時資料同步安裝、配置MySqlKafka
- Mysql 資料庫主庫,備庫實時同步配置MySql資料庫
- kettle 實時同步資料(插入/更新/刪除資料)
- mysql資料庫資料同步/主從複製的配置方法MySql資料庫
- oracle佇列(AQ)---實現orale到mysql的資料同步Oracle佇列MySql
- clickhouse-mysql資料同步MySql
- mysql資料同步至redisMySqlRedis
- ogg在異構資料庫實時雙向同步中如何防止資料死迴圈同步資料庫
- MySQL-主從複製之同步主從資料MySql
- 認識資料實時同步神器—Canal
- rsync+inotify資料的實時同步
- 聊聊如何將資料同步到apollo配置中心
- 使用canal增量同步mysql資料庫資訊到ElasticSearchMySql資料庫Elasticsearch
- 高效整合:聚水潭採購資料同步到MySQLMySql
- docker基礎:mysql容器建立,時間同步,掛載到資料夾DockerMySql
- mysql伺服器主從資料庫同步配置MySql伺服器資料庫