數據同步工具otter(一)談談binlog和canal


之前因為懶,沒有針對otter做更多的解釋和說明,在使用過程中,也發現了一些問題,此次補上一個完整的文檔,方便大家使用。

Otter是基於cannal開源的,canal又是基於mysql binlog的產品。我們就從binlog說起

binlog

mysql的binlog日志是被設計用來作主從備份或者數據恢復用的。binlog是The Binary Log的簡稱,意思就是二進制的日志文件(可以點擊https://dev.mysql.com/doc/refman/5.6/en/binary-log.html了解)。binlog中以二進制的形式記錄了數據庫的”events(事件)”即數據庫結構及表數據發生的變化。以下這張圖就反應了主從庫之間使用binlog進行同步的過程:

mysql提供了三種不同的binlog記錄形式:

  1. STATEMENT 語句模式(默認):日志中記錄了所有的執行的sql語句,從庫在執行的時候,重新執行相應sql即可。但是因為不記錄語句執行的上下文,在從庫執行某些語句(比如存儲過程)的時候,有些語句不一定能成功執行導致丟失數據
  2. ROW 行模式:日志中記錄每一行每個字段的變化,能清楚記錄每行數據的變化歷史,主從丟失數據的情況大大降低,但是缺點是會產生大量的binlog占用存儲空間
  3. MIX 混合模式:在 Mixed 模式下,MySQL 會根據執行的每一條具體的 SQL 語句來區分對待記錄的日志形式,也就是在 statement 和 row 之間選擇一種。比如遇到表結構變更的時候就會以 statement 模式來記錄,如果 SQL 語句確實就是 update 或者 delete 等修改數據的語句,那么還是會記錄所有行的變更。目前這種模式其實就是由mysql來選擇到底用哪種模式記錄,可以點此了解https://dev.mysql.com/doc/refman/5.6/en/binary-log-mixed.html

你可以通過以下命令查看自己的mysql的binlog情況:

//查看自己的mysql是否打開了binlog選項
show variables like 'log_bin' //查看binlog的格式 show variables like 'binlog_format' //獲取binlog列表 show binary logs //或者 show master logs //查看正在寫入的binlog show master status
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

上文中說過binlog中是以event的形式記錄日志的,所以你可以通過事件命令查看具體的日志內容及位置

SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
  • 1
  • 2
  • 3
  • 4

比如:SHOW BINLOG EVENTS LIMIT 1

  • Log_name:日志文件名
  • Pos:事件起始位置
  • Event_type:事件類型
  • End_log_pos結束位置

mysqlbinlog工具

如果binlog的格式是STATEMENT,以上show binlog event的方式是可以看到sql語句的,但是如果row模式的話,沒法看到,只能通過mysqlbinlog工具進行查看,mysqlbinlog也是mysql dba常用的備份恢復數據的工具。

該工具需要登錄到數據庫主機使用

mysqlbinlog [options] log_file 
  • 1

具體的選項參考:https://dev.mysql.com/doc/refman/8.0/en/mysqlbinlog.html

如果你沒有數據庫主機的登錄權限,可以選擇使用遠程導出的方式將遠端的binlog導出。

# mysqlbinlog -u用戶名 -p密碼 -h主機地址 -P端口號 --read-from-remote-server mysql-bin.000001 --base64-output=decode-rows -v > 1.txt
  • 1

返回數據如下,黑色背景部分為一個事件的完整日志,紅框標記則為執行的SQL

Canal

canal(https://github.com/alibaba/canal)是阿里出品基於binlog的一款訂閱消費組件,簡單來說也就是它可以訂閱mysql的binlog,並進行讀取消費,以達到數據同步等目的。相較於傳統的觸發器同步數據模式,基於binlog的數據同步方式無疑靈活性、功能性更強。

原理如下:

  1. canal模擬mysql slave的交互協議,偽裝自己為mysql slave,向mysql master發送dump協議
  2. mysql master收到dump請求,開始推送binary log給slave(也就是canal)
  3. canal解析binary log對象(原始為byte流)
canal服務端:

這張圖表示了canal服務端的模塊划分

  • server代表一個canal運行實例,對應於一個jvm
  • instance對應於一個數據隊列(也就是一個數據庫的binlog訂閱者) (1個server對應1..n個instance)

instance下的子模塊:

  • eventParser (數據源接入,模擬slave協議和master進行交互,協議解析)
  • eventSink (Parser和Store鏈接器,進行數據過濾,加工,分發的工作)
  • eventStore (數據存儲)
  • metaManager (增量訂閱&消費信息管理器)

canal客戶端:

canal客戶端可以向服務器端進行消息訂閱消費,服務器端的解析后的數據存在eventStore中,而客戶端的工作就是從eventStore中訂閱消費。

好了,我們已經對canal大概了解了,下一篇文檔我們進入我們的正題otter


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM