Binlog的三个业务应用场景
1.什么是binlog
binlog是mysql的一種二進(jìn)制日志文件,用來記錄數(shù)據(jù)的變化。mysql使用binlog進(jìn)行主從復(fù)制,如圖:
客戶端向master的mysql sever寫入數(shù)據(jù)
當(dāng)數(shù)據(jù)發(fā)生變化時,master將變更的數(shù)據(jù)記錄寫入到二進(jìn)制文件中,即binlog。
slave訂閱了master的binlog,所以會通過一個I/O THREAD與master的DUMP THREAD進(jìn)行通信,同步binlog
I/O THREAD讀取到binlog后會吸入到relay log中,準(zhǔn)備重放。
slave會通過SQL THREAD讀取relay log,重放數(shù)據(jù)的改動并執(zhí)行相應(yīng)的改動。
這里有幾點需要注意:
主從復(fù)制不是強一致性,只能保證最終一致
master配合binlog復(fù)制會影響性能,所以盡量不要在master上掛太多的slave,如果對時間要求不高,可以在slave上掛slave
2.binlog的業(yè)務(wù)應(yīng)用
上面介紹了mysql中應(yīng)用binlog的場景,而我們的業(yè)務(wù)可以偽裝成master的slave節(jié)點,感知數(shù)據(jù)的變化,這就給了我們很多的業(yè)務(wù)運用空間。
2.1 數(shù)據(jù)異構(gòu)
經(jīng)常有這樣一個場景:
原來業(yè)務(wù)是一個很單一的系統(tǒng),所以表也在一起。隨著業(yè)務(wù)的發(fā)展,系統(tǒng)開始拆分,總有一些表是各個業(yè)務(wù)都關(guān)注的表,但是對相關(guān)的字段的運用場景不同,所以這樣一份元數(shù)據(jù)怎樣更好的為各個系統(tǒng)服務(wù)就成了問題。當(dāng)然,多寫或者讀寫分離可以從物理節(jié)點上減少對數(shù)據(jù)服務(wù)器的壓力,但是對業(yè)務(wù)并沒有做到足夠的支持,因為這些表都是一樣的。因此我們可以通過binlog進(jìn)行數(shù)據(jù)異構(gòu)。
如圖所示,訂單系統(tǒng)生成訂單后,通過binlog可以解析生成用戶維度的訂單信息供用戶中心查詢、商戶維度訂單表供運營管理,以及搜索系統(tǒng)的搜索數(shù)據(jù),提供全文搜索功能。
這樣,我們就通過原始的訂單數(shù)據(jù)異構(gòu)到三個系統(tǒng)中,提供了豐富的數(shù)據(jù)訪問功能。不僅從節(jié)點上降低了數(shù)據(jù)服務(wù)器的壓力,數(shù)據(jù)表現(xiàn)形式也更貼近自己的服務(wù),減少不必要的字段冗余。
2.2 緩存數(shù)據(jù)的補充
對于高并發(fā)的系統(tǒng),數(shù)據(jù)庫往往是系統(tǒng)性能的瓶頸,畢竟IO響應(yīng)速度是遠(yuǎn)遠(yuǎn)小于電子的運算速度的。因此,很多查詢類服務(wù)都會在CPU與數(shù)據(jù)庫之間加上一層緩存。即現(xiàn)從緩存獲取,命中后直接返回,否則從DB中獲取并存入緩存后返回。而如果原始數(shù)據(jù)變化了但緩存尚未超時,則緩存中的數(shù)據(jù)就是過時的數(shù)據(jù)了。當(dāng)數(shù)據(jù)有變更的時候主動修改緩存數(shù)據(jù)。
當(dāng)客戶端更改了數(shù)據(jù)之后,中間件系統(tǒng)通過binlog獲得數(shù)據(jù)變更,并同步到緩存中。這樣就保證了緩存中數(shù)據(jù)有效性,減少了對數(shù)據(jù)庫的調(diào)用,從而提高整體性能。
2.3 基于數(shù)據(jù)的任務(wù)分發(fā)
有這樣一個場景:
很多系統(tǒng)依賴同一塊重要數(shù)據(jù),當(dāng)這些數(shù)據(jù)發(fā)生變化的時候,需要調(diào)用其他相關(guān)系統(tǒng)的通知接口同步數(shù)據(jù)變化,或者mq消息告知變化并等待其主動同步。這兩種情況都對原始系統(tǒng)造成了侵入,原始系統(tǒng)改一塊數(shù)據(jù),并不想做這么多其他的事情。所以這時候可以通過binlog進(jìn)行任務(wù)分發(fā)。
當(dāng)原始業(yè)務(wù)系統(tǒng)修改數(shù)據(jù)后,不需要進(jìn)行其他的業(yè)務(wù)關(guān)聯(lián)。由調(diào)度系統(tǒng)讀取binlog進(jìn)行相應(yīng)的任務(wù)分發(fā)、消息發(fā)送以及同步其他業(yè)務(wù)狀態(tài)。這樣可以將其他業(yè)務(wù)與原始業(yè)務(wù)系統(tǒng)解耦,并從數(shù)據(jù)的角度將所有管理功能放在了同一個調(diào)度系統(tǒng)中,責(zé)任清晰。
3.總結(jié)
binlog是mysql提供的數(shù)據(jù)同步機制,很好的解決了主從分離、讀寫庫分離等業(yè)務(wù)。而我們可以構(gòu)建一個中間件系統(tǒng),“偽造”成master的一個slave。當(dāng)讀取了binlog中的數(shù)據(jù)變化后,根據(jù)相應(yīng)的業(yè)務(wù)場景做各種業(yè)務(wù)處理。而目前我接觸到的最常見的就是第一個場景——數(shù)據(jù)異構(gòu),可以異構(gòu)到其他表中,也可以異構(gòu)到其他數(shù)據(jù)引擎中,比如Elastic Search。
總結(jié)
以上是生活随笔為你收集整理的Binlog的三个业务应用场景的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eclipse里调试时遇到Source
- 下一篇: Angular应用里HTTP请求的错误处