CanalInstance設(shè)計理念與定制開發(fā)思路是什么

這篇文章將為大家詳細(xì)講解有關(guān)Canal Instance 設(shè)計理念與定制開發(fā)思路是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的裕安網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

Instance 是 Canal 數(shù)據(jù)同步的核心,在一個 Canal 實(shí)例中只有啟動 Instace,才能實(shí)現(xiàn)數(shù)據(jù)的同步,那 Instance 到底是“何許人也”,以源碼為手段,試圖揭開 Instance 的神秘面紗。

 

1、Canal Instance 類繼承體系


Canal Instance 設(shè)計理念與定制開發(fā)思路是什么  
重要的類說明如下:  
  • CanalInstanceCanal Instance 接口,即定義 Instance 的基本特征,主要定義如下方法:

    • String getDestination()
      實(shí)例的目的地名稱,在 Canal 中表示一個源實(shí)例名稱,對應(yīng)一個 MySQL 實(shí)例信息,例如 192.168.1.3:3306,這里為該實(shí)例取一個名稱。

    • CanalEventParser getEventParser()
      事件解析器,即 Binlog 解析器,負(fù)責(zé)解析 binlog 日志。

    • CanalEventSink getEventSink()
      EventParse 與 EventStore 的連接器,主要處理數(shù)據(jù)的過濾、加工與分發(fā),即提供了對 binlog 原始數(shù)據(jù)進(jìn)行“加工”的切入點(diǎn),EventStore 存儲的就是經(jīng) EventSink處理過的數(shù)據(jù)。

    • CanalEventStore getEventStore()
      事件存儲器,即 Canal Instance 作為 MySQL 的 "Slave" 服務(wù)器,需要將同步過來的數(shù)據(jù)進(jìn)行存儲,然后被 Canal 的客戶端最終會從 EventStore 中獲取數(shù)據(jù),目前 Canal 只實(shí)現(xiàn)了基于內(nèi)存的 EventStore,那 Canal 是如何避免內(nèi)存泄露,并且如何避免數(shù)據(jù)丟失的,這將是后續(xù)我們需要研究的重點(diǎn)。

    • CanalMetaManager getMetaManager()
      Canal 元數(shù)據(jù)管理器,例如記錄 消費(fèi)端消費(fèi)進(jìn)度,即從 Canal EventStore 中處理數(shù)據(jù)的情況。

    • CanalAlarmHandler getAlarmHandler()
      告警服務(wù)。

  • AbstractCanalInstance
    CanalInstance的抽象實(shí)現(xiàn)類。

  • CanalInstanceWithManager
    基于手動編程式的 CanaInstance,主要通過API的方式手動生成 CanalInstance 實(shí)例??梢灶惐?Spring 基于編程API 的事務(wù)管理器。

  • CanalInstanceWithSpring
    基于 Spring 方式構(gòu)建 CanaInstance。

  • CanalInstanceGenerator
    Canal Instance 的構(gòu)造類體系,即通過該類提供的方法創(chuàng)建 CanalInstance 實(shí)例,提供基于 Spring、手動管理等方式。

 

2、CanalInstance 四大核心組件


從類層次了解 Canal Instance 顯得不那么直觀,接下來先拋出一個使用場景,再結(jié)合架構(gòu)圖進(jìn)一步加深對 Canal Instance 的理解。

例如某公司的訂單系統(tǒng)使用了分庫分表,數(shù)據(jù)庫的分別部署在 192.168.1.166:3306,192.168.1.168:3306 兩個數(shù)據(jù)庫,并且每一個數(shù)據(jù)庫上會創(chuàng)建多個 schema,例如 order_db、user_db,那現(xiàn)在為了對訂單提供多維度的查詢,統(tǒng)計等功能,架構(gòu)組因此提出通過訂閱數(shù)據(jù)庫 binlog 日志,將兩個訂單庫中的訂單數(shù)據(jù),即將 order_db 中的數(shù)據(jù)同步到 elasticsearch,而 Canal 的設(shè)計初衷就是為了解決上述問題,故我們可以邊思考這個場景,來反推一下 Canal Instance 的設(shè)計理念。

Canal Instance 的架構(gòu)圖如下圖所示:

Canal Instance 設(shè)計理念與定制開發(fā)思路是什么  
Canal 中數(shù)據(jù)的同步是由 CanalInstance 組件負(fù)責(zé),一個 Canal Server 實(shí)例中可以創(chuàng)建多個 CanalInstance 實(shí)例。
 

每一個 CanalInstance 可以看成是對應(yīng)一個 MySQL 實(shí)例,即案例中需要同步兩個數(shù)據(jù)庫實(shí)例,故最終需要創(chuàng)建兩個 CanalInstance。其實(shí)也不難理解,因?yàn)?MySQL 的 binlog 就是以實(shí)例為維度進(jìn)行存儲的。Canal Instance 包含了 4個 核心組件 :EventParse、EventSink、EventStore、CanaMetaManager,在這里主要是闡明其作用,后續(xù)文章會一一詳細(xì)介紹,以便更好的指導(dǎo)實(shí)踐。

  • EventParse 組件
    負(fù)責(zé)解析 binlog日志,其職責(zé)就是根據(jù) binlog 的存儲格式將有效數(shù)據(jù)提取出來,這個不難理解,我們也可以通過該模塊,進(jìn)一步了解一下 binglog 的存儲格式。

  • EventSink 組件
    結(jié)合數(shù)據(jù)同步案例,在一個數(shù)據(jù)庫實(shí)例上通常會創(chuàng)建多個 Schema,但通常并不是所有的 schema 都需要被同步,如果直接將 EventParse 解析出來的數(shù)據(jù)全部傳入EventStore 組件,將對 EventStore 帶來不必要的性能消耗;另外本例中使用了分庫分表,需要將多個庫的數(shù)據(jù)同步到單一源,可能需要涉及到合并、歸并等策略。以上等等等需求就是 EventSink 需要解決的問題域。

  • EventStore 組件
    用來存儲經(jīng) canal 轉(zhuǎn)換的數(shù)據(jù),被 Canal Client 進(jìn)行消費(fèi)的數(shù)據(jù),目前 Canal 只提供了基于內(nèi)存的存儲實(shí)現(xiàn)。大家不妨先思考一下,采用基于內(nèi)存的存儲模式,如何避免內(nèi)存溢出,其具體實(shí)現(xiàn)將在后續(xù)文章中詳細(xì)剖析。

  • CanalMetaManager 組件
    元數(shù)據(jù)存儲管理器。在 Canal 中最基本的元數(shù)據(jù)至少應(yīng)該包含 EventParse 組件解析的位點(diǎn)與消費(fèi)端的消費(fèi)位點(diǎn)。Canal Server 重啟后要能從上一次未同步位置開始同步,否則會丟失數(shù)據(jù)。在將數(shù)據(jù)庫數(shù)據(jù)同步到 es 的示例中,所謂的 canal 客戶端就是從 Canal Server 即 EventStore 中獲取數(shù)據(jù),并將數(shù)據(jù)寫入 es 中,并上報寫入進(jìn)度,這些信息都是由 CanalMetaManager 組件完成。

從最新的版本來看,Canal 支持直接將解析后的數(shù)據(jù)發(fā)送到MQ,故 CanalInstance 中還持有另外一個組件:CanalMQConfig,關(guān)于 MQ 的一些配置,提供了多種策略實(shí)現(xiàn) shcema、table 到 MQ Topic 的自動映射管理,為 Canal 的使用者帶來更多便利,這部分內(nèi)容會在后續(xù)文章中單獨(dú)介紹,這里先暫時不過多討論。

經(jīng)過上面的了解,我想大家對 Canal Instance 有了一個相對全面的了解了吧,接下來我們再來關(guān)注一下 CanalInstance 的構(gòu)造方式,這個對后續(xù)的實(shí)踐有著非常重要的影響。

 

3、CanalInstance 構(gòu)造方式


Canal 中提供了兩種方式對 Instance 進(jìn)行初始化:Spring 與 手動編程方式。CanalInstance 最最核心的就是上述提到的4個組件,即 CanalInstanceWithManager 類的具體職責(zé)就是管理上述核心組件,即提供對上述組件的加載、啟動、停止,并協(xié)調(diào),從其名字就能看出來,從其構(gòu)造函數(shù)同樣能得知:

Canal Instance 設(shè)計理念與定制開發(fā)思路是什么  
編程方式創(chuàng)建 Canal Instance 比較簡單,只需設(shè)置參數(shù),并創(chuàng)建 CanalInstanceWithManger 方法即可,正如示例代碼中使用的那樣。  
Canal Instance 設(shè)計理念與定制開發(fā)思路是什么  
另外 Canal 提供了對 Spring 的整合,將 canal Instance 的相關(guān)核心組件納入 Spring 的管理,其實(shí)現(xiàn)類為: CanalInstanceWithSpring,對應(yīng)的 Spring 配置示例如下圖所示:  

Canal Instance 設(shè)計理念與定制開發(fā)思路是什么

溫馨提示:基于 Canal 二次開發(fā)的編程技巧思考如下:Canal 框架本身將 Canal Server 做成了啟動腳本,可以通過自定義 Instance,即從 instance 配置文件中加載配置,然后啟動 Canal Server 解析 Binlog 日志,最終按照預(yù)定的配置進(jìn)行工作,例如在生產(chǎn)環(huán)境搭建一些 Canal 集群,統(tǒng)一交由運(yùn)維去手動維護(hù),如果需要數(shù)據(jù)同步,則配置相應(yīng)的 instance 文件,然后進(jìn)行啟動就生效,其實(shí)這種模式處于 Canal 的初階階段,更好的方式是對 Canal 進(jìn)行二次開發(fā),通過可視化的界面,通過界面的方式定義數(shù)據(jù)同步任務(wù),例如將指定數(shù)據(jù)庫實(shí)例上的指定 Schema 的 binglog 日志同步到指定消息集群的指定 topic,并且可重推、隨時停止,重啟,這樣 Canal 的維護(hù)者無需關(guān)注底層的細(xì)節(jié),只需要通過頁面簡單配置一下即可。

源碼 Canal 系列的第一篇文章后有好幾個粉絲表示目前也在研究 Canal,由于筆者目前只能盡量保持周更,如果大家希望加快研究 Canal 的步伐,筆者有如下建議:

1、深入研究其四大核心組件,并帶著問題去研究,例如在學(xué)習(xí)元數(shù)據(jù)管理時是如何保證數(shù)據(jù)不丟失,重啟后又是如何定位位點(diǎn)的。

2、如果大家想更全局的去研究 Canal,我覺得除了閱讀 Canal 官方的設(shè)計手冊,還可以專門去看一下 CanalParameter 這個類,Canal 支持的所有配置屬性,并且都有相應(yīng)的注釋,關(guān)于 Canal 的所有一切,都可以從這里窺探出端倪,然后可以選擇感興趣的內(nèi)容加以繼續(xù)深入學(xué)習(xí)。

關(guān)于Canal Instance 設(shè)計理念與定制開發(fā)思路是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

文章標(biāo)題:CanalInstance設(shè)計理念與定制開發(fā)思路是什么
鏈接URL:http://muchs.cn/article22/gedhjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計小程序開發(fā)、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計公司、靜態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營