MySQL binlog 三個(gè)典型的業(yè)務(wù)應(yīng)用場(chǎng)景
程序員的成長(zhǎng)之路互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享 關(guān)注
閱讀本文大概需要 2.8 分鐘。
來(lái)自: cnblogs.com/kingszelda/p/8362612.html
什么是binlog
binlog是MySQL的一種二進(jìn)制日志文件,用來(lái)記錄數(shù)據(jù)的變化。MySQL使用binlog進(jìn)行主從復(fù)制,如圖:
-
客戶(hù)端向master的mysql sever寫(xiě)入數(shù)據(jù)
-
當(dāng)數(shù)據(jù)發(fā)生變化時(shí),master將變更的數(shù)據(jù)記錄寫(xiě)入到二進(jìn)制文件中,即binlog。
-
slave訂閱了master的binlog,所以會(huì)通過(guò)一個(gè)I/O THREAD與master的DUMP THREAD進(jìn)行通信,同步binlog
-
I/O THREAD讀取到binlog后會(huì)吸入到relay log中,準(zhǔn)備重放。
-
slave會(huì)通過(guò)SQL THREAD讀取relay log,重放數(shù)據(jù)的改動(dòng)并執(zhí)行相應(yīng)的改動(dòng)。
-
主從復(fù)制不是強(qiáng)一致性,只能保證最終一致
-
master配合binlog復(fù)制會(huì)影響性能,所以盡量不要在master上掛太多的slave,如果對(duì)時(shí)間要求不高,可以在slave上掛slave
2. binlog的業(yè)務(wù)應(yīng)用
上面介紹了mysql中應(yīng)用binlog的場(chǎng)景,而我們的業(yè)務(wù)可以偽裝成master的slave節(jié)點(diǎn),感知數(shù)據(jù)的變化,這就給了我們很多的業(yè)務(wù)運(yùn)用空間。2.1 數(shù)據(jù)異構(gòu)
經(jīng)常有這樣一個(gè)場(chǎng)景:原來(lái)業(yè)務(wù)是一個(gè)很單一的系統(tǒng),所以表也在一起。隨著業(yè)務(wù)的發(fā)展,系統(tǒng)開(kāi)始拆分,總有一些表是各個(gè)業(yè)務(wù)都關(guān)注的表,但是對(duì)相關(guān)的字段的運(yùn)用場(chǎng)景不同,所以這樣一份元數(shù)據(jù)怎樣更好的為各個(gè)系統(tǒng)服務(wù)就成了問(wèn)題。當(dāng)然,多寫(xiě)或者讀寫(xiě)分離可以從物理節(jié)點(diǎn)上減少對(duì)數(shù)據(jù)服務(wù)器的壓力,但是對(duì)業(yè)務(wù)并沒(méi)有做到足夠的支持,因?yàn)檫@些表都是一樣的。因此我們可以通過(guò)binlog進(jìn)行數(shù)據(jù)異構(gòu)。
如圖所示,訂單系統(tǒng)生成訂單后,通過(guò)binlog可以解析生成用戶(hù)維度的訂單信息供用戶(hù)中心查詢(xún)、商戶(hù)維度訂單表供運(yùn)營(yíng)管理,以及搜索系統(tǒng)的搜索數(shù)據(jù),提供全文搜索功能。這樣,我們就通過(guò)原始的訂單數(shù)據(jù)異構(gòu)到三個(gè)系統(tǒng)中,提供了豐富的數(shù)據(jù)訪(fǎng)問(wèn)功能。不僅從節(jié)點(diǎn)上降低了數(shù)據(jù)服務(wù)器的壓力,數(shù)據(jù)表現(xiàn)形式也更貼近自己的服務(wù),減少不必要的字段冗余。
2.2 緩存數(shù)據(jù)的補(bǔ)充
對(duì)于高并發(fā)的系統(tǒng),數(shù)據(jù)庫(kù)往往是系統(tǒng)性能的瓶頸,畢竟IO響應(yīng)速度是遠(yuǎn)遠(yuǎn)小于電子的運(yùn)算速度的。因此,很多查詢(xún)類(lèi)服務(wù)都會(huì)在CPU與數(shù)據(jù)庫(kù)之間加上一層緩存。即現(xiàn)從緩存獲取,命中后直接返回,否則從DB中獲取并存入緩存后返回。而如果原始數(shù)據(jù)變化了但緩存尚未超時(shí),則緩存中的數(shù)據(jù)就是過(guò)時(shí)的數(shù)據(jù)了。當(dāng)數(shù)據(jù)有變更的時(shí)候主動(dòng)修改緩存數(shù)據(jù)。
當(dāng)客戶(hù)端更改了數(shù)據(jù)之后,中間件系統(tǒng)通過(guò)binlog獲得數(shù)據(jù)變更,并同步到緩存中。這樣就保證了緩存中數(shù)據(jù)有效性,減少了對(duì)數(shù)據(jù)庫(kù)的調(diào)用,從而提高整體性能。
2.3 基于數(shù)據(jù)的任務(wù)分發(fā)
有這樣一個(gè)場(chǎng)景:很多系統(tǒng)依賴(lài)同一塊重要數(shù)據(jù),當(dāng)這些數(shù)據(jù)發(fā)生變化的時(shí)候,需要調(diào)用其他相關(guān)系統(tǒng)的通知接口同步數(shù)據(jù)變化,或者mq消息告知變化并等待其主動(dòng)同步。這兩種情況都對(duì)原始系統(tǒng)造成了侵入,原始系統(tǒng)改一塊數(shù)據(jù),并不想做這么多其他的事情。所以這時(shí)候可以通過(guò)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ù)的角度將所有管理功能放在了同一個(gè)調(diào)度系統(tǒng)中,責(zé)任清晰。
3. 總結(jié)
binlog是mysql提供的數(shù)據(jù)同步機(jī)制,很好的解決了主從分離、讀寫(xiě)庫(kù)分離等業(yè)務(wù)。而我們可以構(gòu)建一個(gè)中間件系統(tǒng),“偽造”成master的一個(gè)slave。當(dāng)讀取了binlog中的數(shù)據(jù)變化后,根據(jù)相應(yīng)的業(yè)務(wù)場(chǎng)景做各種業(yè)務(wù)處理。而目前我接觸到的最常見(jiàn)的就是第一個(gè)場(chǎng)景——數(shù)據(jù)異構(gòu),可以異構(gòu)到其他表中,也可以異構(gòu)到其他數(shù)據(jù)引擎中,比如Elastic Search。<END> 推薦閱讀:
答應(yīng)我, 不要再用 if (obj != null) 判空了
月增千萬(wàn)的數(shù)據(jù),我用單體+單庫(kù)扛下了所有
互聯(lián)網(wǎng)初中高級(jí)大廠面試題(9個(gè)G)
內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬(wàn)并發(fā)、消息隊(duì)列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!
?戳閱讀原文領(lǐng)取! 朕已閱 ![]()
