早期,阿里巴巴 B2B 公司由於存在杭州和美國雙機房部署,存在跨機房同步的業務需求。不過早期的數據庫同步業務,主要是基於 trigger 的方式獲取增量變動,不過從 2010 年開始,阿里系公司開始逐步的嘗試基於數據庫的日誌解析,獲取增量變動進行同步,由此衍生出了增量訂閱 & 消費的業務,今後開啓了一段新紀元。mysql
ps. 目前內部版本已經支持 mysql 和 oracle 部分版本的日誌解析,當前的 canal 開源版本支持 5.7 及如下的版本 (阿里內部 mysql 5.7.13, 5.6.10, mysql 5.5.18 和 5.1.40/48)git
基於日誌增量訂閱 & 消費支持的業務:github
項目地址:https://github.com/alibaba/canal ,目前版本爲 1.1.1。spring
下載解壓到部署目錄,相關配置更改: 修改配置文件 conf/canal.propertiessql
# zk的配置地址 canal.zkServers=192.168.123.123:2181 #關閉netty canal.withoutNetty = true # tcp, kafka, RocketMQ canal.serverMode = kafka #須要同步的表名 canal.destinations=student,student_extend canal.instance.global.spring.xml = classpath:spring/default-instance.xml
參照 conf/example/目錄複製出 conf/student/ ,每一個destinations定義的表對應一個目錄 修改 conf/student/instance.properties文件數據庫
# 數據庫配置 canal.instance.master.address=192.168.123.123:3306 canal.instance.dbUsername=canal canal.instance.dbPassword=canal # 是否開啓密碼加密解析,使用druid加密,如果密碼屬於加密的,能夠開啓,並修改canal.instance.pwdPublicKey canal.instance.enableDruid=false canal.instance.filter.regex=dbname.tablename
# kafka地址 servers: 192.168.1.1:9092,192.168.1.2:9092,192.168.1.3:9092 # 重試次數 retries: 3 # 隊列定義 canalDestinations: - canalDestination: student topic: dada-db-dadaabc-student partitionsNum: 3 partitionHash: dadaabc.student: id - canalDestination: student_extend topic: dada-db-dadaabc-student-extend partitionsNum: 3 partitionHash: dadaabc.student: id
修改日誌路徑 logback.xmlbash
略oracle
進入bin目錄,執行 startup.sh 便可tcp
1.若是使用阿里雲RDS,因爲18小時刪除機制,超過18小時恢復須要配置oss相關設置,參見: https://github.com/alibaba/canal/wiki/aliyun-RDS-QuickStart分佈式
2.分佈式主備須要引用同一個zookeeper配置。
3.若是開啓了ROW模式binlog,但消息類型仍然是QUERY,參考下圖:
則須要確認mysql設置:binlog-rows-query-log-events設置爲OFF,這個問題查了很久。