CanalSharp-mysql数据库binlog的增量订阅消费组件Canal的.NET客户端
一.前言
CanalSharp是阿里巴巴開源項目mysql數(shù)據(jù)庫binlog的增量訂閱&消費組件?Canal?的.NET客戶端,關于什么是 Canal?又能做什么?我會在后文為大家一一介紹。CanalSharp 這個項目,是由我和?WithLin(主要貢獻) 完成,并將一直進行維護的Canal的.NET客戶端項目。目前開源在github:https://github.com/CanalSharp/CanalSharp/?希望大家多多支持,旨在為.NET開發(fā)者提供一個友好的對接Canal的選擇,為.NET社區(qū)生態(tài)做貢獻。
二.Canal介紹
1.背景
早期,阿里巴巴B2B公司因為存在杭州和美國雙機房部署,存在跨機房同步的業(yè)務需求。不過早期的數(shù)據(jù)庫同步業(yè)務,主要是基于trigger的方式獲取增量變更,不過從2010年開始,阿里系公司開始逐步的嘗試基于數(shù)據(jù)庫的日志解析,獲取增量變更進行同步,由此衍生出了增量訂閱&消費的業(yè)務,從此開啟了一段新紀元。
ps. 目前內(nèi)部版本已經(jīng)支持mysql和oracle部分版本的日志解析,當前的canal開源版本支持5.7及以下的版本(阿里內(nèi)部mysql 5.7.13, 5.6.10, mysql 5.5.18和5.1.40/48)
基于日志增量訂閱&消費支持的業(yè)務:
數(shù)據(jù)庫鏡像
數(shù)據(jù)庫實時備份
多級索引 (賣家和買家各自分庫索引)
search build
業(yè)務cache刷新
價格變化等重要業(yè)務消息
2.工作原理
2.1 mysql主備復制實現(xiàn)
從上層來看,復制分成三步:
master將改變記錄到二進制日志(binary log)中(這些記錄叫做二進制日志事件,binary log events,可以通過show binlog events進行查看);
slave將master的binary log events拷貝到它的中繼日志(relay log);
slave重做中繼日志中的事件,將改變反映它自己的數(shù)據(jù)。
2.2 Canal的工作原理
原理相對比較簡單:
canal模擬mysql slave的交互協(xié)議,偽裝自己為mysql slave,向mysql master發(fā)送dump協(xié)議
mysql master收到dump請求,開始推送binary log給slave(也就是canal)
canal解析binary log對象(原始為byte流)
以上內(nèi)容摘自Canal項目官方資料?https://github.com/alibaba/canal
3.Canal的安裝以及使用
Canal的安裝以及使用請查閱官方文檔,本文不在贅述。?https://github.com/alibaba/canal/wiki
三.CanalSharp介紹
1.工作原理
CanalSharp 是 Canal 的 .NET 客戶端,它與 Canal 是采用的Socket來進行通信的,傳輸協(xié)議是TCP,交互協(xié)議采用的是 Google Protocol Buffer 3.0。
2.工作流程
1.Canal連接到mysql數(shù)據(jù)庫,模擬slave
2.CanalSharp與Canal建立連接
2.數(shù)據(jù)庫發(fā)生變更寫入到binlog
5.Canal向數(shù)據(jù)庫發(fā)送dump請求,獲取binlog并解析
4.CanalSharp向Canal請求數(shù)據(jù)庫變更
4.Canal發(fā)送解析后的數(shù)據(jù)給CanalSharp
5.CanalSharp收到數(shù)據(jù),消費成功,發(fā)送回執(zhí)。(可選)
6.Canal記錄消費位置。
以一張圖來表示:
3.應用場景
CanalSharp作為Canal的客戶端,其應用場景就是Canal的應用場景。關于應用場景在Canal介紹一節(jié)已有概述。這里我舉一些實際的使用例子:
1.代替使用輪詢數(shù)據(jù)庫方式來監(jiān)控數(shù)據(jù)庫變更,有效改善輪詢耗費數(shù)據(jù)庫資源。
2.根據(jù)數(shù)據(jù)庫的變更實時更新搜索引擎,比如電商場景下商品信息發(fā)生變更,實時同步到商品搜索引擎 Elasticsearch、solr等
3.根據(jù)數(shù)據(jù)庫的變更實時更新緩存,比如電商場景下商品價格、庫存發(fā)生變更實時同步到redis
4.數(shù)據(jù)庫異地備份、數(shù)據(jù)同步
5.根據(jù)數(shù)據(jù)庫變更觸發(fā)某種業(yè)務,比如電商場景下,創(chuàng)建訂單超過xx時間未支付被自動取消,我們獲取到這條訂單數(shù)據(jù)的狀態(tài)變更即可向用戶推送消息。
6.將數(shù)據(jù)庫變更整理成自己的數(shù)據(jù)格式發(fā)送到kafka等消息隊列,供消息隊列的消費者進行消費。
四.CanalSharp的使用
1.使用前的準備
使用 CanalSharp 之前,必然要先準備好mysql數(shù)據(jù)庫以及Canal才行,這個步驟請直接查閱Canal官方文檔?https://github.com/alibaba/canal/wiki?。但是為了讓大家能快速跑通CanalSharp,CanalSharp 項目為大家提供了一個通過 docker-compose 同時運行 mysql和canal。
2.通過docker-compose運行mysql和canal:
git clone https://github.com/CanalSharp/CanalSharp.git cd docker docker-compose up -d出現(xiàn)下圖表示運行成功:
3.使用navicat等數(shù)據(jù)庫管理工具連接mysql
ip:運行docker的服務器ip
mysql用戶:root
mysql密碼:000000
mysql端口:4406
默認提供了一個test數(shù)據(jù)庫,然后有一張名為test的表。
4.創(chuàng)建一個 .NET Core 控制臺項目
5.添加 Nuget 程序包
Install-Package CanalSharp.Client6.編碼
也可以直接下載源碼運行 Sample 項目?https://github.com/CanalSharp/CanalSharp/tree/master/sample/CanalSharp.SimpleClient
(3)輸出數(shù)據(jù)
7.測試運行
首次運行會輸出一堆數(shù)據(jù),那些都是初始化運行創(chuàng)建表的數(shù)據(jù),忽略即可
運行項目,然后一次執(zhí)行sql觀察輸出:
insert into test values(1000,'111');update test set name='222' where id=1000;delete from test where id=1000;通過新標簽頁打開圖片
可以看見我們分別執(zhí)行 insert、update、delete 語句,我們的CanalSharp都獲取到了數(shù)據(jù)庫變更。
五.使用Canal的經(jīng)驗
1.mysql數(shù)據(jù)庫版本有要求:5.7.13, 5.6.10,、5.5.18和5.1.40/48,不一定非要滿足小版本號的要求,比如 5.7.x、5.6.x、5.5.x都應該可以,但是實際需要自己做測試。前面的具體版本號是Canal官方提供的資料,但是博主公司用的mysql 的版本是5.5.60,是可以正常使用Canal的。
2.mysql數(shù)據(jù)binlog的格式強烈建議設置為row
3.Canal并非必須連接到master數(shù)據(jù)庫,它同樣可以連接到slave數(shù)據(jù)庫,只是從庫出了需要開啟寫入binlog以外還需要設置?log-slave-updates?開啟。
4.如果生產(chǎn)環(huán)境已經(jīng)存在mysql集群,且集群主庫的binlog格式為mixed,mysql數(shù)據(jù)庫集群的主庫binlog格式可以不用改依然為 mixed,設置某一個從庫binlog格式配置為 row,讓Canal連接從庫,這樣可以避免對生產(chǎn)環(huán)境的mysql集群產(chǎn)生影響。
5.mysql支持Statement,MiXED,以及ROW三種格式的binlog為什么推薦使用row格式binlog,經(jīng)過博主實際測試,使用row格式兼容性是最好的,實際可以自己測試。
六.結束語
CanalSharp的介紹到這里就結束了,如果覺得這個項目有用的歡迎大家來個 star 。后續(xù)將會寫幾篇文章介紹更詳細的使用方法以及實戰(zhàn)。
七.資料
CanalSharp 開源地址:https://github.com/CanalSharp/CanalSharp
Canal 開源地址:https://github.com/alibaba/canal
原文地址:?https://www.cnblogs.com/stulzq/p/9702385.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的CanalSharp-mysql数据库binlog的增量订阅消费组件Canal的.NET客户端的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dotnetClub 的前世今生
- 下一篇: Redis 实战之主从复制、高可用、分布