[TOC]
一、環(huán)境準(zhǔn)備
準(zhǔn)備兩臺(tái)機(jī)器,搭建阿里開源的mysql同步工具otter,canal就是 它的子項(xiàng)目。
| mysql | zk | manager | node | |
|---|---|---|---|---|
| node5 | 1 | 1 | 1 | 1 |
| node6 | 1 | 1 |
二、中間件安裝
JDK
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
zk安裝,啟動(dòng)
./zkServer.sh start
mysql安裝,啟動(dòng)
mysql修改offset
注意雙向同步要求兩個(gè)庫(kù)表的主鍵不能重復(fù),如果自增主鍵要把主鍵offset錯(cuò)開并1指定increment 如下:
如果都是雪花id,或者uuid 之類的主鍵,則不用
vim /etc/my.cnf
#開啟bin log模式
log-bin=mysql-bin
binlog_format=row
#如果mysql為多寫模式,需要在每個(gè)寫庫(kù)配置自增主鍵的偏移量和步長(zhǎng),避免主鍵沖突,偏移量和步長(zhǎng)根據(jù)寫庫(kù)數(shù)量做配置
#例如myql雙寫模式場(chǎng)景下,MySQL-A配置如下
auto-increment-increment=2
auto-increment-offset=1
#MySQL-B配置如下
#auto-increment-increment=2
#auto-increment-offset=2
賬號(hào)備忘
#默認(rèn)root賬號(hào)
root
Root@123456
#otter同步賬號(hào)
otter
Otter@123456
三、安裝otter-manager
1.下載解壓
mkdir -p ./otter/manager
cd ./otter/manager
wget .....otter-4.2.18/manager.deployer-4.2.18.tar.gz
tar -zxvf manager.deployer-4.2.18.tar.gz
2.執(zhí)行數(shù)據(jù)庫(kù)表初始化語句
wget .../otter-manager-schema.sql
3.在cli執(zhí)行
source otter-manager-schema.sql
4.創(chuàng)建mysql用戶
#這個(gè)主要用于otter manager后臺(tái)使用
create user 'otter'@'%' identified by 'Otter@123456';
grant all on *.* to 'otter'@'%' identified by 'Otter@123456';
flush privileges;
5.修改manager的配置信息
cd /usr/local/opt/manager4.2.18
vi conf/otter.properties
# otter manager管理后臺(tái)的域名或訪問ip,頁面跳轉(zhuǎn)時(shí)會(huì)用這個(gè)值
otter.domainName = 192.168.56.105
# otter manager管理后臺(tái)的訪問端口
otter.port = 8080
#jdbc
otter.database.driver.url = jdbc:mysql://127.0.0.1:3306/otter?useSSL=false
#按理應(yīng)該使用otter,Otter@123456,這里直接用root
otter.database.driver.username = root
otter.database.driver.password = Root@123456
#otter通訊地址,默認(rèn)可不改
otter.communication.manager.port = 1099
#zk根據(jù)實(shí)際部署該
otter.zookeeper.cluster.default = 127.0.0.1:2181
6.啟動(dòng)
./bin/startup.sh
7.驗(yàn)證
訪問: 127.0.0.1:8080/,出現(xiàn)otter的頁面,即代表啟動(dòng)成功
初始密碼:admin/admin

四、安裝otter node
這一步驟需要在兩個(gè)機(jī)房里至少各自選一個(gè)服務(wù)器作為select node。
1.下載解壓
mkdir -p ./otter/node
cd ./otter/node
wget .../otter-4.2.18/node.deployer-4.2.18.tar.gz
tar -zxvf node.deployer-4.2.18.tar.gz
2.安裝aria2c
#yum安裝
sudo yum install epel-release
sudo yum install aria2
#編譯安裝,準(zhǔn)備
yum install -y gcc gcc-c++
wget .../release-1.36.0/aria2-1.36.0.tar.gz
tar -zxvf aria2-1.36.0.tar.gz
cd aria2-1.36.0
./configure
make
make install
#驗(yàn)證
aria2c -v
3.配置zookeeper
首先訪問manager頁面的機(jī)器管理頁面,點(diǎn)擊zookeeper管理,添加一個(gè)zookeeper。
注意
用公網(wǎng)ip。
4.配置Node節(jié)點(diǎn)
首先訪問manager頁面的機(jī)器管理頁面,點(diǎn)擊機(jī)器管理->Node管理,添加node節(jié)點(diǎn)

機(jī)器添加完成后,跳轉(zhuǎn)到機(jī)器列表頁面,獲取對(duì)應(yīng)的機(jī)器序號(hào)nid

注意
如果是生產(chǎn)環(huán)境,需要 啟用外部id,(還有另外的一處pipline也要啟用外部ip)。
5.修改配置
將環(huán)境準(zhǔn)備中添加機(jī)器后獲取到的序號(hào)(1),保存到conf目錄下的nid文件
例如:echo 5 > conf/nid
修改conf/otter.properties,修改如下信息:
otter.manager.address = 127.0.0.1:1099 #修改為otter master外部ip地址
6.啟動(dòng)
./bin/startup.sh
雙A同步
雙A同步相比于雙向同步,主要區(qū)別是雙A機(jī)房會(huì)在兩地修改同一條記錄,而雙向同步只是兩地的數(shù)據(jù)做互相同步,兩地修改的數(shù)據(jù)內(nèi)容無交集。
所以雙A同步需要額外處理數(shù)據(jù)同步一致性問題. 同步一致性算法:[Otter數(shù)據(jù)一致性],目前開源版本主要是提供了單向回環(huán)補(bǔ)救的一致性方案。
雙A同步相比于雙向同步,整個(gè)配置主要是一些參數(shù)上有變化,具體步驟:
五、配置otter-admin
0 )數(shù)據(jù)源、數(shù)據(jù)表、canal配置
菜單-配置管理,為兩個(gè)mysql實(shí)例分別配置如題這3個(gè)信息,后續(xù)在配置 channel,pipline時(shí)會(huì)用。
數(shù)據(jù)表
一般 table name 直接用通配寫法
.*
canal
位點(diǎn)信息為canal開始同步的位置,該信息可在mysql中使用如下語句獲?。簊how master status\G;
其中自定義點(diǎn)位 的journalName和position的值對(duì)應(yīng)如下的File、Position,其余canal信息可用默認(rèn),點(diǎn)擊保存即可。
如果是新庫(kù),那不用勾選自定義點(diǎn)位。

1)配置一個(gè)channel:

2)配置兩個(gè)pipeline:

注意:除了需要定義一個(gè)主站點(diǎn)外,需要在高級(jí)設(shè)置中將一個(gè)pipeline的“支持DDL”設(shè)置為false,另一個(gè)設(shè)置為true,否則將提示“一個(gè)channel中只允許開啟單向ddl同步!”錯(cuò)誤
3)每個(gè)pipeline各自配置canal,定義映射關(guān)系。
pipeLine:
select異常:跳過
ddl異常:跳過
Load異常:跳過
支持ddl同步: 主->是; 非主->否
啟用公網(wǎng)同步: 是


配置同步映射規(guī)則


4) 創(chuàng)建兩個(gè)輔助庫(kù)retl
otter的雙向同步需要在每個(gè)mysql實(shí)例都創(chuàng)建輔助庫(kù) retl,具體步驟如下:
wget https://raw.github.com/alibaba/otter/master/node/deployer/src/main/resources/sql/otter-system-ddl-mysql.sql
#再執(zhí)行下otter-system-ddl-mysql.sql
5) 啟動(dòng)
回到otterAdmin,點(diǎn)擊啟用即可開啟同步。
6) 問題修復(fù)
-------------- 重置 otter---------------------------
查詢兩個(gè)實(shí)例的binlog 點(diǎn)位
show master status;
重新同步
六、監(jiān)控告警
openJDK有些版本發(fā)不了郵件,會(huì)報(bào)錯(cuò)
Caused by: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
需要修改java.security
yum安裝的話位置:/usr/lib/jvm/java-1.8.0-openjdk-<version>/jre/lib/security/java.security
找到 jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \ DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \ include jdk.disabled.namedCurves
把SSLv3, TLSv1, TLSv1.1刪除
七.異地機(jī)房庫(kù)初始化
如果不是完全的新項(xiàng)目,而是對(duì)線上項(xiàng)目進(jìn)行雙機(jī)房改造,那還需要對(duì)新機(jī)房做數(shù)據(jù)初始化、以及必要的散列。
1.mysqldump導(dǎo)出/導(dǎo)入數(shù)據(jù)
在導(dǎo)出數(shù)據(jù)時(shí),可以先把一些有時(shí)效性、無效的數(shù)據(jù) 刪掉,比如token,log等,先歸檔到其他庫(kù),這樣提升導(dǎo)出、導(dǎo)入的效率。
#單獨(dú)安裝mysqldump
yum -y install mysql-client
#mysqldump 備份 使用最佳實(shí)踐
mysqldump -h IP地址 \
-u用戶名 -p \
--skip-tz-utc \
--no-create-info \
--insert-ignore \
--master-data=2 \
--default-character-set=utf8 \
--set-gtid-purged=off \
--ignore-table=wechat.weixin_vermicelli \
--ignore-table=wechat.sms_send_record \
--ignore-table=wechat.weixin_error_log \
--ignore-table=wechat.weixin_receivetext \
--ignore-table=wechat.weixin_scene \
--ignore-table=wechat.sys_logon_log \
--ignore-table=wechat.weixin_account_modify_log wechat > dump.sql;
#mysqldump導(dǎo)入
mysql wechat < dump_where_DML.sql中的binlog點(diǎn)位。
2.otter manager
- otter pipline 中,刪除同步點(diǎn)位。
- 修改canal自定義點(diǎn)位為dump_where_DML.sql中的binlog點(diǎn)位
- 啟動(dòng)channel同步,雙向同步搭建完成。
數(shù)據(jù)修復(fù)
全量同步用于修復(fù)數(shù)據(jù)
尚未生產(chǎn)驗(yàn)證,建議當(dāng)有問題以后迫不得已才使用
保持channel 啟動(dòng)狀態(tài)
-
把你想要同步表的表名及記錄ID插入到retl_buffer表即可。
例如:希望把node6的 test.user2 表全部同步到node5的test.user2。
#在node6執(zhí)行 insert into retl.retl_buffer(ID,TABLE_ID,FULL_NAME,TYPE,PK_DATA,GMT_CREATE,GMT_MODIFIED) (select null,0,'test.user2','I',id,now(),now() from test.user2); 如果sql執(zhí)行報(bào)錯(cuò) 1067,解決如下:
show variables like ‘sql_mode’
#(1)臨時(shí)修改:
set session
sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
#(2)永久修改
vi my.cnf
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
機(jī)房間網(wǎng)絡(luò)打通
跨機(jī)房同步網(wǎng)絡(luò)打通2種方案:
- 使用公網(wǎng)ip暴露端口
zk,node,manager,mysql 用到的端口開到外網(wǎng),并用ip白名單限制。
- 打通網(wǎng)絡(luò)
openvpn ,或者云vpn產(chǎn)品
跨機(jī)房的otter配置,有個(gè)很大的問題就是網(wǎng)絡(luò)訪問問題,比如:manager需要能訪問node,node之間需要能互相訪問,manager和node需要能訪問zookeeper,load node需要能訪問源mysql等。如何把所有的關(guān)節(jié)打通是一個(gè)比較繁瑣的問題,如果生產(chǎn)環(huán)境搭建有問題,可以多留意manager和node的日志。
注意:上線備忘
pipline 高級(jí)設(shè)置 忽略3個(gè)異常,select ,load,ddl
注意node,pipline 公網(wǎng)相關(guān)設(shè)置, 如公網(wǎng)ip等。
注意mysql表的主鍵是不是遞增的,offset有沒有錯(cuò)開,increment是否為2,或者主鍵統(tǒng)一用雪花id、uuid
-
涉及端口
#node 9090、2088、2090 #manager 8080(webUI),1099(管理node) #zk 2181 -
數(shù)據(jù)表 不要寫太復(fù)雜的正則,因?yàn)樵陧撁嫔蠝y(cè)試正確的正則,可能實(shí)際同步時(shí)會(huì)有問題。
#如下:排除某些沒意義的表,這個(gè)寫法webUI上測(cè)試可以,實(shí)際同步時(shí)不行,改成通配符就可 #如下范例排除 user3,user2 ^((?!user3|user2).)*$
^((?!weixin_vermicelli|weixin_certifyauth_accesstoken|weixin_scene).)*$