大家都知道,MySQL主從複製時使用的binlog日誌,它記錄了所有的DDL和DML語句(除了數據查詢語句select、show等),以事件形式記錄,還包含語句所執行的消耗時間。
MySQL主從複製有以下幾個步驟:
- master(主庫)在每次準備提交事務完成數據更新前,將改變記錄到二進制日誌(binary log)中;
- slave(從庫)發起連接,連接到master,請求獲取指定位置的binlog文件;
- master創建dump線程,推送binlog的slave;
- slave啓動一個I/O線程來讀取主庫上binary log中的事件,並記錄到slave自己的中繼日誌(relay log)中;
- slave還會起動一個SQL線程,該線程從relay log中讀取事件並在備庫執行,完成數據同步;
- slave記錄自己的binlog。
通過上述步驟完成主從同步,需要將binlog推送到從庫,然後再讀取到relay log,從庫在啓動SQL進行進行sql語句的執行,時間太漫長;有沒有什麼方法可以減少這種同步時間,或者如果redis、hive想從MySQL主庫同步數據,該如何加快同步速度?
binlog記錄了Mysql數據的實時變化,是數據同步的基礎,服務需要做的就是遵守Mysql的協議,將自己僞裝成Mysql的slave來監聽業務主庫binlog,完成數據實時同步。
問:僞裝成Mysql的slave來監聽業務主庫binlog,完成數據實時同步,有啥好處?
答:可實時更新緩存
業務查詢類服務往往會在mysql之上架設一個緩存,減少對底層數據庫的訪問;當mysql庫數據變化時,如果緩存還沒有過期那麼就會拿到過期的數據,業務期望能夠實時更新緩存。
利用binlog服務,根據策略實時將數據同步到redis中,這樣就能夠保證了緩存中數據有效性,減少了對數據庫的調用,從而提高整體性能。