文章目錄
一 3w分析及原理運行機制說明
首先, 在瞭解問題答案之前, 依據3w法則分析一波Otter/Canal。瞭解了這些更有利於我們解決相關的問題。
why: 爲什麼要用 ?
簡而言之,在數據同步這塊兒,目前獨樹一幟、功能強大、場景覆蓋面廣。
1. 異構庫同步
a. mysql -> mysql/oracle. (目前開源版本只支持mysql增量,目標庫可以是mysql或者oracle,取決於
canal的功能)
2. 單機房同步 (數據庫之間RTT < 1ms)
a. 數據庫版本升級
b. 數據表遷移
c. 異步二級索引
3. 異地機房同步 (比如阿里巴巴國際站就是杭州和美國機房的數據庫同步,RTT > 200ms,亮點)
a. 機房容災
4. 雙向同步
a. 避免迴環算法 (通用的解決方案,支持大部分關係型數據庫)
b. 數據一致性算法 (保證雙A機房模式下,數據保證最終一致性,亮點)
5. 文件同步
a. 站點鏡像 (進行數據複製的同時,複製關聯的圖片,比如複製產品數據,同時複製產品圖片).
how怎麼用?
安裝完之後在Web界面可以配置主庫從庫的信息,Canal、Pipeline等信息,此外還需要主庫開啓binlog模式,開通具有salve權限的賬號等,之後就可以很輕鬆在web頁面使用數據同步的功能,後文將會詳細解析搭建及配置的具體情況。
what是什麼?
Canal屬於Otter的一個核心組件, Otter除使用了Canal還使用了Node、Manager、Zookeeper等以支持了圖形化界面、多節點同步,分佈式協調等功能。它能更便捷的利用數據庫主從複製的特性,準實時同步增量日誌到本機房或異地機房,更便捷的利用到數據同步的場景。簡而言之,就是搞數據同步的非常棒的一個開源項目。
原理及運行機制:
說明:爲了更好的支持系統的擴展性和靈活性,將整個同步流程抽象爲Select/Extract/Transform/Load,這麼4個階段。
Select階段: 爲解決數據來源的差異性,比如接入canal獲取增量數據,也可以接入其他系統獲取其他數據等。
Extract/Transform/Load 階段:類似於數據倉庫的ETL模型,具體可爲數據join,數據轉化,數據Load等。
-
基於Canal開源產品,獲取數據庫增量日誌數據。 什麼是Canal, 請點擊
-
典型管理系統架構,manager(web管理)+node(工作節點)
a. manager運行時推送同步配置到node節點
b. node節點將同步狀態反饋到manager上
-
基於zookeeper,解決分佈式狀態調度的,允許多node節點之間協同工作。
特性:
- 使用純 Java 開發,佔時資源比較高
- 基於Canal獲取數據庫增量日誌,Canal是阿里爸爸另外一個開源產品
- 使用manager(web管理)+node(工作節點),manager負責配置監控,node負責處理任務
- 基於zookeeper,解決分佈式狀態調度的,允許多node節點之間協同工作
- 使用aria2多線程傳輸技術,對網絡依賴帶寬依賴較低
缺點:
Otter使用的技術棧較老,且官方社區目前不是很活躍。
官方文檔不夠詳細且很久沒有更新了,學習成本較高。
二 Otter搭建
Otter依賴aria2、Manager、Node、Mysql、Zookeeper等,
-
Manager:Web管理頁面
-
Node:工作節點
-
Mysql:存儲依賴的表數據
-
Zookeeper:解決分佈式狀態調度的,允許多node節點之間協同工作
-
aria2:是一個文件通道來保證需要同步的數據通過極快的速度同步到需要同步的服務器上
官方提供了兩種搭建方式,一種是Docker部署,一種是Release包部署,這裏筆者兩種方式都會做相應說明。
1.Docker部署
//拉取鏡像
docker pull canal/otter-all
//腳本啓動
curl -fsSL https://raw.githubusercontent.com/alibaba/otter/master/docker/run.sh | bash
端口默認8080, 賬號密碼默認是admin/admin。啓動完成訪問 http://localhost:8080 ,界面如下:
Dockerfile及啓動腳本說明:
https://github.com/alibaba/otter/wiki/Docker_QuickStart
上述安裝方式包含了otter所依賴的所有組件,比如mysql、zookeeper、manager、node、aria2等,幾個組件的互相依賴的配置都已經初始化完成。
整個鏡像設計爲單機的QuickStart啓動模式,全部都是單點啓動,並沒有高可用的能力。如果需要高可用的組件,可以藉助k8s做docker節點的高可用調度,或者參考Dockerfile按照業務需求改造爲多docker協同部署的模式。
注意事項:
默認的鏡像啓動失敗概率較大,原因是因爲依賴的組件可能會因爲宿主機的服務佔用了相關端口導致啓動失敗。
此外該鏡像均設計爲單點啓動, 更適合利用在測試的場景上。爲確保上述方式成功,儘量保證服務器預留3306、2181、8080、8081、2088、2089、2090等鏡像啓動內置的端口。
2.Release包部署
這種部署方式需要單獨部署mysql、zookeeper、manager、node等。
安裝mysql,zookeeper的方式很多,不再多做說明。下面的搭建需要已經提前搭建好mysql和zookeeper。
1.需要先創建好otter所依賴的數據庫
//下載sql腳本
wget https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql
//載入
source otter-manager-schema.sql
2.下載manager、node
//下載manager
wget https://github.com/alibaba/otter/releases/download/otter-4.2.18/manager.deployer-4.2.18.tar.gz
//下載node
wget https://github.com/alibaba/otter/releases/download/otter-4.2.18/node.deployer-4.2.18.tar.gz
3.解壓縮並配置manager(需要首先配置manager, 再配置node)
//解壓縮
tar zxvf manager.deployer-4.2.18.tar.gz -C ./manager
//進入conf目錄, 修改otter.properties,主要修改域名端口配置、Mysql配置、zk配置等
##修改爲解析的域名和端口,建議修改爲公網ip或域名
## otter manager domain name
otter.domainName = 127.0.0.1
## otter manager http port
otter.port = 8080
## jetty web config xml
otter.jetty = jetty.xml
##修改爲配置好的mysql地址賬號密碼
## otter manager database config
otter.database.driver.class.name = com.mysql.jdbc.Driver
otter.database.driver.url = jdbc:mysql://172.17.18.118:3307/otter
otter.database.driver.username = root
otter.database.driver.password = root
##配置manager端口, 後續配置node時需要用到該配置
## otter communication port
otter.communication.manager.port = 1099
##修改爲配置好的zk地址
## default zookeeper address
otter.zookeeper.cluster.default = 127.0.0.1:2181
## default zookeeper sesstion timeout = 60s
//進入bin目錄執行啓動腳本
./bin/startup.sh
//日誌查看
tailf logs/manager.log
執行成功使用http://localhost:8080 即可訪問manager界面 ! 默認賬號密碼: admin/admin
4.安裝aria2
//安裝 epel 源
yum install epel-release
//直接安裝aria2
yum install aria2 -y
5.安裝node
//解壓縮
tar zxvf node.deployer-4.2.18.tar.gz -C ./node
//寫入配置node的id到conf目錄,且文件名爲nid
echo 1 > conf/nid
//修改conf目錄下的配置文件otter.properties, 主要配置manager的地址及端口
## otter arbitrate & node connect manager config
otter.manager.address = 127.0.0.1:1099
//啓動node
./bin/startup.sh
//查看日誌
tailf logs/node/node.log
6.manager頁面進行相關配置就可以開始食用了
❶ 配置zookeeper
進入 機器管理 → zookeeper管理, 點擊添加按鈕
配置成功如上圖, 如點擊刷新按鈕報錯, 是因爲缺少nc命令導致的, 安裝即可;
yum install nc
❷配置node
進入 機器管理 → Node管理, 點擊添加按鈕
node配置成功如圖, manager會自動檢測node節點的啓動情況, 多節點直接添加機器即可。
至此已全部搭建完成, 可以盡情食用了。
三 otter食用
食用otter首先需要了解otter的使用約定、配置流程,儘量規避易致錯的操作建立起使用的信心。
otter同步約定
1. 同步表必須有主鍵
2. oracle表不允許使用blob/clob (mysql無此限制)
3. 數據訂正 (幾種case需要和otter團隊溝通 )
a. 純數據訂正超過1000w
b. 帶文件訂正超過50w
c. 非映射關係表訂正超過5000w (otter4正在做優化,儘早解除限制)
4. 新通道上線步驟 (當前)
a. 明確同步需求
i. 單向 / 雙向 / 雙寫(需要明確主要寫入站點) / 文件同步
b. 全量數據初始化
i. 行記錄 + gmt_modified修改
ii. 插入同步記錄到retl_buffer表
5. 數據表字段變更
a. 只允許新增字段到末尾 (刪除字段慎重)
b. 字段新增先加目標庫,再加源庫
c. 雙向同步,新增字段建議無默認值 (可確保同步無掛起)
6. 圖片同步,需要先寫圖片,後插數據
otter4同步延遲比較低,如果先寫數據,後寫圖片或者兩者併發寫,就會有一定的概率拿到數據後,反查沒有
圖片,導致圖片同步丟失
在企業使用過程中,可能並不會使用到上述說明的所有場景,如果只是簡單的使用場景,建議提供通用的約定提高團隊溝通成本。
- 不支持無主鍵表同步;
- 不支持帶外鍵的記錄同步;
- 不支持trigger配置;
- 對於同步表字段屬性的變化、字段的增刪、表的增刪需要及時與要同步的團隊同步信息。
數據庫配置
1.首先需要建立同步需要的主庫和從庫, 主庫需要開啓binlog, mysql配置文件加入如下配置即可;
log-bin=/var/lib/mysql/mysql-bin binlog_format=ROW server-id=100
然後重啓mysql即可。
2.驗證mysql的binlog是否開啓成功:
SHOW VARIABLES LIKE ‘log_%’;
SHOW VARIABLES LIKE ‘binlog_format%’;
3.從庫同步需要主庫提供賬號密碼, 且賬號至少需要SELECT、REPLICATION CLIENT、REPLICATION SLAVE權限。
注意:REPLICATION SLAVE 可以在只讀賬號下分配,但權限級別需要是 global,不能僅指定某個數據庫的只讀。
賬號創建操作如下:
CREATE USER test IDENTIFIED BY '123456';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'test'@'%';
FLUSH PRIVILEGES;
配置流程
添加canal配置 → 添加數據源配置 → 添加數據表配置 → 添加channel → 添加Pipeline → 添加表映射關係 → 啓動channel
下面以一個單向同步的例子帶圖同步演示otter操作。
1.添加canal配置: 配置管理 → canal配置 → 點擊添加按鈕
簡單使用, 填好數據庫信息就可以了。庫的信息是主庫的數據源信息
2.添加數據源配置:
配置管理 → 數據源配置 → 點擊添加按鈕
添加目標數據源,即主庫數據源(開啓binlog)
添加從庫數據源,即要同步的庫
3.添加數據表配置
配置管理 → 數據表配置 → 點擊添加按鈕
添加主庫表
同理,添加從庫表信息。
4.添加channel
5.添加Pipeline
6.添加表映射關係
添加主庫數據表和從庫數據表,配置好字段映射關係,如果表結構相同, 直接保存,無需點擊下一步。
7.啓動channel
點擊啓動,數據表就可以正常進行同步了。出現異常信息點擊channel進入查看異常信息即可。
四 常見問題
1. java命令不在otter查找目錄內
假定在/usr/local/software/jdk1.8.0_141/bin下, 建立軟連接即可
ln -s /usr/local/software/jdk1.8.0_141/bin/java /usr/local/bin/java
2. Zookeeper頁面點擊刷新按鈕報錯
是因爲缺乏nc命令導致的,安裝即可
yum install nc
3. node 報內存不足
node出現java.lang.OutOfMemoryError : Gc overhead limit exceeded.
- 調大node的-Xms,-Xmx內存設置,默認爲3G,heap區大概是2GB
- 減少每個同步的任務內存配置.