mysql同步之otter/canal環境搭建完整詳細版

接上一篇mysql 5.7多源複製(用於生產庫多主庫合併到一個查詢從庫)html

這一篇詳細介紹otter/canal環境搭建以及當同步出現異常時如何排查。本文主要參考https://blog.csdn.net/wudufeng/article/details/78688240搭建,出現異常時,主要參考了otter的官方文檔,時候閱讀官方文檔的時候,發現你們仍是能夠直接參考官方文檔吧,本文和https://blog.csdn.net/wudufeng/article/details/78688240基本上下列幾個官方文檔的整合。只不過文本會包含一些額外的闡述和解釋以便更好的理解上下文。java

總的來講,搭建DEMO式可用的otter環境很簡單,關鍵在於HA和異常時如何讓他快速恢復、壓測時的延時如何儘量短,TPS儘量高。node

https://github.com/alibaba/otter/wiki/Introductionmysql

https://github.com/alibaba/otter/wiki/Manager_Quickstartlinux

https://github.com/alibaba/otter/wiki/Node_Quickstartgit

https://github.com/alibaba/otter/wiki/Adminguidegithub

https://github.com/alibaba/otter/wiki/Manager%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8Dweb

https://github.com/alibaba/otter/wiki/Manager%E4%BD%BF%E7%94%A8%E4%BB%8B%E7%BB%8Dsql

https://github.com/alibaba/otter/wiki/%E6%98%A0%E5%B0%84%E8%A7%84%E5%88%99%E9%85%8D%E7%BD%AE數據庫

https://blog.csdn.net/wudufeng/article/details/78688240

https://github.com/alibaba/otter/wiki/%E6%98%A0%E5%B0%84%E8%A7%84%E5%88%99%E9%85%8D%E7%BD%AE(對於自定義擴展來講,這個文檔是重點)

https://github.com/alibaba/otter/wiki/Otter%E6%89%A9%E5%B1%95%E6%80%A7

https://github.com/alibaba/otter/wiki/Otter%E9%AB%98%E5%8F%AF%E7%94%A8%E6%80%A7

otter的整體架構

otter強依賴於canal,並對canal的配置有必定的約束。也正是由於強約束,在node中集成了canal,canal做爲node的線程運行,使用otter搭建mysql同步環境不須要先手工搭建canal。在開始進入搭建環節以前,建議先看下術語,除非很清楚了,否則相信我,你仍是要回過頭來看的。

  • Pipeline:從源端到目標端的整個過程描述,主要由一些同步映射過程組成
  • Channel:同步通道,單向同步中一個Pipeline組成,在雙向同步中有兩個Pipeline組成
  • DataMediaPair:根據業務表定義映射關係,好比源表和目標表,字段映射,字段組等
  • DataMedia : 抽象的數據介質概念,能夠理解爲數據表/mq隊列定義
  • DataMediaSource : 抽象的數據介質源信息,補充描述DateMedia
  • ColumnPair : 定義字段映射關係
  • ColumnGroup : 定義字段映射組
  • Node : 處理同步過程的工做節點,對應一個jvm

他們之間的關係爲:

 

下面進入正題,otter的搭建。

otter搭建

環境準備

從上圖和otter文檔可知,otter/canal均使用java開發,配置信息存儲在mysql中,同步和HA信息在zk中。因此咱們須要先安裝下列包:

jdk 1.8

mysql 5.7 參考mysql 5.7安裝與參數優化

zk 3.4.x 參考https://zookeeper.apache.org/doc/r3.4.12/zookeeperStarted.html

aria2。yum install aria2   ## aria2官網) 是一款開源、輕量級的多協議命令行下載工具,支持 HTTP/HTTPS、FTP、SFTP、BitTorrent 和 Metalink 協議,擁有衆多第三方支持插件,被譽爲「下一代下載工具」和「下載神器」,然而因爲安裝配置複雜,擋住了許多人的使用。參考http://blog.sina.com.cn/s/blog_6bf2cd8a0102x3w2.html

otter的安裝包以及腳本:

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

下載並分別解壓到/usr/local/app/node,/usr/local/app/manager目錄,以下:

由於otter的配置信息存儲在mysql中,全部還有一個初始化腳本:

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

otter一共包含兩個部分,manager(做爲otter的配置中心和管理控制檯應用)和node(做爲otter的實際同步工做節點)。

網上和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 = 172.28.1.97      ## 建議改爲所在服務器的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://127.0.0.1:3308/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 = 127.0.0.1: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/app/manager/bin

./startup.sh

查看日誌

tail -fn 100 ../logs/manager.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 14:59:49.002 [] INFO com.alibaba.otter.manager.deployer.OtterManagerLauncher - ## start the manager server.
2018-07-03 14:59:57.420 [] INFO com.alibaba.otter.manager.deployer.JettyEmbedServer - ##Jetty Embed Server is startup!
2018-07-03 14:59:57.420 [] INFO com.alibaba.otter.manager.deployer.OtterManagerLauncher - ## the manager server is running now ......

接下去就能夠驗證manager了。

用瀏覽器打開http://172.18.1.97:8088/ 

默認狀況下,進去的是匿名帳戶,只有只讀查看的權限,登陸爲管理員才能夠有操做權限,管理員帳號爲admin/admin(otter自帶)。

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

manager啓動以後,須要配置使用的zk、canal、node等地址、端口等信息。

zk配置

node配置

 

 

 端口建議不要修改。

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

 

上述三種類型的節點配置完成後,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 = 127.0.0.1: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控制檯的機器管理,能夠發現機器狀態爲已啓動,以下:

manager/node都啓動以後,就能夠真正開始配置同步任務了。

同步任務配置 

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

一、添加canal

 

 

 點位能夠經過在主庫執行show master status和select unix_timestamp()獲得。

 

二、添加數據源

 設置主庫和從庫的數據源

 

三、添加同步表

 

 

 

四、添加channel

 

 

五、添加pipeline

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

六、添加映射關係

 

 

七、啓動同步

 

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

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

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等以下:

 

測試2000w條插入

mysqlslap --defaults-file="/etc/my.cnf.57" --concurrency=100 --iterations=1 --create-schema=otter_test --query="insert into otter_test_table1 values(FLOOR(1000000 + (RAND() * 100000000)),'namefwei8388dfe88827d7f8fjfjweifiwewifeweuwewuweuewuweuuusyfyeywewew23') ON DUPLICATE KEY UPDATE name='wifeufwuwwu'" --number-of-queries=20000000 -uroot -p123456 -P3307 -h127.0.0.1

延遲、tps、cpu、io等待等以下:

 

 

 

能夠看出後面基本上都在io等待了,通常來講數據庫服務器io等待持續到10%以後,系統就很慢了,因此整體來講,若是不作太多的字段重命名、二次處理,otter性能自己仍是不錯的。

otter高可用

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

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

 

其餘參考

https://wenku.baidu.com/view/930a5723227916888586d70b.html 

https://github.com/alibaba/otter/wiki/Faq

https://my.oschina.net/dxqr/blog/524795

http://shift-alt-ctrl.iteye.com/blog/2399603

相關文章
相關標籤/搜索