使用otter實現MySQL跨機房雙向同步
- 本文檔基於已經搭建單向同步的基礎進行雙向同步功能擴展
- 如果需要進行單向同步搭建,請參考上一篇文檔(《otter單向同步配置》)
- 保證所有node運行機器已經安裝aria2
在要進行雙向同步的數據庫執行以下語句 (記得修改密碼)(主從庫都要執行)
/* 供 otter 使用, otter 需要對 retl.* 的讀寫權限,以及對業務表的讀寫權限*/
/* 1. 創建database retl */
CREATE DATABASE retl;
/* 2. 用戶授權 給同步用戶授權 */
<! CREATE USER retl@'%' IDENTIFIED BY 'retl';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO `retl`@'%';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `retl`.* TO `retl`@'%'; >
/* 業務表授權,這裏可以限定只授權同步業務的表 */
<! GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO `retl`@'%'; >
/* 3. 創建系統表 */
<! USE retl; >
USE otter;
DROP TABLE IF EXISTS retl.retl_buffer;
DROP TABLE IF EXISTS retl.retl_mark;
DROP TABLE IF EXISTS retl.xdual;
CREATE TABLE retl_buffer
(
ID BIGINT(20) AUTO_INCREMENT,
TABLE_ID INT(11) NOT NULL,
FULL_NAME varchar(512),
TYPE CHAR(1) NOT NULL,
PK_DATA VARCHAR(256) NOT NULL,
GMT_CREATE TIMESTAMP NOT NULL,
GMT_MODIFIED TIMESTAMP NOT NULL,
CONSTRAINT RETL_BUFFER_ID PRIMARY KEY (ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE retl_mark
(
ID BIGINT AUTO_INCREMENT,
CHANNEL_ID INT(11),
CHANNEL_INFO varchar(128),
CONSTRAINT RETL_MARK_ID PRIMARY KEY (ID)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE xdual (
ID BIGINT(20) NOT NULL AUTO_INCREMENT,
X timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (ID)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
/* 4. 插入初始化數據 */
INSERT INTO retl.xdual(id, x) VALUES (1,now()) ON DUPLICATE KEY UPDATE x = now();
數據庫配置(主從庫都要修改,請保證server-id不相同)
- 在需要雙向同的數據庫開啓binlog,並設置爲row模式
- my.cnf (/etc/mysql/my.cnf) 的 [mysqld] 節點下啓用binlog
# 開啓binlog
log-bin=mysql-bin
# 設置row模式
binlog-format=ROW
character_set_server=utf8
# 雙向同步保證id不相同,避免無法辨別數據庫而回環
server-id=1
# 允許外部訪問
# bind-address = 0.0.0.0
otter賬號授權
授權需要雙向授權 (主庫)
# 如果有多個機器ip請全部授權
# 授予主從複製權限
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON . TO otter@’%’;
# 授予retl 庫操作權限
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `retl`.* TO otter@'ip';
# 授予操作庫增刪查改,alter,index權限 用於更新數據庫記錄
GRANT update, insert, delete, update, alter, indexON mytest.person_info TO otter@'ip';
flush PRIVILEGES;
授權需要雙向授權 (從庫)
# 如果有多個機器ip請全部授權
# 授予主從複製權限
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON . TO otter@’%’;
# 授予retl 庫操作權限
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `retl`.* TO otter@'ip';
# 授予操作庫增刪查改,alter,index權限 用於更新數據庫記錄
GRANT update, insert, delete, update, alter, indexON mytest.person_info TO otter@'ip';
flush PRIVILEGES;
配置數據源
- 儘量使用專用賬號,避免重複配置數據源
- 同一個數據源的表只需要配置一次
- 點擊驗證,如果報字符類型不一致問題,可忽略
開始添加數據源
配置數據源
數據源列表
配置表
- schema name 配置數據庫名(支持正則.* 匹配整個實例下所有數據庫)
- table name配置表名,支持正則配置
- 如: .* 匹配全庫
- (yibai_product_map|yibai_product) 最外層一定要加括號,否則無法同步"|"後面的部分,
- 保證 Find schema and tables: 有你需要同步的所有表
開始添加數據表
配置數據表
配置canal
- canal用於取binlog,
- canal名字保存後不能修改,儘量做到見名知意
- 此處賬號要有 主從複製權限
- 數據庫地址爲同步源庫數據庫地址
添加canal
配置canal
canal列表 雙向需要配置兩個canal 分別負責讀取不同庫的binlog
支持主備切換
主備切換配置
配置Channel
開始添加Channel
開始配置Channel
- 雙向同步需要開啓數據一致性算法
配置Pipeline
進入pipeline(點擊channel名稱)
添加pipeline
配置pipeline(主庫)
- 配置一個單相同步的通道
- 選擇node, 此處選擇多個是用於分擔壓力和保證高可用
- 也可以選擇單個
- 選擇主站點,同步會以主站點數據爲準
- 選擇對應的源庫canal
- 消費批次支持修改
pipeline高級配置(主庫)
- 主庫要支持ddl
pipeline配置從(從庫)
- 與主庫唯一的不同在於 主站點選擇否
pipeline高級配置(從庫)
- 從庫要取消ddl的支持
- 跳過ddl異常
配置映射關係
- 點擊Pipeline進入映射配置
- 映射關係配置1
- 選擇源庫和目標庫
- 權重越大越晚執行,用於業務關聯表配置
- 點擊下一步
- 映射關係配置2
- 如果是單表可以看到對應的字段
- 將需要同步的字段對應拉入到下面對應框中,支持不同字段名稱的同步
- 如果配置了多個表則無法看到字段,直接點擊下一步即可
- 映射配置3
- 映射配置4
- 此處用於配置組合字段
- 如果需要變更某個字段後相關字段也要跟着更新,可以配置組合字段
- 全字段的組合,與Channel中的行模式一致
- 點擊保存即可
- 配置多個映射
- 字段映射支持配置多個表
- 需要表源庫是相同的數據庫實例
- 雙向同步需要相同的主庫,
- 到此處配置完成
channel啓動
- 點擊啓動
- 啓動後檢查是否異常 日誌查看
- 日誌只記錄異常,根據時間和channel名稱可以確認你新開啓的同步任務是否異常
- 如果發生異常,點擊日誌內容,即可看到異常內容
- 監控查看
- 此處可以看到同步延時等信息
- 採集一般60s 採集一次,
- 如果數據庫日誌沒有變更不會採集
- 如果channel掛起也不會進行採集
- 內存不足/數據庫壓力較大 可能會部分channel不進行採集
- 如果發現爲進行日誌採集請及時確認原因
- pipeling監控
點擊監控可以看到各個監控指標
- 監控指標
- 同步進度
- 如果同步異常,重新導入表做同步,或者需要變更同步起始位點
- 先關閉同步任務
- 刪除此處position 位點狀態
- 刪除後在canal 中配置新的位點,啓動同步任務即可