成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如果讓你自己設計一個分布式架構的中間件系統,該怎么做?

開發 架構
每次Master收到一個請求,在內存里更新元數據之后,就需要生成一條元數據的更新日志,把這個更新日志需要寫入到一個內存緩沖里去。

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

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操作。?

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2021-01-14 05:23:32

高并發消息中間件

2024-08-28 08:38:51

2025-03-27 11:03:18

2019-09-10 09:25:27

分布式系統Elasticsear

2017-08-17 09:18:29

分布式存儲面試

2022-09-03 18:00:05

消息中間件MQ

2019-07-08 11:09:09

分布式系統Elasticsear

2021-11-14 16:07:35

中間件阿里Seata

2024-05-07 07:58:10

數據架構大數據中間件架構

2025-06-10 01:00:00

分布式日志系統

2017-11-30 08:56:14

數據庫中間件架構師

2017-11-27 06:01:37

數據庫中間件中間層

2023-01-13 18:04:03

面試題消息中間件

2016-09-30 10:13:07

分布式爬蟲系統

2022-11-11 08:19:03

redis分布式

2019-01-28 11:46:53

架構運維技術

2018-09-03 10:49:09

2018-09-06 22:49:31

分布式架構服務器

2022-09-21 16:09:28

消息中間件

2014-06-20 09:18:54

Dustjs中間件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产福利在线 | 国产高清久久久 | 国产99久久精品一区二区永久免费 | 精品国产乱码久久久久久蜜退臀 | av日韩在线播放 | av黄色免费 | 成年人视频在线免费观看 | 黄色毛片视频 | 日韩久久久久久久久久久 | 密室大逃脱第六季大神版在线观看 | 久久精品久久综合 | 日韩电影中文字幕 | 欧美日韩三级视频 | 国产精品一区二区久久精品爱微奶 | 九九精品影院 | 成人午夜免费福利视频 | 中文字幕在线观看日韩 | 欧美激情在线一区二区三区 | 犬夜叉在线观看 | 午夜精品一区二区三区在线视频 | 一本大道久久a久久精二百 国产成人免费在线 | 毛色毛片免费看 | 亚洲国产小视频 | 黄色一级大片在线免费看产 | 日本成人三级电影 | 天天躁日日躁狠狠躁白人 | 精品视频一区二区三区在线观看 | 日韩视频一区 | 精品1区2区3区4区 | 色婷婷在线视频 | 日韩免费视频 | 国产一区精品 | 一级片av | 国产精品亚洲成在人线 | 99视频在线免费观看 | 欧美一区二区三区在线播放 | 免费的黄色片子 | 99这里只有精品视频 | 九九九久久国产免费 | 欧美日韩中文字幕 | 做a视频|