介紹一款阿里巴巴的數據訂閱&消費工具otter,這款產品當時用於解決阿里中美機房數據庫實時同步問題。node
這裏主要講的是用otter增量同步生產數據庫到測試環境數據庫。mysql
otter的定位:git
基於數據庫增量日誌分析,實時同步數據github
爲何不用mysql自帶的主從同步到測試?web
由於測試環境的特殊性,功能比較新,有些新表和新字段,直接從生產同步顯然不能知足業務需求。otter就能很好解決這個問題,基於binlog分析只對生產有變動的數據進行同步,這樣就不會覆蓋測試環境已修改的數據,測試環境新增字段和表也不會被覆蓋。算法
otter的工做原理:sql
1.基於canal,獲取數據庫增量日誌,otter的核心組件也就是canal。docker
2.典型的管理系統架構,manager(web管理)+node(節點)數據庫
manager運行時推送同步配置到node節點bash
node節點將同步狀態反饋到manager
3.基於zookeeper,解決分佈式狀態調度,容許多node節點之間協同工做。
otter能解決:
異構庫同步
a. mysql -> mysql/oracle. (目前開源版本只支持mysql增量,目標庫能夠是mysql或者oracle,取決於canal的功能)
單機房同步 (數據庫之間RTT < 1ms)
a. 數據庫版本升級
b. 數據表遷移
c. 異步二級索引
異地機房同步 (好比阿里巴巴國際站就是杭州和美國機房的數據庫同步,RTT > 200ms,亮點)
a. 機房容災
雙向同步
a. 避免迴環算法 (通用的解決方案,支持大部分關係型數據庫)
b. 數據一致性算法 (保證雙A機房模式下,數據保證最終一致性,亮點)
文件同步
a. 站點鏡像 (進行數據複製的同時,複製關聯的圖片,好比複製產品數據,同時複製產品圖片).
實戰:
用途:生產增量同步指定表到測試環境,供測試工程師測試業務,屬於單機房單項同步。
前提,源庫my.cnf開啓,binlog,row模式:
log_bin = mysql-bin #打開日誌
binlog_format = ROW #設置row模式的日誌格式
server-id = 2 #id不能重複
在增量以前,作一次數據庫的全量同步,能夠用xtrbackup。
1.用docker一鍵安裝啓動otter,自動處理映射,目錄掛載等
curl fsSL https://raw.githubusercontent.com/alibaba/otter/master/docker/run.sh | bash
默認run.sh腳本會經過目錄掛載的方式,將數據文件掛載到當前的data/目錄下(包含zkData/mysql兩個子目錄),因此執行curl以前最好進入到一個本身的工做目錄,好比cd otter
2.訪問otter的manager地址
http://${host}:8080/
3.配置
3.1配置 數據源
3.2進入配置管理-數據表配置
3.3進入配置管理-canal配置
3.4進入機器管理-node,爲默認配置,otter啓動會默認配好。
3.5進入同步管理-channel
3.6點擊相應的channel名字,進入Pipeline配置,高級配置默認就行。
3.7點擊pipeline名字列表,進入配置映射關係
3.8配置好後,則同步已開始
注意:表必須設置主鍵才能作同步
4.監控
進入監控-日誌管理,如有異常會有日誌輸出
5.給出測試數據
CREATE TABLE `test`.`example` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) COLLATE utf8_bin DEFAULT NULL , PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into test.example(id,name) values(null,'hello');
6.效果
源庫中插入數據,目標庫立馬將新數據同步過來
目標庫必須先建立表結構才能同步數據
更多精彩,關注公衆號