binlog是mysql的一種二進制日誌文件,用來記錄數據的變化。mysql使用binlog進行主從複製,如圖:mysql
這裏有幾點須要注意:sql
上面介紹了mysql中應用binlog的場景,而咱們的業務能夠假裝成master的slave節點,感知數據的變化,這就給了咱們不少的業務運用空間。數據庫
常常有這樣一個場景:緩存
原來業務是一個很單一的系統,因此表也在一塊兒。隨着業務的發展,系統開始拆分,總有一些表是各個業務都關注的表,可是對相關的字段的運用場景不一樣,因此這樣一份元數據怎樣更好的爲各個系統服務就成了問題。固然,多寫或者讀寫分離能夠從物理節點上減小對數據服務器的壓力,可是對業務並無作到足夠的支持,由於這些表都是同樣的。所以咱們能夠經過binlog進行數據異構。服務器
如圖所示,訂單系統生成訂單後,經過binlog能夠解析生成用戶維度的訂單信息供用戶中心查詢、商戶維度訂單表供運營管理,以及搜索系統的搜索數據,提供全文搜索功能。併發
這樣,咱們就經過原始的訂單數據異構到三個系統中,提供了豐富的數據訪問功能。不只從節點上下降了數據服務器的壓力,數據表現形式也更貼近本身的服務,減小沒必要要的字段冗餘。高併發
對於高併發的系統,數據庫每每是系統性能的瓶頸,畢竟IO響應速度是遠遠小於電子的運算速度的。所以,不少查詢類服務都會在CPU與數據庫之間加上一層緩存。即現從緩存獲取,命中後直接返回,不然從DB中獲取並存入緩存後返回。而若是原始數據變化了但緩存還沒有超時,則緩存中的數據就是過期的數據了。當數據有變動的時候主動修改緩存數據。性能
當客戶端更改了數據以後,中間件系統經過binlog得到數據變動,並同步到緩存中。這樣就保證了緩存中數據有效性,減小了對數據庫的調用,從而提升總體性能。日誌
有這樣一個場景:中間件
不少系統依賴同一塊重要數據,當這些數據發生變化的時候,須要調用其餘相關係統的通知接口同步數據變化,或者mq消息告知變化並等待其主動同步。這兩種狀況都對原始系統形成了侵入,原始系統改一塊數據,並不想作這麼多其餘的事情。因此這時候能夠經過binlog進行任務分發。
當原始業務系統修改數據後,不須要進行其餘的業務關聯。由調度系統讀取binlog進行相應的任務分發、消息發送以及同步其餘業務狀態。這樣能夠將其餘業務與原始業務系統解耦,並從數據的角度將全部管理功能放在了同一個調度系統中,責任清晰。
binlog是mysql提供的數據同步機制,很好的解決了主從分離、讀寫庫分離等業務。而咱們能夠構建一箇中間件系統,「僞造」成master的一個slave。當讀取了binlog中的數據變化後,根據相應的業務場景作各類業務處理。而目前我接觸到的最多見的就是第一個場景——數據異構,能夠異構到其餘表中,也能夠異構到其餘數據引擎中,好比Elastic Search。