binlog是記錄所有資料庫表結構變更(例如CREATE、ALTER TABLE…)以及表資料修改(INSERT、
UPDATE、DELETE…)的二進位制紀錄檔。實際落庫產生的紀錄檔(事務提交後)。
我們先看一下Mysql資料更新的流程:
• 通過如上所述,我們知道binlog是mysql的已提交紀錄檔,是實際落庫的,那麼如果可以監聽到binlog那麼我們可以用來處理DB主從同步,跨庫同步,資料備份,同步ES,快取重新整理等等
SHOW GLOBAL VARIABLES LIKE ‘log_bin%’; 結果返回不等於ON時代表關閉
可以通過my.ini組態檔(linux中為my.cnf) log-bin=mysql-bin //指定binlog紀錄檔檔案的名稱,可以根據實際需求進行命名。 binlog-format=ROW //設定binlog的格式,下面會解釋這三種格式。
SHOW GLOBAL VARIABLES like ' binlog_format%’;
mysql binlog 分為三種模式(STATEMENT,ROW,MIXED)
SET GLOBAL binlog_format = 'ROW’;
SET GLOBAL binlog_row_metadata = ‘FULL’;//8.0版本以下不需要設定
現在準備工作完成,可以開始寫程式碼訂閱master節點去獲取binlog資訊了,再次之前我們先了解下 binlog的儲存原理
mysql 將資料庫更新操作對應的event記錄到原生的binlog檔案中,顯然在一個檔案中記錄所有的 event是不可能的,過大的檔案會給我們的運維帶來麻煩,如刪除一個大檔案,在I/O排程方面會給我們帶來不可忽視的資源開銷。
因此,目前基本上所有支援本地檔案儲存的元件,如MQ、Mysql等,都會控制一個檔案的大小。在資料量較多的情況下,就分配到多個檔案進行儲存。
show binlog events;
得到binlog的log_name(檔名)和大小以及pos(偏移量位置)
這兩個會在後面傳送dump到master節點去訂閱的時候用到,代表從binlog的哪處位置開始訂閱,master 就會在EventStream中傳送此檔案節點之後的所有資料庫變更資訊
所謂binlog管理事件,官方稱之為binlog managent events,你可以認為是一些在任何模式下都有可能會出現的事件,不管你的設定binlog_format是Row、Statement還是Mixed。
每個binlog檔案總是以Format Description Event作為開始,以Rotate Event結束作為結束。如果你使用的是很古老的Mysql版本中,開始事件也有可能是START EVENT V3,而結束事件是Stop Event。在開始和結束之間,穿插著其他各種事件。
在Event_Type列中,我們看到了三個事件型別:
同學應該知道,這是表示之前的binlog檔案中,已經執行過的GTID。需要我們開啟GTID選項,這個事件才會有值,在後文中,將會詳細的進行介紹。
serverId代表此slave節點的id(不要跟master節點重複),訂閱binlog需要模擬一個slave(從節點)去向master節點傳送dump,後續就會接收的訂閱返回的事件流資訊 filename和position前面提到過的檔名和偏移量
每個binlog事件都以一個事件頭(event header)開始,然後是一個binlog事件型別特定的資料部分,稱為事件體(event body)。
具體的原始碼可以通過以下連結去下載:
https://github.com/kogel-net/Kogel.Subscribe
這個輪子是在前兩年時候寫的,那時候想利用mysql的cdc解決快取重新整理的問題,但是找了一圈發現只有 java開源的輪子例如canal,flinkcdc等,c#社群好像並無此類似輪子就想寫一個,完善下c#/.net社群,希望以後.net發展能夠越來越好吧。