一、Otter簡介
1.1 otter是什么?
otter
譯意: 水獺,數據搬運工
語言: 純java開發
定位: 基於數據庫增量日志解析,准實時同步到本機房或異地機房的mysql/oracle數據庫. 一個分布式數據庫同步系統。Ottter是由阿里開源的一個數據同步產品,它的最初的目的是為了解決跨國異地機房雙A架構,兩邊可寫的場景,開發時間從2011年7月份一直持續到現在,目前阿里巴巴B2B內部的本地/異地機房的同步需求基本全上了Otter。Otter基於數據庫增量日志解析,支持mysql/oracle數據庫進行同步,也有全量同步的,如果我們有全表更新或者想要歷史數據的需求怎么辦?這就涉及到otter的ziyou門功能。
1.2 otter工作原理
原理描述:
1. 基於Canal開源產品,獲取數據庫增量日志數據。 什么是Canal, 請點擊
2. 典型管理系統架構,manager(web管理)+node(工作節點)
a. manager運行時推送同步配置到node節點
b. node節點將同步狀態反饋到manager上
3. 基於zookeeper,解決分布式狀態調度的,允許多node節點之間協同工作.
4.db : 數據源以及需要同步到的庫
1.3 otter的特性
- 使用純JAVA開發,占時資源比較高
- 基於Canal獲取數據庫增量日志,Canal是阿里爸爸另外一個開源產品
- 使用manager(web管理)+node(工作節點),manager負責配置監控,node負責處理任務
- 基於zookeeper,解決分布式狀態調度的,允許多node節點之間協同工作
- 使用aria2多線程傳輸技術,對網絡依賴帶寬依賴較低
1.4 otter能解決什么問題
1、異構庫同步
Otter支持從Mysql同步到Mysql/oracle,我們可以把mysql同步到oracle
2、單機房同步
可以作為一主多從同步方案,對於單機房內網來說效率非常高,還可以做為數據庫版本升級,數據表遷移,二級索引等這類功能
3、異地機房同步
異地機房同步可以說是Otter最大的亮點之一,可以解決國際化問題把數據從國內同步到國外來提供用戶使用,在國內場景可以做到數據多機房容災
4、雙向同步
雙向同步是在數據同步中最難搞的一種場景,Otter可以很好的應對這種場景,Otter有避免回環算法和數據一致性算法兩種特性,保證雙A機房模式下,數據保證最終一致性
5、文件同步
站點鏡像,進行數據復制的同時,復制關聯的圖片,比如復制產品數據,同時復制產品圖片
二、Manager安裝配置
2.1 環境初始化
官方地址:https://github.com/alibaba/otter
我們把下載好的文件存放到/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
2.2 安裝配置JDK
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)
2.3 安裝zookeeper
安裝配置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
2.4 安裝manager
准備工作做好了我們來一同安裝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就已經配置好了
三、Node的安裝配置
3.1 安裝配置aria2
我們在介紹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
3.2 安裝配置node
接下來我們來配置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.
3.3 關聯manager,zookeeper和node
最后我們來吧manager,zookeeper和node關聯起來,我們先進入manager的管理界面,點擊右邊的登陸:
使用默認用戶名密碼admin:admin登陸進去:
找到機器管理的zookeeper配置點擊進去:
選擇添加一個zookeeper:
填好自己本地的zookeeper地址和端口保存:
在選擇機器管理的node管理點擊進去:
選擇添加一個node:
配置好node的一些參數
- 機器名稱:可以隨意定義,方便自己記憶即可
- 機器ip:對應node節點將要部署的機器ip,如果有多ip時,可選擇其中一個ip進行暴露. (此ip是整個集群通訊的入口,實際情況千萬別使用127.0.0.1,否則多個機器的node節點會無法識別)
- 機器端口:對應node節點將要部署時啟動的數據通訊端口,建議值:2088
- 下載端口:對應node節點將要部署時啟動的數據下載端口,建議值:9090
- 外部ip :對應node節點將要部署的機器ip,存在的一個外部ip,允許通訊的時候走公網處理。
- zookeeper集群:為提升通訊效率,不同機房的機器可選擇就近的zookeeper集群.
node這種設計,是為解決單機部署多實例而設計的,允許單機多node指定不同的端口:
這個時候就可以啟動我們的node了:
-
cd /home/work/node/bin/
-
./startup.sh
注意:如果發現啟動不了可以查看node的日志
等帶一段時間后刷新會發現狀態已經變為了啟動,這個時候就已經成功了:
並且這個時候我們在zookeeper頁面點擊查看選項可以看到zookeeper已經在運行了:
注意:如果發現一直都是未啟動狀態可以查閱/tmp/node/logs中的日志
四、單向同步配置實踐
4.1 准備工作
建一個測試庫
別注意:庫名中千萬不要帶有符號比如"-"這種符號會直接引起同步開啟不成功(需要驗證)
-
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
4.2 配置manager
首先我們需要配置數據連接,也就是數據源
添加完之后一定要驗證一下
同樣的操作添加另外一個數據源
4.3 配置同步數據表
配置好數據源后進行需要同步的數據表的配置
4.4 配置同步規則
在同步管理里面添加一個channel
添加配置好一個channel使用的master庫
4.5 開啟同步
至此,簡單的一個單向同步方案完。但是還有很多問題沒有解決:比如otter的監控,數據一致性校驗,otter同步比mysql跨公網同步的優勢(在網絡中斷時,otter和原生的跨公網同步有什么區別),otter的限制等等。路漫漫兮其修遠......