canal原理的一些学习-1(canal的一些原理性介绍)
- 1. cannal 是什么,能做什么用
- 1.1 mysql的binlog
- 1.2 mysql 的主從復制過程
- 1.3 canal能夠同步數據的原理
- 2. quick start
- 3. canal 的設計
- 3.1 canal的設計理念
- 3.2 canal的組件有哪些
- 3.3 instance 包含的組件
- 3.4 各個組件目前支持的類型
- 4. canal的工作過程
- 4.1 啟動時去MySQL 進行dump操作的binlog 位置確定
- 4.2 數據在dump回來之后進行的歸集(sink)和存儲(store)
- 4.3 binlog的消費者
- 5. canal的目錄結構(不包含lib目錄)
- 1. cannal 是什么,能做什么用
1. cannal 是什么,能做什么用
canal 的歷史
??早期,阿里巴巴B2B公司因為存在杭州和美國雙機房部署,存在跨機房同步的業務需求。不過早期的數據庫同步業務,主要是基于trigger的方式獲取增量變更,不過從2010年開始,阿里系公司開始逐步的嘗試基于數據庫的日志解析,獲取增量變更進行同步,由此衍生出了增量訂閱&消費的業務。
??基于數據庫增量日志解析,提供增量數據訂閱&消費,目前主要支持了mysql。
1.1 mysql的binlog
??它記錄了所有的DDL和DML(除了數據查詢語句)語句,以事件形式記錄,還包含語句所執行的消耗的時間。主要用來備份和數據同步。
binlog 有三種模式:STATEMENT、ROW、MIXED
1.STATEMENT 記錄的是執行的sql語句
2.ROW 記錄的是真實的行數據記錄
3.MIXED 記錄的是1+2,優先按照1的模式記錄
舉例來說,下面的sql
update user set age=20
對應STATEMENT模式只有一條記錄,對應ROW模式則有可能有成千上萬條記錄(取決數據庫中的記錄數)。
1.2 mysql 的主從復制過程
當然這個過程本質上還是存在一定的延遲的。
mysql的binlog文件長這個樣子。
1.3 canal能夠同步數據的原理
理解了mysql的主從同步的機制再來看canal就比較清晰了,canal主要是聽過偽裝成mysql從server來向主server拉取數據。
2. quick start
直接引用 阿里的就不錯,這里是一個阿里的單機版配置。
https://github.com/alibaba/canal/wiki/QuickStart
主要的點就是:
3. canal 的設計
3.1 canal的設計理念
canal的組件化設計非常好,有點類似于tomcat的設計。使用組合設計,依賴倒置,面向接口的設計。
3.2 canal的組件有哪些
??每個canal instance 有多個組件構成。在conf/spring/default-instance.xml中配置了這些組件。他其實是使用了spring的容器來進行這些組件管理的。
3.3 instance 包含的組件
這里是一個cannalInstance工作所包含的大組件。截取自 conf/spring/default-instance.xml
<bean id="instance" class="com.alibaba.otter.canal.instance.spring.CanalInstanceWithSpring"><property name="destination" value="${canal.instance.destination}" /><property name="eventParser"><ref local="eventParser" /></property><property name="eventSink"><ref local="eventSink" /></property><property name="eventStore"><ref local="eventStore" /></property><property name="metaManager"><ref local="metaManager" /></property><property name="alarmHandler"><ref local="alarmHandler" /></property></bean>3.4 各個組件目前支持的類型
canal采用了spring bean container的方式來組裝一個canal instance ,目的是為了能夠更加靈活。
1.1. MysqlEventParser 用于解析mysql的日志
1.2. GroupEventParser 多個eventParser的集合,理論上是對應了分表的情況,可以通過這個合并到一起
1.3. RdsLocalBinlogEventParser 基于rds的binlog 的復制
??canal通過這些組件的選取可以達到不同使用場景的效果,比如單機的話,一般使用file來存儲metadata就行了,HA的話一般使用zookeeper來存儲metadata。
4. canal的工作過程
4.1 啟動時去MySQL 進行dump操作的binlog 位置確定
??工作的過程。在啟動一個canal instance 的時候,首先啟動一個eventParser 線程來進行數據的dump 當他去master拉取binlog的時候需要binlog的位置,這個位置的確定是按照如下的順序來確定的(這個地方講述的是HA模式哈)。
??后面的eventParser的操作就會以內存中(MemoryLogPositionManager)存儲的binlog位置去master進行dump操作了。
mysql的show master status 操作
4.2 數據在dump回來之后進行的歸集(sink)和存儲(store)
sink操作是可以支撐將多個eventParser的數據進行過濾filter
filter使用的是instance.properties中配置的filter,當然這個filter也可以由canal的client端在進行subscribe的時候進行設置。如果在client端進行了設置,那么服務端配置文件instance.properties的配置都會失效
sink 之后將過濾后的數據存儲到eventStore當中去。
??目前eventStore的實現只有一個MemoryEventStoreWithBuffer,也就是基于內存的ringbuffer,使用這個store有一個特點,這個ringbuffer是基于內存的,大小是有限制的(bufferSize = 16 * 1024 也就是16M),所以,當canal的客戶端消費比較慢的時候,ringbuffer中存滿了就會阻塞sink操作,那么正讀取mysql binlog的eventParser線程也會受阻。
??這種設計其實也是有道理的。 因為canal的操作是pull 模型,不是producer push的模型,所以他沒必要存儲太多數據,這樣就可以避免了數據存儲和持久化管理的一些問題。使數據管理的復雜度大大降低。
??上面這些整個是canal的parser 線程的工作流程,主要對應的就是將數據從mysql搞下來,做一些基本的歸集和過濾,然后存儲到內存中。
4.3 binlog的消費者
??canal從mysql訂閱了binlog以后主要還是想要給消費者使用。那么binlog是在什么時候被消費呢。這就是另一條主線了。就像咱們做一個toC的系統,管理系統是必須的,用戶使用的app或者web又是一套,eventParser 線程就像是管理系統,往里面錄入基礎數據。canal的client就像是app端一樣,是這些數據的消費方。
??binlog的主要消費者就是canal的client端。使用的協議是基于tcp的google.protobuf,當然tcp的模式是io多路復用,也就是nio。當我們的client發起請求之后,canal的server端就會從eventStore中將數據傳輸給客戶端。根據客戶端的ack機制,將binlog的元數據信息定期同步到zookeeper當中。
差不多主要的操作就是這些吧。
5. canal的目錄結構(不包含lib目錄)
配置父目錄:
在下面可以看到,
這里是全部展開的目錄
canal ├── bin │ ├── canal.pid │ ├── startup.bat │ ├── startup.sh │ └── stop.sh └── conf├── canal.properties├── game_center│ └── instance.properties├── ww_social│ ├── h2.mv.db│ ├── h2.trace.db│ └── instance.properties├── wwother│ ├── h2.mv.db│ └── instance.properties├── nihao│ ├── h2.mv.db│ ├── h2.trace.db│ └── instance.properties├── movie│ ├── h2.mv.db│ └── instance.properties├── logback.xml├── spring│ ├── default-instance.xml│ ├── file-instance.xml│ ├── group-instance.xml│ ├── local-instance.xml│ ├── memory-instance.xml│ └── tsdb│ ├── h2-tsdb.xml│ ├── mysql-tsdb.xml│ ├── sql│ └── sql-map└── ym└── instance.properties總結
以上是生活随笔為你收集整理的canal原理的一些学习-1(canal的一些原理性介绍)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode-剑指 Offer 44
- 下一篇: canal原理的一些学习-2(HA 模式