前言:最近接了一個新的需求,須要在倫敦機房作一個數據同步方案,同步到北京。由於以前搭建過公網之間的同步,一是延遲比較大,另外一個是由於同步常常會斷。臨時解決方案就是搭建一個多源複製,隔斷時間全量一次數據到北京機房,可是這個傳輸時間也是個頭疼的問題java
Ottter是由阿里開源的一個數據同步產品,它的最初的目的是爲了解決跨國異地機房雙A架構,兩邊可寫的場景,開發時間從2011年7月份一直持續到如今,目前阿里巴巴B2B內部的本地/異地機房的同步需求基本全上了Otter。node
Otter基於數據庫增量日誌解析,支持mysql/oracle數據庫進行同步,在最新的v4.2.13已經支持mysql5.7以及阿里雲提供的RDS數據庫(使用RDS童鞋的福音)mysql
一、異構庫同步linux
Otter支持從Mysql同步到Mysql/oracle,咱們能夠把mysql同步到oraclegit
二、單機房同步github
能夠做爲一主多從同步方案,對於單機房內網來講效率很是高,還能夠作爲數據庫版本升級,數據表遷移,二級索引等這類功能web
三、異地機房同步算法
異地機房同步能夠說是Otter最大的亮點之一,能夠解決國際化問題把數據從國內同步到國外來提供用戶使用,在國內場景能夠作到數據多機房容災sql
四、雙向同步數據庫
雙向同步是在數據同步中最難搞的一種場景,Otter能夠很好的應對這種場景,Otter有避免迴環算法和數據一致性算法兩種特性,保證雙A機房模式下,數據保證最終一致性
五、文件同步
站點鏡像,進行數據複製的同時,複製關聯的圖片,好比複製產品數據,同時複製產品圖片
咱們把下載好的文件存放到/home/work/optar目錄下:
[root@localhost optar]# ls aria2-1.17.1.tar.gz jdk-7u79-linux-x64.tar.gz mysql-5.7.18.tar.gz dbproxy.tar.gz jdk-8u65-linux-x64.tar.gz node.deployer-4.2.13.tar.gz go1.8.1.linux-amd64.tar.gz manager.deployer-4.2.13.tar.gz zookeeper-3.4.6.tar.gz
薦使用OneinStack進行環境配置(默認會更新GCC,cmake等減小依賴出現的問題)
wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz tar xzf oneinstack-full.tar.gz cd oneinstack ./install.sh
JDK配置也能夠經過上方oneinstack中選擇web服務tomcat來配置
首先咱們應該要安裝配置JDK,應爲zookeeper和Otter-manager都依賴與java環境
tar -zxvf jdk-7u79-linux-x64.tar.gz mv jdk1.7/ /usr/local/
設定JAVA_HOME環境變量,編輯vim /etc/profile 加入以下內容
export JAVA_HOME=/usr/local/jdk1.7 export JRE_HOME=/usr/local/jdk1.7/jre export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib: export PATH=$JAVA_HOME/bin:$PATH
更改後,執行命令使其生效
source /etc/profile
執行 java -version 會看到以下版本信息證實已經安裝成功
[root@localhost local]# java -version java version "1.8.0_65" Java(TM) SE Runtime Environment (build 1.8.0_65-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
安裝配置zookeeper單機模式
cd /home/work tar zxvf zookeeper-3.4.5-cdh4.3.0.tar.gz mv zookeeper-3.4.5-cdh4.3.0 zookeeper cd /home/work/zookeeper/ mv conf/zoo_sample.cfg conf/zoo.cfg mkdir -p /home/work/data/zookeeper/{data,log} cd /home/work/data/zookeeper/data echo 1 > myid #將本節點id設定到data/myid文件中
修改bin/zkEnv.sh腳本:
將ZOO_LOG_DIR="."修改成
ZOO_LOG_DIR="/home/work/data/zookeeper/log"
將ZOO_LOG4J_PROP=」INFO,CONSOLE」修改成
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
修改bin/zkServer.sh腳本:
將ZOOBIN="${BASH_SOURCE-$0}"修改成
ZOOBIN=`readlink -f "${BASH_SOURCE-$0}"`
修改bin/zkCli.sh腳本:
將ZOOBIN="${BASH_SOURCE-$0}"修改成
ZOOBIN=`readlink -f "${BASH_SOURCE-$0}"`
創建軟鏈接到PATH:
ln -s /home/work/zookeeper/bin/zkServer.sh /usr/local/bin/zk-server ln -s /home/work/zookeeper/bin/zkCli.sh /usr/local/bin/zk-cli
使用以下命令便可啓動zookeeper:
zk-server start #如下輸出爲運行成功 JMX enabled by default Using config: /tmp/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED
準備工做作好了咱們來一同安裝manager
mkdir /home/work/manager cd /home/work/optar tar zxvf manager.deployer-4.2.13.tar.gz -C /home/work/manager
安裝manager的數據庫
wget https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql mysql -uroot -p #輸入mysql密碼 source /home/work/manager/otter-manager-schema.sql
修改vim conf/otter.properties 配置文件
## otter manager domain name #修改成正確訪問ip(內網訪問配置內網地址外網訪問配置外網地址),生成URL使用 otter.domainName = 127.0.0.1 ## otter manager http port otter.port = 8080 ## otter manager database config ,修改成正確數據庫信息 otter.database.driver.url = jdbc:mysql://127.0.0.1:3306/otter otter.database.driver.username = root otter.database.driver.password = hello ## default zookeeper address,修改成正確的地址,手動選擇一個地域就近的zookeeper集羣列表,zookeeper默認端口 2181 otter.zookeeper.cluster.default = 127.0.0.1:2181
啓動manager
./bin/startup.sh
PS:manager 編譯時間大約須要1分鐘
檢查日誌:
tailf logs/manager.log
以下輸出則爲啓動成功:
2017-11-04 11:08:20.527 [] INFO com.alibaba.otter.manager.deployer.OtterManagerLauncher - ## start the manager server. 2017-11-04 11:08:45.420 [] INFO com.alibaba.otter.manager.deployer.JettyEmbedServer - ##Jetty Embed Server is startup! 2017-11-04 11:08:45.420 [] INFO com.alibaba.otter.manager.deployer.OtterManagerLauncher - ## the manager server is running now ......
咱們在訪問咱們設置的能夠訪問的地址的8080端口,注意要關掉8080的防火牆不然一直會訪問不通
看到以下顯示咱們的manager就已經配置好了
咱們在介紹otter的特性裏面有說起到aria2,它是一個文件通道來保證須要同步的數據經過極快的速度同步到須要同步的服務器上
cd /home/work/ tar zxvf aria2-1.17.1.tar.gz mv aria2-1.17.1 aria2 cd aria2 ./configure make make install # 驗證安裝是否成功 aria2c -v # 會輸出 aria2 version 1.17.1 Copyright (C) 2006, 2013 Tatsuhiro Tsujikawa
接下來咱們來配置node,node主要負責接受manage下發任務的處理
mkdir /home/work/node tar xf node.deployer-4.2.13.tar.gz cd /home/work/node/ # nid配置node的ID多個node協同工做時不能重複 echo 1 > conf/nid # 修改配置文件 vim conf/otter.properties # 主要是確認鏈接manager地址是否正確(這裏使用服務器內網地址進行配置) otter.manager.address = 10.144.159.182:1099
配置完成以後咱們不要着急啓動node,由於啓動了node要是manager沒有配置是無法創建鏈接的,順序是先配置好manager在開啓node.
最後咱們來吧manager,zookeeper和node關聯起來,咱們先進入manager的管理界面,點擊右邊的登錄:
使用默認用戶名密碼admin:admin登錄進去:
找到機器管理的zookeeper配置點擊進去:
選擇添加一個zookeeper:
填好本身本地的zookeeper地址和端口保存:
在選擇機器管理的node管理點擊進去:
選擇添加一個node:
配置好node的一些參數
node這種設計,是爲解決單機部署多實例而設計的,容許單機多node指定不一樣的端口:
這個時候就能夠啓動咱們的node了:
cd /home/work/node/bin/ ./startup.sh
注意:若是發現啓動不了能夠查看node的日誌
等帶一段時間後刷新會發現狀態已經變爲了啓動,這個時候就已經成功了:
而且這個時候咱們在zookeeper頁面點擊查看選項能夠看到zookeeper已經在運行了:
注意:若是發現一直都是未啓動狀態能夠查閱/tmp/node/logs中的日誌
建一個測試庫
別注意:庫名中千萬不要帶有符號好比"-"這種符號會直接引發同步開啓不成功(須要驗證)
create database dqd_test; CREATE TABLE `dqd_test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `age` int(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
首先咱們須要配置數據鏈接,也就是數據源
添加完以後必定要驗證一下
一樣的操做添加另一個數據源
配置好數據源後進行須要同步的數據表的配置
在同步管理裏面添加一個channel
添加配置好一個channel使用的master庫
至此,簡單的一個單向同步方案完。可是還有不少問題沒有解決:好比otter的監控,數據一致性校驗,otter同步比mysql跨公網同步的優點(在網絡中斷時,otter和原生的跨公網同步有什麼區別),otter的限制等等。路漫漫兮其修遠......
參考博客:https://my.oschina.net/wenzhenxi/blog?catalog=3663174&temp=1509356134467
爲了方便你們交流,本人開通了微信公衆號(關注看更多精彩)和QQ羣,QQ羣1(291519319)和QQ羣2(659336691)。喜歡技術的一塊兒來交流吧