1. 程式人生 > >【架構設計之道】這一波優雅的操作,會把你的中介軟體系統架構帶到另一個Level

【架構設計之道】這一波優雅的操作,會把你的中介軟體系統架構帶到另一個Level

今年企業對Java開發的市場需求,你看懂了嗎? >>>   

目錄

1、Master-Slave架構

2、非同步日誌持久化機制

3、檢查點機制:定時持久化全量資料

4、引入檢查點節點

5、總結 & 思考

這篇文章,給大家來聊一個生產級的中介軟體系統的架構設計實踐,希望給對中介軟體系統感興趣的同學一點啟發。

(1)Master-Slave架構

這個中介軟體系統的本質是希望能夠用分散式的方式來處理一些資料,但是具體的作用涉及到核心技術,所以這裡不能直接說明。

但是他的核心思想,就是把資料分發到很多臺機器上來處理,然後需要有一臺機器來控制N多臺機器的分散式處理,大概如下圖所示。

那麼既然是分散式的處理,就肯定涉及到在Master中要維護這個叢集的一些核心元資料。

比如說資料的分發處理是如何排程的,處理的具體過程現在什麼進度了,還有就是對叢集裡存放資料進行描述的一些核心元資料。

這些核心元資料肯定會不斷的頻繁的修改,大家此時可以想,無論你是基於外部的檔案還是資料庫,或者是zookeeper來存放這些元資料的話,其實都會導致他的元資料更新效能降低,因為要訪問外部依賴。

何況這種複雜的元資料其實還不一定能通過zk或者資料庫來存放,因為他可能是非格式化的。

所以這裡一個核心的設計,就是將核心元資料直接存放在Master的記憶體裡,這樣可以保證高併發更新元資料的時候,他的效能是極高的,而且直接基於記憶體來提供對外的更新服務。

如果Master部署在高配置物理機上,比如32核128GB的那種,每秒支援10萬+的請求都沒問題。

(2)非同步日誌持久化機制

但是這裡有一個問題,假如說Master程序重啟,或者是突然宕機了,那麼記憶體裡的資料不就丟失了麼?

對,所以針對這個問題,既然已經否決掉了基於外部儲存來寫入元資料,那麼這裡就可以採取非同步持久化日誌的機制,來通過非同步化的方式把元資料的更新日誌寫入磁碟檔案。

每次Master收到一個請求,在記憶體裡更新元資料之後,就需要生成一條元資料的更新日誌,把這個更新日誌需要寫入到一個記憶體緩衝裡去。

然後等記憶體緩衝滿了之後,由一個後臺執行緒把這裡的資料重新整理到磁碟上去,如下圖。

肯定會有人說,那如果一條更新日誌剛寫入緩衝區,結果Master宕機了,此時不是還是會丟失少量資料嗎?因為還沒來得及刷入磁碟。

沒錯啊,這個為了保證高併發請求都是由記憶體來處理的,你必須得用非同步持久化磁碟的模式,所以必然要容忍極端宕機情況下,可能丟失比如幾秒鐘的資料。

那麼如果是正常的Master重啟呢?

那簡單,必須先把日誌緩衝區清空刷入磁碟,然後才能正常重啟Master,保證資料都在磁碟上不會丟失。

接著重啟的時候,從磁碟上讀取更新日誌,每一條都依次回訪到記憶體裡,恢復出來核心元資料即可。

(3)檢查點機制:定時持久化全量資料

但是這裡又有一個問題了,那個磁碟上的日誌檔案越來越大,因為元資料不斷的在更新,不斷在產生最新的變更日誌寫入磁碟檔案。

那麼系統執行一段時間以後,每次重啟都需要從磁碟讀取歷史全部日誌,一條一條回放到記憶體來恢復核心元資料嗎?

不可能,所以這裡一定要配合引入檢查點機制。

也就是說,每隔一段時間,就需要開啟一個後臺執行緒,把記憶體裡的全部核心元資料序列化後寫入磁碟上的元資料檔案,作為這個時間的一個快照檔案,同時清空掉日誌檔案,這個叫做檢查點操作。

下次重啟,只要把元資料檔案讀取出來直接反序列化後方入記憶體,然後把上次檢查點之後的變更日誌從日誌檔案裡讀出來回放到記憶體裡,就可以恢復出來完整的元資料了。

這種方式,可以讓Master重啟很快,因為大部分資料都是在檢查點寫入的那個元資料檔案裡。

整個過程,如下圖所示:

(4)引入檢查點節點

但是這個時候又有一個問題了。

大家可以想一下,Master記憶體裡的元資料需要高併發的被人訪問和修改,同時每隔一段時間還要檢查點寫入磁碟。

那麼在檢查點過程中,是不是需要把記憶體資料全部加鎖,不允許別人修改?

在加鎖的時候,把不會變動的資料寫入磁碟檔案中,但是這個過程是很慢的,意味著此時別人高併發的寫入操作都需要等待核心元資料的鎖。

因為此時別人鎖住了,你無法加鎖去寫資料進去,這會導致系統在幾秒內出現卡頓無法響應請求的問題。

所以此時需要在架構設計裡引入一個檢查點節點,專門負責同步Master的變更日誌。

然後在自己記憶體裡維護一份一模一樣的核心元資料,每隔一段時間由檢查點節點來負責將記憶體資料寫入磁碟,接著上傳發送給Master。

這樣做,就不需要Master自己執行檢查點的時候對自己記憶體資料進行加鎖了,如下圖。

在這樣的一個架構下,對Master來說,他只需要一個後臺執行緒負責接收Checkpoint程序定時傳送過來的元資料檔案快照然後寫入本地磁碟就可以了,完全規避掉了對自己記憶體元資料的鎖衝突的問題。

(5)總結 & 思考

總結一下這個架構設計,其實就是Master基於記憶體維護元資料,這樣一臺物理機可以支撐每秒10萬+的高併發請求。

每次元資料出現更新,寫一條日誌到記憶體緩衝區,然後後臺執行緒去重新整理日誌到日誌檔案裡去,同時需要傳送一條日誌到Checkpoint節點去。

Checkpoint節點會在自己記憶體裡維護一份一模一樣的元資料,然後每隔一段時間執行checkpoint檢查點寫一份元資料檔案快照。

接著上傳給Master節點後清空掉他的日誌檔案。然後Master節點每次重啟的時候直接讀取本地元資料檔案快照,加上回放上次checkpoint之後的日誌即可。

這裡可能大家會提幾個問題,比如說Master節點突然宕機會如何?

那很簡單,直接影響就是他記憶體緩衝裡的那些日誌丟了,導致少量資料丟失,這個在我們的場景下可以容忍。

如果Checkpoint節點宕機怎麼辦?

那不要緊,因為他之前上傳過元資料檔案的快照,所以對Master而言最多就是無法同步資料過去。

但是Master重啟,還是可以讀取最近一次的元資料快照,然後回放日誌即可。

等Checkpoint節點恢復了,可以繼續接著上一次同步日誌,然後繼續執行checkpoint操作。

【文章延續福利】

 

 

架構專題

由於圖片太大上傳會不清晰,需要完整架構體系大綱的可以加我私人技術討論群領取資料哦,我已經打包好的架構體系大綱,免費分享給大家哦!

點選連結加入群聊【網際網路java高階架構536172545】:https://jq.qq.com/?_wv=1027&k=5S5wh8D
針對大綱的技術知識點,我們也有Java高階學習的視訊資料分享,機會不多,先到先得!

相關推薦

架構設計優雅操作中介軟體系統架構帶到一個Level

今年企業對Java開發的市場需求,你看懂了嗎? >>>   

效能優化每秒上萬併發下的Spring Cloud引數優化實戰

歡迎關注個人微信公眾號:石杉的架構筆記(id:shishan100) 週一至週五早八點半!精品技術文章準時送上!!   往期文章 1. 拜託!面試請不要再問我Spring Cloud底層原理! 2.【雙11狂歡的背後】微服務註冊中心如何承載大型系統的千萬級

Spring Cloud---效能優化每秒上萬併發下的Spring Cloud引數優化實戰

本文來源:公眾號:石杉的架構筆記(ID:shishan100) 一、寫在前面 相信不少朋友都在自己公司使用Spring Cloud框架來構建微服務架構,畢竟現在這是非常火的一門技術。 如果只是使用者量很少的傳統IT系統,使用Spring Cloud可能還暴露不出什麼問題。

58沈劍 架構TCP接入層的負載均衡、高可用、擴充套件性架構

一、web-server的負載均衡 網際網路架構中,web-server接入一般使用nginx來做反向代理,實施負載均衡。整個架構分三層: 上游呼叫層,一般是browser或者APP 中間反向代理層,nginx 下游真實接入叢集,web-server,常見web-server的

效能優化每秒上萬併發下的Spring Cloud引數優化實戰!

【效能優化之道】每秒上萬併發下的Spring Cloud引數優化實戰! 中華石杉 Java後端技術 今天 本文來源:石杉的架構筆記(ID:shishan100) 往期文章: 拜託!面試請不要再問我Spring Cloud底層原理 【雙11狂

金融市場資料平臺的架構設計

作者|郝星宇編輯|小智近年來,一個名叫Fintech的名詞悄然興起。網際網路科技與傳統金融行業的結合越來越深入,作為投行交易系統定海神針的市場資料平臺,有著怎樣的技術背景?其架構設計又是怎樣的? 投行的Global Markets或Sales&Trading部門主

Elasticsearch 搜尋)什麼是 Elasticsearch?

本篇文章對 Elasticsearch 做了基本介紹,在後續將通過專欄的方式持續更新,本系列以 Elasticsearch7 作為主要的講解版本,歡迎各位大佬指正,共同學習進步! 一般涉及大型資料庫的電子商務和搜尋引擎的產品都面臨這樣一個問題,產品資訊檢索花費時間太長。這不良的使用者體驗,可能導致失去潛在

java基礎異常死了都要try不淋漓盡致地catch我不痛快!

@[toc] # 1、異常 ## 1.1 異常概念 **異常** :簡單說就是不正常執行,最終導致JVM的非正常停止。 在Java等面向物件的程式語言中,異常本身是一個類,產生異常就是建立異常物件並丟擲了一個異常物件。Java處理異常的方式是中斷處理。 > 異常指的並不是語法錯誤,語法錯了,編譯

操作如何破解抓包工具Charles!

一、前言 我們在進行應用開發過程中有時候可以需要進行抓包測試資料,比如模擬服務端的下發資料和我們客戶端的請求引數資料,特別是測試人員在進行測試的過程中都會進行抓包,當然我們在破解逆向的過程中也是需要用到抓包工具,因為我們抓到資料包可能就是我們破解的突破口,那麼我們可能常用的

設計容錯的資料庫連線池程式設計思路--架構優化JAVA核心

本專案的原始碼已經上傳,歡迎點選下載1、資料庫連線池的產生背景?資料庫在高併發情況下會面臨諸多問題——JDBC:管道的臨時建立——非常耗用資源,而且在高併發中,多個客戶端同時建立IO管道DB的承受能力如何考慮?執行SQL語句完畢後又要馬上銷燬——之後難道不要再用?最大連線管道

58沈劍 架構InnoDB併發如此高原因竟然在

一、併發控制 為啥要進行併發控制? 併發的任務對同一個臨界資源進行操作,如果不採取措施,可能導致不一致,故必須進行併發控制(Concurrency Control)。   技術上,通常如何進行併發控制? 通過併發控制保證資料一致性的常見手段有: 鎖(Locking) 資料

58沈劍 架構InnoDB併發如此高原因竟然在

一、併發控制 為啥要進行併發控制? 併發的任務對同一個臨界資源進行操作,如果不採取措施,可能導致不一致,故必須進行併發控制(Concurrency Control)。   技術上,通常如何進行併發控制? 通過併發控制保證資料一致性的常見手段有: 鎖(Loc

每週一本書《資料即未來——大資料王者》:項資料科學專案

【資料猿導讀】學習資料科學不僅僅意味著掌握分析工具和技術,其真正的神奇之處在於你開始像資料科學家

架構集群/分布式環境下5種session處理策略

復制 協調 部分 ont 描述 分析 bsp 優化 vol 轉自:http://www.cnblogs.com/jhli/p/6557929.html 在搭建完集群環境後,不得不考慮的一個問題就是用戶訪問產生的session如何處理。如果不做任何處理的話,用戶將出現頻繁

整潔如何寫出更整潔的代碼(上)

分享 技巧 .com 操作 心情 滾動 images word hand 如何寫出更整潔的代碼   代碼整潔之道不是銀彈,不會立竿見影的帶來收益。   沒有任何犀利的武功招式,只有一些我個人異常推崇的代碼整潔之道的內功心法。它不會直接有效的提高你寫代碼的能力與

opencv入門形態學圖像處理():膨脹、腐蝕

tar struct show 函數 使用 運算 腐蝕和膨脹 依賴 版本 參考網站: http://blog.csdn.net/poem_qianmo/article/details/23710721 1、形態學(morphology)概述   數學形態學(Mathem

Vue實戰、Vue-cli全面詳解及進階操作

image 腳本 js基礎 這一 命令執行 bsp row 編譯 服務器 全面的Vue-cli學習,這一篇就夠了! 一、下載 使用vue-cli前,需先安裝node.js,node的安裝就不贅述,不過在此需要註意: 1. node版本需在4.x以上,首推6.x以上版本

部落格分享是種美德年輕就該努力

  首先感謝CSDN給我這次機會參加2013部落格之星候選人,記得兩年前剛開始在CSDN寫部落格的時候,那時候還擔心寫的東西太爛,被別人罵。現在想想當時的想法真是多餘的。兩年來,我從一個對程式設計幾乎算不上入門的傻小子,到現在能簡單的寫一些有用的程式碼。回往這兩年,真的感謝以前那個

SpringBoot學習05.Springboot配置檔案詳解(

轉載宣告:商業轉載請聯絡作者獲得授權,非商業轉載請註明出處.原文來自 © 呆萌鍾【SpringBoot學習之路】05.Springboot配置檔案詳解(一)  配置檔案 Spring Boot使用一個全域性的配置檔案 applic