mysql同步数据到另一张表_mysql:Otter跨机房数据同步(单向)
重要說(shuō)明:需要同步的表必須要有主鍵 主鍵 主鍵
otter是一款基于Java且免費(fèi)、開(kāi)源基于數(shù)據(jù)庫(kù)增量日志解析,準(zhǔn)實(shí)時(shí)同步到本機(jī)房或異地機(jī)房的mysql/oracle數(shù)據(jù)庫(kù)的解決方案。
Otter目前支持了什么
1. 單向同步, mysql/oracle互相同步
2. 雙向同步,無(wú)沖突變更
3. 文件同步,本地/aranda文件
4. 雙A同步,沖突檢測(cè)&沖突補(bǔ)救
5. 數(shù)據(jù)遷移,中間表/行記錄同步
實(shí)際測(cè)試中,otter的同步速度相比于mysql的復(fù)制,約有5倍左右的性能提升,這取決于其同步算法的實(shí)現(xiàn). 拋棄了強(qiáng)一致性,得到了性能提升。
原理描述
基于Canal開(kāi)源產(chǎn)品,獲取數(shù)據(jù)庫(kù)增量日志數(shù)據(jù)。
典型管理系統(tǒng)架構(gòu),manager(web管理)+node(工作節(jié)點(diǎn))
manager運(yùn)行時(shí)推送同步配置到node節(jié)點(diǎn)
node節(jié)點(diǎn)將同步狀態(tài)反饋到manager上
基于zookeeper,解決分布式狀態(tài)調(diào)度的,允許多node節(jié)點(diǎn)之間協(xié)同工作.
工作流程:otter基于zookeeper解決分布式狀態(tài)調(diào)度,由manager(web管理)和node(工作節(jié)點(diǎn))組成。manager運(yùn)行時(shí)推送同步配置到node節(jié)點(diǎn)上,node節(jié)點(diǎn)將同步狀態(tài)反饋到manger上。
環(huán)境
Ip
操作系統(tǒng)
Mysql
Manager節(jié)點(diǎn)
Node節(jié)點(diǎn)
192.168.140.24
CenteOS 7.5.1804
Mysql5.7.26
是
是
192.168.140.136
CenteOS 7.5.1804
Mysql5.7.26
否
是
目標(biāo):
實(shí)現(xiàn)192.168.140.136到192.168.140.24的單向數(shù)據(jù)同步。
名詞解釋
Pipeline:從源端到目標(biāo)端的整個(gè)過(guò)程描述,主要由一些同步映射過(guò)程組成
Channel:同步通道,單向同步中一個(gè)Pipeline組成,在雙向同步中有兩個(gè)Pipeline組成
DataMediaPair:根據(jù)業(yè)務(wù)表定義映射關(guān)系,比如源表和目標(biāo)表,字段映射,字段組等
DataMedia : 抽象的數(shù)據(jù)介質(zhì)概念,可以理解為數(shù)據(jù)表/mq隊(duì)列定義
DataMediaSource : 抽象的數(shù)據(jù)介質(zhì)源信息,補(bǔ)充描述DateMedia
ColumnPair : 定義字段映射關(guān)系
ColumnGroup : 定義字段映射組
Node : 處理同步過(guò)程的工作節(jié)點(diǎn),對(duì)應(yīng)一個(gè)jvm
otter搭建
環(huán)境準(zhǔn)備
[root@db192168140024 ~]# yum install java-1.8.0-openjdk-devel.x86_64
[root@db192168140024 ~]# yum install nc
[root@db192168140024software]#wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
[root@db192168140024 software]# tar -zxvf zookeeper-3.4.14.tar.gz
[root@db192168140024 software]# mv zookeeper-3.4.14 /usr/local/zookeeper
[root@db192168140024 software]# cd /usr/local/zookeeper/conf
[root@db192168140024 conf]# cp zoo_sample.cfg zoo.cfg
[root@db192168140024 conf]# cd ../bin
[root@db192168140024 bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@db192168140024 bin]# yum install *aria2*
aria2 是一款開(kāi)源、輕量級(jí)的多協(xié)議命令行下載工具,支持 HTTP/HTTPS、FTP、SFTP、BitTorrent 和 Metalink 協(xié)議,擁有眾多第三方支持插件,被譽(yù)為「下一代下載工具」和「下載神器」
otter的安裝包以及腳本:
從https://github.com/alibaba/otter/releases下載,例如:
192.168.140.24
下載并分別解壓到/usr/local/otter_node,/usr/local/otter_manager目錄,如下:
192.168.140.136
下載node節(jié)點(diǎn)node.deployer-4.2.14.tar.gz 并解壓到/usr/local/otter_node
192.168.140.24
因?yàn)閛tter的配置信息存儲(chǔ)在mysql中,所有還有一個(gè)初始化腳本:
https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql
網(wǎng)上和otter文檔均提及需要先安裝manager,我仔細(xì)看了下,是因?yàn)閙anager是被動(dòng)連接的(很多應(yīng)用的管理控制臺(tái)是主動(dòng)去連接服務(wù)的,otter則把所有的配置都存儲(chǔ)在了manager中),node啟動(dòng)的時(shí)候會(huì)連接到manager獲取同步相關(guān)的信息。生成nid這一步倒沒(méi)什么關(guān)系,事后不一致修改也可以。
manager配置
首先在計(jì)劃保存otter配置信息的mysql數(shù)據(jù)庫(kù)執(zhí)行otter-manager-schema.sql腳本。
manager的配置文件主要是manager/conf/otter.properties,如下所示(下面列出了建議和需要修改的):
[root@v-03-01-00223 conf]# cat otter.properties
## otter manager domain name
otter.domainName = 192.168.140.24 ## 建議改成所在服務(wù)器的ip,而不是默認(rèn)的127.0.0.1,否則到時(shí)候啟動(dòng)的時(shí)候所有的連接指向的目標(biāo)都是localhost,因?yàn)橥ǔtter跑在linux環(huán)境,很多l(xiāng)inux環(huán)境是沒(méi)有圖形化界面的,感覺(jué)這是個(gè)bug
## otter manager http port
otter.port = 8088 ## 如果非專用或者已經(jīng)有了一些web應(yīng)用在同一臺(tái)服務(wù)器,建議改成其他的避免端口沖突,這里的端口號(hào)要和jetty.xml中的保持一致,這里也是,直接用個(gè)非8080端口就更友好了,比如weblogic 控制臺(tái)7001,es控制臺(tái)9200,rabbitmq控制臺(tái)15672
## jetty web config xml
otter.jetty = jetty.xml
## otter manager database config
otter.database.driver.class.name = com.mysql.jdbc.Driver
otter.database.driver.url = jdbc:mysql://192.168.160.24:3306/otter ## otter配置信息維護(hù)的數(shù)據(jù)庫(kù)地址,庫(kù)名一般為otter/otter_manager/manager
otter.database.driver.username = root
otter.database.driver.password = 123456
## otter communication port
otter.communication.manager.port = 1099 ## node和manager通信的接口,一般不用修改
## otter communication pool size
otter.communication.pool.size = 10
## default zookeeper address
otter.zookeeper.cluster.default =192.168.160.24:2181 ## zk地址
## default zookeeper sesstion timeout = 60s
otter.zookeeper.sessionTimeout = 60000
## otter arbitrate connect manager config
otter.manager.address = ${otter.domainName}:${otter.communication.manager.port}
## should run in product mode , true/false
otter.manager.productionMode = true
## self-monitor enable or disable
otter.manager.monitor.self.enable = true
## self-montir interval , default 120s
otter.manager.monitor.self.interval = 120
## auto-recovery paused enable or disable
otter.manager.monitor.recovery.paused = true
# manager email user config
otter.manager.monitor.email.host = smtp.gmail.com
otter.manager.monitor.email.username =
otter.manager.monitor.email.password =
otter.manager.monitor.email.stmp.port = 465
上述配置修改之后,就可以啟動(dòng)manager了。
[root@v-03-01-00223 bin]# pwd
/usr/local/otter_manager/bin
./startup.sh
查看日志
tail -fn 100 ../logs/manager.log
2019-09-11 09:24:55.223 [] INFO com.alibaba.otter.manager.deployer.JettyEmbedServer - ##Jetty Embed Server is startup!
2019-09-11 09:24:55.223 [] INFO com.alibaba.otter.manager.deployer.OtterManagerLauncher - ## the manager server is running now ......
Wed Sep 11 09:26:58 CST 2019 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
接下去就可以驗(yàn)證manager了。
用瀏覽器打開(kāi)http://192.168.160.24:8088/
默認(rèn)情況下,進(jìn)去的是匿名賬戶,只有只讀查看的權(quán)限,登錄為管理員才可以有操作權(quán)限,管理員賬號(hào)為admin/admin(otter自帶)。
注:默認(rèn)情況下是沒(méi)有channel的,因?yàn)楣P者的環(huán)境已經(jīng)配置了在單向同步的,所以有顯示一個(gè)channel。
manager啟動(dòng)之后,需要配置使用的zk、canal、node等地址、端口等信息。
zk配置
node配置
端口建議不要修改。
機(jī)器添加完成以后,機(jī)器管理的列表中第一列就是nid(這個(gè)就是到時(shí)候要保存到node/conf/nix文件中的值),如下:
上述三種類型的節(jié)點(diǎn)配置完成后,manager前期的配置就完成了。
manager配置完成之后,需要先啟動(dòng)相應(yīng)的node節(jié)點(diǎn),node節(jié)點(diǎn)啟動(dòng)之后,就可以配置真正的同步任務(wù)了。
node配置
首先cd NODE_HOME/conf
echo 1 > nid
node配置文件otter.properties(可以默認(rèn),不用做任何修改)如下:
[root@v-03-01-00223 conf]# cat otter.properties
# otter node root dir
otter.nodeHome = ${user.dir}/../
## otter node dir
otter.htdocs.dir = ${otter.nodeHome}/htdocs
otter.download.dir = ${otter.nodeHome}/download
otter.extend.dir= ${otter.nodeHome}/extend
## default zookeeper sesstion timeout = 60s
otter.zookeeper.sessionTimeout = 60000
## otter communication pool size
otter.communication.pool.size = 10
## otter arbitrate & node connect manager config
otter.manager.address = 192.168.140.24:1099
啟動(dòng)node
cd NODE_HOME/bin
./startup.sh
[root@v-03-01-00223 node]# more node.log
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=96m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
2018-07-03 15:13:09.364 [main] INFO com.alibaba.otter.node.deployer.OtterLauncher - INFO ## the otter server is running now ......
此時(shí)再查看manager控制臺(tái)的機(jī)器管理,可以發(fā)現(xiàn)機(jī)器狀態(tài)為已啟動(dòng),如下:
manager/node都啟動(dòng)之后,就可以真正開(kāi)始配置同步任務(wù)了。
同步任務(wù)配置
分為下列幾個(gè)步驟(不熟悉術(shù)語(yǔ)概念的建議回到頁(yè)首重新review下):
1、添加canal
點(diǎn)位可以通過(guò)在主庫(kù)執(zhí)行show master status和select unix_timestamp()得到。
2、添加數(shù)據(jù)源
設(shè)置主庫(kù)和從庫(kù)的數(shù)據(jù)源
3、添加同步表
4、添加channel
5、添加pipeline
pipeline里面主要選擇節(jié)點(diǎn)和canal。
6、添加映射關(guān)系
7、啟動(dòng)同步
注意:默認(rèn)會(huì)同步ddl,對(duì)于分庫(kù)分表同步到從庫(kù)的時(shí)候,建議不要同步ddl以及跳過(guò)ddl。
插入數(shù)據(jù)試試看吧。。。。
otter同步異常問(wèn)題排查與監(jiān)控
筆者一開(kāi)始啟動(dòng)后,確實(shí)報(bào)錯(cuò)了,如下:
TODO,等后續(xù)梳理確保都可重復(fù)執(zhí)行之后,再補(bǔ)充。
otter簡(jiǎn)單性能測(cè)試
創(chuàng)建了一個(gè)簡(jiǎn)單的表使用mysqlslap進(jìn)行測(cè)試。
注:我們因?yàn)榄h(huán)境受限,zk、manager、node、mysql主從均在一臺(tái)服務(wù)器上,配置為16c/8GB阿里云服務(wù)器,無(wú)swap。
CREATE TABLE `otter_test_table1` (
`id` int(11) NOT NULL,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
測(cè)試100w條插入
mysqlslap --defaults-file="/etc/my.cnf.57" --concurrency=50 --iterations=1 --create-schema=otter_test --query="insert into otter_test_table1 values(FLOOR(0 + (RAND() * 10000000)),'name93923') ON DUPLICATE KEY UPDATE name='wifeufwuwwu'" --number-of-queries=1000000 -uroot -p123456 -P3307 -h127.0.0.1
延遲、tps等如下:
可以看出后面基本上都在io等待了,一般來(lái)說(shuō)數(shù)據(jù)庫(kù)服務(wù)器io等待持續(xù)到10%之后,系統(tǒng)就很慢了,所以總體來(lái)說(shuō),如果不做太多的字段重命名、二次處理,otter性能本身還是不錯(cuò)的。
otter高可用
對(duì)外開(kāi)源部分HA這一塊基本上沒(méi)有比較完善的。對(duì)于canal連接到db主從切換,可以參考:https://www.cnblogs.com/f-zhao/p/7681960.html,已經(jīng)講到位了。如果是半同步模式或者基于GTID的話,沒(méi)有必要回退60s。
在otter中配置canal的主從切換依賴于groupKey,后面測(cè)了會(huì)補(bǔ)充。
總結(jié)
以上是生活随笔為你收集整理的mysql同步数据到另一张表_mysql:Otter跨机房数据同步(单向)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: easy connect 获取服务端配置
- 下一篇: linux cmake编译源码,linu