mysql同步数据到另一张表_mysql:Otter跨机房数据同步(单向)
重要說明:需要同步的表必須要有主鍵 主鍵 主鍵
otter是一款基于Java且免費、開源基于數(shù)據(jù)庫增量日志解析,準實時同步到本機房或異地機房的mysql/oracle數(shù)據(jù)庫的解決方案。
Otter目前支持了什么
1. 單向同步, mysql/oracle互相同步
2. 雙向同步,無沖突變更
3. 文件同步,本地/aranda文件
4. 雙A同步,沖突檢測&沖突補救
5. 數(shù)據(jù)遷移,中間表/行記錄同步
實際測試中,otter的同步速度相比于mysql的復(fù)制,約有5倍左右的性能提升,這取決于其同步算法的實現(xiàn). 拋棄了強一致性,得到了性能提升。
原理描述
基于Canal開源產(chǎn)品,獲取數(shù)據(jù)庫增量日志數(shù)據(jù)。
典型管理系統(tǒng)架構(gòu),manager(web管理)+node(工作節(jié)點)
manager運行時推送同步配置到node節(jié)點
node節(jié)點將同步狀態(tài)反饋到manager上
基于zookeeper,解決分布式狀態(tài)調(diào)度的,允許多node節(jié)點之間協(xié)同工作.
工作流程:otter基于zookeeper解決分布式狀態(tài)調(diào)度,由manager(web管理)和node(工作節(jié)點)組成。manager運行時推送同步配置到node節(jié)點上,node節(jié)點將同步狀態(tài)反饋到manger上。
環(huán)境
Ip
操作系統(tǒng)
Mysql
Manager節(jié)點
Node節(jié)點
192.168.140.24
CenteOS 7.5.1804
Mysql5.7.26
是
是
192.168.140.136
CenteOS 7.5.1804
Mysql5.7.26
否
是
目標:
實現(xiàn)192.168.140.136到192.168.140.24的單向數(shù)據(jù)同步。
名詞解釋
Pipeline:從源端到目標端的整個過程描述,主要由一些同步映射過程組成
Channel:同步通道,單向同步中一個Pipeline組成,在雙向同步中有兩個Pipeline組成
DataMediaPair:根據(jù)業(yè)務(wù)表定義映射關(guān)系,比如源表和目標表,字段映射,字段組等
DataMedia : 抽象的數(shù)據(jù)介質(zhì)概念,可以理解為數(shù)據(jù)表/mq隊列定義
DataMediaSource : 抽象的數(shù)據(jù)介質(zhì)源信息,補充描述DateMedia
ColumnPair : 定義字段映射關(guān)系
ColumnGroup : 定義字段映射組
Node : 處理同步過程的工作節(jié)點,對應(yīng)一個jvm
otter搭建
環(huá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 是一款開源、輕量級的多協(xié)議命令行下載工具,支持 HTTP/HTTPS、FTP、SFTP、BitTorrent 和 Metalink 協(xié)議,擁有眾多第三方支持插件,被譽為「下一代下載工具」和「下載神器」
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é)點node.deployer-4.2.14.tar.gz 并解壓到/usr/local/otter_node
192.168.140.24
因為otter的配置信息存儲在mysql中,所有還有一個初始化腳本:
https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql
網(wǎng)上和otter文檔均提及需要先安裝manager,我仔細看了下,是因為manager是被動連接的(很多應(yīng)用的管理控制臺是主動去連接服務(wù)的,otter則把所有的配置都存儲在了manager中),node啟動的時候會連接到manager獲取同步相關(guān)的信息。生成nid這一步倒沒什么關(guān)系,事后不一致修改也可以。
manager配置
首先在計劃保存otter配置信息的mysql數(shù)據(jù)庫執(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,而不是默認的127.0.0.1,否則到時候啟動的時候所有的連接指向的目標都是localhost,因為通常otter跑在linux環(huán)境,很多l(xiāng)inux環(huán)境是沒有圖形化界面的,感覺這是個bug
## otter manager http port
otter.port = 8088 ## 如果非專用或者已經(jīng)有了一些web應(yīng)用在同一臺服務(wù)器,建議改成其他的避免端口沖突,這里的端口號要和jetty.xml中的保持一致,這里也是,直接用個非8080端口就更友好了,比如weblogic 控制臺7001,es控制臺9200,rabbitmq控制臺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配置信息維護的數(shù)據(jù)庫地址,庫名一般為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
上述配置修改之后,就可以啟動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.
接下去就可以驗證manager了。
用瀏覽器打開http://192.168.160.24:8088/
默認情況下,進去的是匿名賬戶,只有只讀查看的權(quán)限,登錄為管理員才可以有操作權(quán)限,管理員賬號為admin/admin(otter自帶)。
注:默認情況下是沒有channel的,因為筆者的環(huán)境已經(jīng)配置了在單向同步的,所以有顯示一個channel。
manager啟動之后,需要配置使用的zk、canal、node等地址、端口等信息。
zk配置
node配置
端口建議不要修改。
機器添加完成以后,機器管理的列表中第一列就是nid(這個就是到時候要保存到node/conf/nix文件中的值),如下:
上述三種類型的節(jié)點配置完成后,manager前期的配置就完成了。
manager配置完成之后,需要先啟動相應(yīng)的node節(jié)點,node節(jié)點啟動之后,就可以配置真正的同步任務(wù)了。
node配置
首先cd NODE_HOME/conf
echo 1 > nid
node配置文件otter.properties(可以默認,不用做任何修改)如下:
[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
啟動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 ......
此時再查看manager控制臺的機器管理,可以發(fā)現(xiàn)機器狀態(tài)為已啟動,如下:
manager/node都啟動之后,就可以真正開始配置同步任務(wù)了。
同步任務(wù)配置
分為下列幾個步驟(不熟悉術(shù)語概念的建議回到頁首重新review下):
1、添加canal
點位可以通過在主庫執(zhí)行show master status和select unix_timestamp()得到。
2、添加數(shù)據(jù)源
設(shè)置主庫和從庫的數(shù)據(jù)源
3、添加同步表
4、添加channel
5、添加pipeline
pipeline里面主要選擇節(jié)點和canal。
6、添加映射關(guān)系
7、啟動同步
注意:默認會同步ddl,對于分庫分表同步到從庫的時候,建議不要同步ddl以及跳過ddl。
插入數(shù)據(jù)試試看吧。。。。
otter同步異常問題排查與監(jiān)控
筆者一開始啟動后,確實報錯了,如下:
TODO,等后續(xù)梳理確保都可重復(fù)執(zhí)行之后,再補充。
otter簡單性能測試
創(chuàng)建了一個簡單的表使用mysqlslap進行測試。
注:我們因為環(huán)境受限,zk、manager、node、mysql主從均在一臺服務(wù)器上,配置為16c/8GB阿里云服務(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;
測試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等待了,一般來說數(shù)據(jù)庫服務(wù)器io等待持續(xù)到10%之后,系統(tǒng)就很慢了,所以總體來說,如果不做太多的字段重命名、二次處理,otter性能本身還是不錯的。
otter高可用
對外開源部分HA這一塊基本上沒有比較完善的。對于canal連接到db主從切換,可以參考:https://www.cnblogs.com/f-zhao/p/7681960.html,已經(jīng)講到位了。如果是半同步模式或者基于GTID的話,沒有必要回退60s。
在otter中配置canal的主從切換依賴于groupKey,后面測了會補充。
總結(jié)
以上是生活随笔為你收集整理的mysql同步数据到另一张表_mysql:Otter跨机房数据同步(单向)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: easy connect 获取服务端配置
- 下一篇: Java和pathion_Spring配