分布式快取伺服器設計原理

2021-07-27 09:24:07 字數 2449 閱讀 7613

1.資料是如何被分布到多個伺服器上的?(一致性雜湊演算法)

假設有n臺伺服器,

計算這n臺伺服器的ip位址的雜湊值,

把這些雜湊值從小到大按順時針排列組成乙個「伺服器節點環」,

客戶端需要儲存一系列的「鍵值對」到這些伺服器上去,

計算這些「鍵」的雜湊值,

看看這些「鍵」的雜湊值落在「伺服器環」的哪些區間,

如下圖所示:

根據上圖示意,資料將被儲存在「順時針方向上的下乙個伺服器節點」

讀取資料時,也是先根據「鍵」的雜湊值,找到這個伺服器節點,

再向這個節點索取資料。

2.資料如何均勻的分布?(虛擬伺服器)

假設伺服器數量較少,

很可能造成有些伺服器儲存的資料較多、承擔的壓力較大,

有些伺服器就比較空閒。

這時就要把一台伺服器虛擬化成多台伺服器,

具體的操作辦法:

在計算伺服器對應的雜湊值時

可以在ip位址字串加多個「尾綴」

比如:10.0.0.1#1

10.0.0.1#2

10.0.0.1#3

....

這樣,一台物理伺服器就被虛擬化成多台伺服器,

對應「伺服器環」上的多個節點。

3.如何實現資料的熱備份?

以順時針方向看「伺服器環」

當有客戶端把資料儲存在第1臺伺服器上後,

第1臺伺服器負責把該資料拷貝乙份給第2臺伺服器

以此類推,

也就是說「伺服器環」上的每乙個節點,都是上乙個節點的熱備份節點

同時,乙個伺服器上存了兩類資料,一類是自身的業務資料,一類是上一節點的熱備資料。

注意:這裡所說的伺服器,都是物理伺服器,不是虛擬伺服器。

如下圖所示

4.如何讓客戶端發現所有服務端?

每個伺服器節點都要維護乙個對照表

這個對照表中包含所有伺服器,(ip位址和ip位址的雜湊值對照表)

配置客戶端時,只要讓客戶端知道任意乙個伺服器的ip位址即可

客戶端可以通過獲取這個伺服器的對照表從而知道所有的伺服器

客戶端初始化的時候,這個對照表也儲存在客戶端乙份

客戶端根據這個對照表來訪問資料

注意:這個對照表是有乙個版本號的,具體的用途見下面的描述

5.如何應對伺服器異常?

假設資料在節點1上讀寫不成功,

我們就認為這個節點存在異常,要把它從伺服器群集中拿掉。

客戶端先在節點2(節點1的熱備節點)上完成相應的讀寫工作,這時客戶端就可以去做其他工作了。

然後節點2向節點0索取資料(這些資料是本應該備份在節點1上的資料)

然後節點2向節點3推送資料(這些資料是節點1上的資料,現在要備份在節點3上)

然後節點2更新其對照表,把節點1從其對照表中移除,並更新對照表的版本號

當有任何客戶端與節點2互動的時候,

就會發現節點2上的對照表的版本號比自己持有的對照表要高

此時,客戶端就更新自己的對照表

這些客戶端再與其他伺服器互動的時候

其他伺服器發現客戶端攜帶的對照表版本號比自己持有的要高

此時,其他伺服器更新自己的對照表

注意:這是乙個「發散式的連鎖反應」,不會影響生產。

還可以讓節點2告知節點3需要更新對照表

當節點3更新完之後,再讓節點3告知節點4....

以此引發「環式的連鎖反應」

注意:當「伺服器環」上連續兩台伺服器同時故障的時候,那麼這個系統就崩潰了

可以對資料做兩次熱備份,以提高安全性,但效能和硬體利用率會有所損耗。

6.如何增加伺服器?

首先需要通過配置讓這台伺服器知道節點環上的任意一台伺服器的ip位址(假設是10.0.0.1)

此服務端執行之後,他就會從10.0.0.1上獲取對照表,

以此知道自己在節點環中的具體位置,

然後從上乙個節點中索取一部分資料(也就是該自己儲存的一部分資料)

然後它把自己加入對照表中,

然後告知10.0.0.1需要更新對照表,以此引發連鎖反應

此文最初的想法是乙個

alexqiu跟我說的,

後來又仔細研究了

一致性雜湊演算法

並加入了我自己的想法(熱備機制、配置表儲存及公升級機制)

最終形成此文。

2023年4月9號:

第二個問題:增減伺服器節點均是在"物理節點環"上完成,與「虛擬節點環」沒有關係

第三個問題:除了熱備,還可以在熱備的基礎上實現負載均衡

memcached快取,「分布式」 快取伺服器

memcached快取,分布式 快取伺服器,其本身沒有分布式功能,且各個memcached快取之間不會通訊與共享,因此其分布式取決客戶端的實現 也就是說客戶端存資料,可能存到不同的memcached,但取的時候直接取不用管存在哪乙個memcached。mem new memcached 新增多個me...

分布式快取伺服器負載均衡問題

但是,如果一台伺服器宕機怎麼辦,或者增加一台快取伺服器怎麼辦。還採用這種方法就會導致快取伺服器命中率瞬間下降。這時可以採用consistent hashing的思想。consistent hashing如下所示 首先求出memcached伺服器 節點 的雜湊值,並將其配置到0 232的圓 conti...

分布式遊戲伺服器設計

登入伺服器 中心伺服器 遊戲伺服器 儲存伺服器 依賴系統 流量限制 橫向擴充套件 訊息內容加密 訊息序列 sequence 驗證 訊息完整性 crc 驗證 訊息時間戳驗證 黑名單 版本驗證 心跳 強制下線 登入控制 排隊系統 登入驗證 響應訊息 廣播訊息 對於特定的名單的訊息,提供名單群體推送功能 ...