碼迷,mamicode.com
首頁 > 其他好文 > 詳細

中間件系統的架構設計

時間:2019-06-19 23:31:05      閱讀:157      評論:0      收藏:0      [點我收藏+]

標簽:產生   物理   就是   family   引入   并發   分數   本地   刷新   

中間件系統的架構設計

  1. Master-Slave架構

   該系統的本質是希望能夠用分布式的方式來處理一些數據,核心思想,就是把數據分發到很多臺機器上來處理,然后需要有一臺機器來控制N多臺機器的分布式處理:

   分布式的處理,就會肯定涉及到在Master中要維護這個集群的一些核心元數據。數據的分發處理的調度,處理的具體過程的進度,對集群里存放數據進行描述的一些核心元數據。

   這些核心元數據會不斷的頻繁的修改,無論你是基于外部的文件還是數據庫,或者是zookeeper來存放這些元數據的話,其實都會導致他的元數據更新性能降低,因為要訪問外部依賴。這種復雜的元數據不一定能通過數據庫來存放,它的非格式化有可能的。

    核心的設計是:將核心元數據直接存放在Master的內存里,這樣可以保證高并發更新元數據的時候,性能極高,可直接基于內存來提供對外的更新服務。如果Master部署在高配置物理機上,比如32核128GB的那種,每秒支持10萬+的請求都沒問題。

 

  2.異步日志持久化機制

    Master進程重啟或者突然宕機,內存中的數據不就丟失了?針對這個問題,采取異步持久化日志的機制,來通過異步化的方式把元數據的更新日志寫入磁盤文件。每次Master收到一個請求,在內存里更新元數據之后,就需要生成一條元數據的更新日志,把這個更新日志需要寫入到一個內存緩沖里去。然后等內存緩沖滿了之后,由一個后臺線程把這里的數據刷新到磁盤上去。

    那如果一條更新日志剛寫入緩沖區,結果Master宕機了,此時不是還是會丟失少量數據嗎?因為還沒來得及進入磁盤。

    沒錯,需采用異步持久化磁盤的模式,要容忍極端宕機情況下,丟失幾秒鐘的數據的情況。

    如果是正常的Master重啟:必須先把日志緩沖區清空刷入磁盤,然后才能正常重啟Master,保證數據都在磁盤上不會丟失。重啟的時候,從磁盤上讀取更新日志,每一條都依次回訪到內存里,恢復出來核心元數據即可。

 

   3.檢查點機制:定時持久化全量數據

 

    元數據不斷的在更新,不斷在產生最新的變更日志寫入磁盤文件,所以磁盤上的日志文件越來越大,系統運行一段時間以后,每次重啟都需要從磁盤讀取歷史全部日志,一條一條回放到內存來恢復核心元數據嗎?不,需要引入檢查點機制。

    每隔一段時間,就需要開啟一個后臺線程,把內存里的全部核心元數據序列化后寫入磁盤上的元數據文件,作為這個時間的一個快照文件,同時清空掉日志文件,這個叫做檢查點操作。下次重啟,只要把元數據文件讀取出來直接反序列化后方入內存,然后把上次檢查點之后的變更日志從日志文件里讀出來回放到內存里,就可以恢復出來完整的元數據了。

  這種方式,可以讓Master重啟很快,因為大部分數據都是在檢查點寫入的那個元數據文件里。

    4.引入檢查點節點

    Master內存里的元數據需要高并發的被人訪問和修改,同時每隔一段時間還要檢查點寫入磁盤。所以在檢查點過程中,是否需要需要把內存數據全部加鎖,不允許別人修改?

    在加鎖的時候,把不會變動的數據寫入磁盤文件中,這個過程很慢,這樣會導致系統在幾秒內出現卡頓無法響應請求的問題。此時需要在架構設計里引入一個檢查點節點,專門負責同步Master的變更日志。然后在自己內存里維護一份一模一樣的核心元數據,每隔一段時間由檢查點節點來負責將內存數據寫入磁盤,接著上傳發送給Master。這樣就不需要Master自己執行檢查點的時候對自己內存數據進行加鎖了。對Master來說,它只需要一個后臺線程負責接收檢查點進程定時傳送過來的元數據文件快照然后寫入本地磁盤就可以了。

中間件系統的架構設計

標簽:產生   物理   就是   family   引入   并發   分數   本地   刷新   

原文地址:https://www.cnblogs.com/zhao-teng-ass/p/11055567.html

(0)
(0)
   
舉報
評論 一句話評論(0
登錄后才能評論!
? 2014 mamicode.com 版權所有 京ICP備13008772號-2
迷上了代碼!
25选5历史开奖结果百度