雙機(jī)房多活實(shí)戰(zhàn)(二) --mysql同步otter

[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-manager.png

四、安裝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)

otter_7_node_3.png

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

otter_7_node_2.png

注意

如果是生產(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)位。

otter_3.png

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

otter_1.png

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

otter_2.png

注意:除了需要定義一個(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)同步: 是
otter_4_pipeline.png

otter_5_pipeline.png

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

otter_6_mapRule.png
otter_7_mapRule.png

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)有問題以后迫不得已才使用

  1. 保持channel 啟動(dòng)狀態(tài)

  2. 把你想要同步表的表名及記錄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);
    
    
  3. 如果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種方案:

  1. 使用公網(wǎng)ip暴露端口
    zk,node,manager,mysql 用到的端口開到外網(wǎng),并用ip白名單限制
  1. 打通網(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的日志。

注意:上線備忘

  1. pipline 高級(jí)設(shè)置 忽略3個(gè)異常,select ,load,ddl

  2. 注意node,pipline 公網(wǎng)相關(guān)設(shè)置, 如公網(wǎng)ip等。

  3. 注意mysql表的主鍵是不是遞增的,offset有沒有錯(cuò)開,increment是否為2,或者主鍵統(tǒng)一用雪花id、uuid

  4. 涉及端口

    #node
    9090、2088、2090
    #manager
    8080(webUI),1099(管理node)
    #zk
    2181
    
  5. 數(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).)*$



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容