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