mysql同步之otter/canal環境搭建完整詳細版
一、Otter目前支持了什么
1. 單向同步, mysql/oracle互相同步
2. 雙向同步,無沖突變更
3. 文件同步,本地/aranda文件
4. 雙A同步,沖突檢測&沖突補救
5. 數據遷移,中間表/行記錄同步
導歷史表還需要程序代碼實現嗎? 還在用mysql的主從復制嗎? Otter都能為你解決。
典型的場景是賬戶信息表和賬戶交易明細表,更新賬戶余額后需要登記一條賬戶明細,並且保證在一個事務里,用戶可以通過交易明細表查看交易記錄,但是交易明細表的數據量是逐步遞增的,用戶量多的系統,幾個月下來的數據超過千萬了,表數據量一多就導致查詢和插入變慢,而一開始就對賬戶明細做分表處理就難於保證強一致性事務,通過otter可以將記錄同步導歷史表,並且進行分表處理,用戶往年的交易記錄就可以查詢歷史表了,而原交易明細表就可以刪除一個月甚至幾天前的數據;
實際測試中,otter的同步速度相比於mysql的復制,約有5倍左右的性能提升,這取決於其同步算法的實現. 拋棄了強一致性,得到了性能提升。
二、官方安裝文檔
https://github.com/alibaba/otter/wiki/Manager_Quickstart
https://github.com/alibaba/otter/wiki/Node_Quickstart
演示視頻:http://video.tudou.com/v/XMTc4NjU1MjM4NA==.html
三、整體架構
原理描述:
基於Canal開源產品,獲取數據庫增量日志數據。
典型管理系統架構,manager(web管理)+node(工作節點)
a. manager運行時推送同步配置到node節點
b. node節點將同步狀態反饋到manager上
基於zookeeper,解決分布式狀態調度的,允許多node節點之間協同工作.
名詞解釋:
Channel:同步通道,單向同步中一個Pipeline組成,在雙向同步中有兩個Pipeline組成;Pipeline:從源端到目標端的整個過程描述,主要由一些同步映射過程組成;
DataMediaPair:根據業務表定義映射關系,比如源表和目標表,字段映射,字段組等;
DataMedia: 抽象的數據介質概念,可以理解為數據表/mq隊列定義;
DataMediaSource: 抽象的數據介質源信息,補充描述DateMedia;
ColumnPair: 定義字段映射關系;
ColumnGroup: 定義字段映射組;
Node: 處理同步過程的工作節點,對應一個jvm;
四、環境准備
1. otter manager依賴於mysql進行配置信息的存儲,所以需要預先安裝mysql,並初始化otter manager的系統表結構
a. 安裝mysql
b. 初始化otter manager系統表:https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql
2. 整個otter架構依賴了zookeeper進行多節點調度,所以需要預先安裝zookeeper,不需要初始化節點,otter程序啟動后會自檢.
manager需要在otter.properties中配置zookeeper集群機器
3. 安裝jdk1.6+
五、下載安裝
otter安裝前需要Aria2支持,安裝步驟請參考https://www.cnblogs.com/zzpblogs/p/12895908.html
1.mysql
# 開啟binlog log-bin=mysql-bin # 設置模式為ROW binlog-format=ROW # 設置默認字符集 init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake
# 驗證 mysql> show variables like '%binlog_format%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | binlog_format | ROW | +---------------+-------+
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
2.安裝aria2
下載頁面:https://github.com/alibaba/otter/releases/
下載manager:wget https://github.com/alibaba/otter/releases/download/v4.2.14/manager.deployer-4.2.14.tar.gz
創建manager目錄 : mkdir ~/manager
tar zxvf manager.deployer-4.2.14.tar.gz -C ~/manager
下載node: wget https://github.com/alibaba/otter/releases/download/v4.2.14/node.deployer-4.2.14.tar.gz
創建node目錄: mkdir ~ /node
tar zxvf node.deployer-4.2.14.tar.gz -C ~ /node
六、修改配置文件運行
(1) Manager
1) otter.properties配置修改 vi ~/manager/conf/otter.properties
##修改為正確訪問ip,生成URL使用,node的配置需要用到
otter.domainName= 127.0.0.1
##manage頁面的訪問端口
otter.port =8080
##修改為正確數據庫信息
otter.database.driver.class.name = com.mysql.jdbc.Driver
otter.database.driver.url = jdbc:mysql://127.0.01:3306/ottermanager
otter.database.driver.username = root
otter.database.driver.password = hello
##為node連接manager的端口, node的配置需要用到
otter.communication.manager.port= 1099
##配置zookeeper集群機器
otter.zookeeper.cluster.default= 127.0.0.1:2181
其它使用默認配置即可
2) Manager啟動
Linux : sh ~/manager/bin/startup.sh
Windows:startup.bat
查看日志: vi ~/manager/logs/manager.log
啟動成功后瀏覽器訪問http://127.0.0.1:8080,出現otter的頁面
訪問:http://127.0.0.1:8080/login.htm,初始密碼為:admin/admin,即可完成登錄. 目前:匿名用戶只有只讀查看的權限,登錄為管理員才可以有操作權限
3) 關閉manager
sh ~/manager/bin/stop.sh
(2)Node
node會受ottermanager進行管理,所以需要預先安裝otter manager,完成manager安裝后,需要在manager頁面為node定義配置信息,並生一個唯一id。
1) 添加zookeeper
首先確保你的zookeeper已啟動成功。
otter依賴zookeeper,訪問manager頁面的機器管理頁面,選擇菜單進入“機器管理→zookeeper管理”頁面:
點擊添加進入“添加Zookeeper集群”頁面
2) 添加node
Zookeeper添加成功后,進入“機器管理→Node管理”頁面:
點擊添加進入添加機器頁面
- 機器名稱:可以隨意定義,方便自己記憶即可
- 機器ip:對應node節點將要部署的機器ip,如果有多ip時,可選擇其中一個ip進行暴露. (此ip是整個集群通訊的入口,實際情況千萬別使用127.0.0.1,否則多個機器的node節點會無法識別)
- 機器端口:對應node節點將要部署時啟動的數據通訊端口,建議值:2088
- 下載端口:對應node節點將要部署時啟動的數據下載端口,建議值:9090
- 外部ip :對應node節點將要部署的機器ip,存在的一個外部ip,允許通訊的時候走公網處理。
- zookeeper集群:為提升通訊效率,不同機房的機器可選擇就近的zookeeper集群.
- node這種設計,是為解決單機部署多實例而設計的,允許單機多node指定不同的端口
3) 配置nid
機器添加完成后,跳轉到機器列表頁面,獲取對應的機器序號nid:
通過這幾步操作,獲取到了node節點對應的唯一標示,稱之為node id,簡稱nid,比如我添加的機器對應序號為1
執行echo 1 >~/node/conf/nid , 保存到conf目錄下的nid文件;
4) otter.properties配置修改 vi ~/otter/conf/otter.properties
# node的安裝目錄
otter.nodeHome = ${user.dir}/node
#manager的服務地址
otter.manager.address = 127.0.0.1:1099
5) 啟動
Linux:sh~/node/bin/startup.sh
Windows:startup.bat
打開日志: vi ~/node/logs/node/node.log,出現以下的錯誤,表示manager頁面的ip配置不正確,此時修改ip為對應的host ip后,再次啟動即可。
訪問: http://127.0.0.1:8080/,查看“機器管理-Node管理”頁面,對應的節點狀態,如果變為了已啟動,代表已經正常啟動。
關閉:sh ~/node/bin/stop.sh
七、配置一個同步任務
搭建一個數據庫同步任務,源數據庫必須開啟binlog,並且binlog_format為ROW,即在mysql的配置文件加上以下兩行
log-bin=mysql-bin
binlog-format=ROW
如果源庫已開啟binlog,通過mysql客戶端命令show master status查看
1. 添加canal
Otter使用canal開源產品獲取數據庫增量日志數據,可以把cannal看作是源庫的一個偽slave。
原理: canal模擬mysql slave的交互協議,偽裝自己為mysql slave,向mysql master發送dump協議,mysql master收到dump請求,開始推送binarylog給slave(也就是canal), canal解析binary log對象(原始為byte流)。
Canal官方文檔:https://github.com/alibaba/canal/wiki
1) 在Otter Manager“配置管理-canal配置”頁面點擊添加:
2) 進入添加cannal頁面:
Node集成了cannal,所以不需要單獨下載cannal;
Cannal 存儲機制分為memory和file,也可以在運行模式選項選擇作為獨立服務運行;
勾選其他參數設置,可以設置cannal的服務端口;
必須配置位點信息,否則如果你的數據庫已有存量數據,第一次運行時需要等待比較長的時間,可以通過連接源庫客戶端執行sql獲取,如下:
2. 添加數據源
源庫和目標庫的schema需要一致,不然無法執行ddl語句
3. 添加數據表配置
“配置管理-數據表配置”進入數據表管理頁面:
點擊添加,進入添加數據表頁面:
table示例說明
- 單表配置:alibaba.product
- 分表配置:alibaba[1-64].product , alibaba.product[01-32]
- 正則配置:(.*).(.*)
- schema name和table name都設置成.*表示全庫同步
4. 添加一個channel
如下圖,點擊添加按鈕進入添加channel頁面,輸入Channel Name后保存,則成功添加一個channel;
5. 配置一個pipeline
添加channel成功后,點擊Channel名字,進入Pipeline管理頁面,添加一個pipeline;
進入添加pipeline頁面
如上圖填好所需信息,勾選高級設置,可以選是否過濾ddl同步等選項,點擊保存,成功后會返回Pipeline管理頁面。
6. 添加映射關系
添加pipeline成功后,點擊Pipeline名字
進入映射關系列表頁面,點擊添加
進入添加映射關系頁面
點擊保存返回映射關系列表頁面,如果源數據表是只同步一個表可以點擊下一步,選擇需要同步的字段映射關系;
7. 啟用同步
以上配置,一個簡單的同步任務就完成了,返回Channel管理頁面
點擊“啟用”,運行狀態就變為“運行”;
現在可以新增一個表,插入記錄,查看數據是否同步過去了。
點擊Channel名字,進入Pineline管理頁面,可點擊“監控”查看同步狀態