mysql:Otter跨機房數據同步(單向)

重要說明:需要同步的表必須要有主鍵 主鍵 主鍵

otter是一款基於Java且免費、開源基於數據庫增量日誌解析,準實時同步到本機房或異地機房的mysql/oracle數據庫的解決方案。

mysql:Otter跨機房數據同步(單向)

Otter目前支持了什麼

1. 單向同步, mysql/oracle互相同步

2. 雙向同步,無衝突變更

3. 文件同步,本地/aranda文件

4. 雙A同步,衝突檢測&衝突補救

5. 數據遷移,中間表/行記錄同步

實際測試中,otter的同步速度相比於mysql的複製,約有5倍左右的性能提升,這取決於其同步算法的實現. 拋棄了強一致性,得到了性能提升。

原理描述

基於Canal開源產品,獲取數據庫增量日誌數據。

典型管理系統架構,manager(web管理)+node(工作節點)

manager運行時推送同步配置到node節點

node節點將同步狀態反饋到manager上

基於zookeeper,解決分佈式狀態調度的,允許多node節點之間協同工作.

mysql:Otter跨機房數據同步(單向)

工作流程:otter基於zookeeper解決分佈式狀態調度,由manager(web管理)和node(工作節點)組成。manager運行時推送同步配置到node節點上,node節點將同步狀態反饋到manger上。

mysql:Otter跨機房數據同步(單向)

環境

Ip

操作系統

Mysql

Manager節點

Node節點

192.168.140.24

CenteOS 7.5.1804

Mysql5.7.26

192.168.140.136

CenteOS 7.5.1804

Mysql5.7.26

目標:

實現192.168.140.136到192.168.140.24的單向數據同步。

名詞解釋

Pipeline:從源端到目標端的整個過程描述,主要由一些同步映射過程組成

Channel:同步通道,單向同步中一個Pipeline組成,在雙向同步中有兩個Pipeline組成

DataMediaPair:根據業務表定義映射關係,比如源表和目標表,字段映射,字段組等

DataMedia : 抽象的數據介質概念,可以理解為數據表/mq隊列定義

DataMediaSource : 抽象的數據介質源信息,補充描述DateMedia

ColumnPair : 定義字段映射關係

ColumnGroup : 定義字段映射組

Node : 處理同步過程的工作節點,對應一個jvm

otter搭建

環境準備

[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 是一款開源、輕量級的多協議命令行下載工具,支持 HTTP/HTTPS、FTP、SFTP、BitTorrent 和 Metalink 協議,擁有眾多第三方支持插件,被譽為「下一代下載工具」和「下載神器」

otter的安裝包以及腳本:

從https://github.com/alibaba/otter/releases下載,例如:

mysql:Otter跨機房數據同步(單向)

192.168.140.24

下載並分別解壓到/usr/local/otter_node,/usr/local/otter_manager目錄,如下:

mysql:Otter跨機房數據同步(單向)

192.168.140.136

下載node節點node.deployer-4.2.14.tar.gz 並解壓到/usr/local/otter_node

mysql:Otter跨機房數據同步(單向)

192.168.140.24

因為otter的配置信息存儲在mysql中,所有還有一個初始化腳本:

https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql

網上和otter文檔均提及需要先安裝manager,我仔細看了下,是因為manager是被動連接的(很多應用的管理控制檯是主動去連接服務的,otter則把所有的配置都存儲在了manager中),node啟動的時候會連接到manager獲取同步相關的信息。生成nid這一步倒沒什麼關係,事後不一致修改也可以。

manager配置

首先在計劃保存otter配置信息的mysql數據庫執行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 ## 建議改成所在服務器的ip,而不是默認的127.0.0.1,否則到時候啟動的時候所有的連接指向的目標都是localhost,因為通常otter跑在linux環境,很多linux環境是沒有圖形化界面的,感覺這是個bug

## otter manager http port

otter.port = 8088 ## 如果非專用或者已經有了一些web應用在同一臺服務器,建議改成其他的避免端口衝突,這裡的端口號要和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配置信息維護的數據庫地址,庫名一般為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/

mysql:Otter跨機房數據同步(單向)

默認情況下,進去的是匿名賬戶,只有只讀查看的權限,登錄為管理員才可以有操作權限,管理員賬號為admin/admin(otter自帶)。

注:默認情況下是沒有channel的,因為筆者的環境已經配置了在單向同步的,所以有顯示一個channel。

manager啟動之後,需要配置使用的zk、canal、node等地址、端口等信息。

zk配置

mysql:Otter跨機房數據同步(單向)

mysql:Otter跨機房數據同步(單向)

node配置

mysql:Otter跨機房數據同步(單向)

mysql:Otter跨機房數據同步(單向)

端口建議不要修改。

機器添加完成以後,機器管理的列表中第一列就是nid(這個就是到時候要保存到node/conf/nix文件中的值),如下:

mysql:Otter跨機房數據同步(單向)

上述三種類型的節點配置完成後,manager前期的配置就完成了。

manager配置完成之後,需要先啟動相應的node節點,node節點啟動之後,就可以配置真正的同步任務了。

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控制檯的機器管理,可以發現機器狀態為已啟動,如下:

mysql:Otter跨機房數據同步(單向)

manager/node都啟動之後,就可以真正開始配置同步任務了。

同步任務配置

分為下列幾個步驟(不熟悉術語概念的建議回到頁首重新review下):

1、添加canal

mysql:Otter跨機房數據同步(單向)

mysql:Otter跨機房數據同步(單向)

點位可以通過在主庫執行show master status和select unix_timestamp()得到。

2、添加數據源

設置主庫和從庫的數據源

mysql:Otter跨機房數據同步(單向)

mysql:Otter跨機房數據同步(單向)

3、添加同步表

mysql:Otter跨機房數據同步(單向)

mysql:Otter跨機房數據同步(單向)

4、添加channel

mysql:Otter跨機房數據同步(單向)

5、添加pipeline

pipeline裡面主要選擇節點和canal。

6、添加映射關係

mysql:Otter跨機房數據同步(單向)

mysql:Otter跨機房數據同步(單向)

7、啟動同步

mysql:Otter跨機房數據同步(單向)

注意:默認會同步ddl,對於分庫分表同步到從庫的時候,建議不要同步ddl以及跳過ddl。

插入數據試試看吧。。。。

otter同步異常問題排查與監控

筆者一開始啟動後,確實報錯了,如下:

mysql:Otter跨機房數據同步(單向)

TODO,等後續梳理確保都可重複執行之後,再補充。

otter簡單性能測試

創建了一個簡單的表使用mysqlslap進行測試。

注:我們因為環境受限,zk、manager、node、mysql主從均在一臺服務器上,配置為16c/8GB阿里雲服務器,無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等如下:

mysql:Otter跨機房數據同步(單向)

mysql:Otter跨機房數據同步(單向)

可以看出後面基本上都在io等待了,一般來說數據庫服務器io等待持續到10%之後,系統就很慢了,所以總體來說,如果不做太多的字段重命名、二次處理,otter性能本身還是不錯的。

otter高可用

對外開源部分HA這一塊基本上沒有比較完善的。對於canal連接到db主從切換,可以參考:https://www.cnblogs.com/f-zhao/p/7681960.html,已經講到位了。如果是半同步模式或者基於GTID的話,沒有必要回退60s。

在otter中配置canal的主從切換依賴於groupKey,後面測了會補充。


分享到:


相關文章: