資料同步:教你如何實時把資料從 MySQL 同步到 OceanBase

OceanBase資料庫發表於2021-11-17
作者簡介:海芊,一個對技術充滿熱情的文件工程師。

背景介紹

我們都知道,很多使用者並不是一開始就是使用 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 同步到 OceanBase

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

資料同步:教你如何實時把資料從 MySQL 同步到 OceanBase

注意 Canal 啟動需要安裝 JAVA JDK,安裝命令如下:

yum install java-1.8.0-openjdk* -y

生產環境建議用二進位制包裝,這樣不會影響其他使用者。解壓以後配置環境變數就可以了。

現在檢視日誌,看看 Canal 有沒有啟動成功:

vi logs/canal/canal.log# 檢視 Canal 例項的日誌
vi logs/example/example.log

資料同步:教你如何實時把資料從 MySQL 同步到 OceanBase

透過日誌,我們看到已經啟動成功,接下來我們部署 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 同步到 OceanBase

可以看到,左側插入的資料

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章