網際網路分布式系統中,很多服務是資料儲存相關的,海量訪問量下,直接訪問儲存介質是抗不住的,需要使用cache,cache集群的負載均衡演算法就成為乙個重要的話題,這裡對現有的負載均衡演算法進行一些總結。
btw:雖然是cache負載均衡演算法小結,其實可以說是負載均衡演算法小結,只是針對cache應用場景罷了。
負載均衡演算法主要有:
static演算法
random演算法
round robin演算法 輪詢方式
hash演算法
carp演算法
consistent hash演算法
負載均衡的石器時代,為乙個服務指定多個ip:port,
備份模式,其總是返回伺服器組的第乙個伺服器(只要第乙個伺服器可用),當第乙個伺服器沒有用的時候,才會返回後續可用的伺服器。
這種情況下,每台機器都包括全量的資料,查詢通常會落到第一台機器上,第一台機器上cache命中率高,但是當失敗的時候,落到第二胎機器上,那就杯具了,cache命中率那個低啊!!!
地球人都知道的演算法,對於無狀態服務比較適用,隨便選取一台機器就可以。
idx=rand()%m
在實際使用中,跟static演算法一樣,都是模組維護全量資料,這個還好每台機器的cache命中率理論上應該差不多,但是都不高,為啥呢?因為同樣乙個請求一會落到機器a,一會落到機器b上。敗家子啊,浪費記憶體啊,記憶體有限,cache會被淘汰,頻繁淘汰,當然使得命中率低下啊。
典型的平均主義,吃大鍋飯的,皇帝輪流做啊,順序依次選取伺服器。
idx=(idx+1)%m
同樣的模組維護全量資料,跟random一樣杯具,基本上一樣的原因。相同的請求會被落到不同的機器上,導致cache命中率低。
又叫取餘演算法,將query key做hash之後,按照機器數量取餘,選取中乙個機器進行連線服務。
idx=hash(query_key)%m
餘數計算的方法簡單,資料的分散性也相當優秀,但也有其缺點。那就是當新增或移除伺服器時,快取重組的代價相當巨大。新增伺服器後,餘數就會產生巨變,這樣就無法獲取與儲存時相同的伺服器,從而影響快取的命中率。
carp準確的說不是乙個演算法,而是乙個協議,cache array routing protocol,cache群組路由協議。
計算全部伺服器的idx_key=hash(query_key+server_idx),其中計算得到idx_key最大的server_idx就是需要的idx。
假設開始3台後端伺服器,請求用標誌串 req = "abcd" 來標誌,伺服器用 s1, s2, s3來標誌, 那麼,通過對 req+ sx 合併起來計算簽名就可以對每個伺服器得到乙個數值:
(req = "abcd" + s1) = k1
(req = "abcd" + s2) = k2
(req = "abcd" + s3) = k3
計算的方法可以使用crc,也可以使用md5,目的的得到乙個*雜湊*的數字,這樣在k1,k2,k3中必定有乙個最大的數值,假設是k2,那麼可以將請求req扔給s2,這樣,以後對相同的請求,相同的伺服器組,計算出來的結果必定是k2最大,從而達到hash分布的效果。
巧妙的地方在於,新增或者刪除一台伺服器的時候,不會引起已有伺服器的cache大規模失效,假設新增一台伺服器s4,那麼對s1,s2,s3計算的k值都完全相同,那麼對s4可以計算得到乙個新值k4,如果計算k的演算法足夠雜湊,那麼原先計算到s1,s2,s3的請求,理論上都會有1/4的請求新計算得到的k4比原先的k大,那麼這1/4的請求會轉移到s4,從而新增的s4伺服器會負擔1/4的請求,原先的s1,s2,s3也只會負擔原先的3/4。
一致性hash演算法是:首先求出伺服器(節點)的雜湊值,並將其配置到0~2^32的圓環(continuum)上。然後用同樣的方法求出儲存資料的鍵的雜湊值,並對映到圓環上。然後從資料對映到的位置開始順時針查詢,將資料儲存到找到的第乙個伺服器上。如果超過2^32仍然找不到伺服器,就會儲存到第一台伺服器上。
idx=firstmaxserveridx(hash(query_key))
新增節點的時候:
consistent hash演算法背後最基礎的思想就是:對object和cache machine使用相同的hash函式【dht演算法的核心啊,p2p的理論基石啊,資源和位址節點在統一位址空間進行編址】。consistent hash適用於每個節點只儲存部分資料,而不是像前面幾種演算法,每個節點儲存全量資料。這樣做的好處是能夠把cache機器對映到一段interval上,而這段interval就會包含一定數目的物件的hash值。如果某台cache機器被移除了,那麼它對映到的interval被和它相鄰的乙個cache機器託管,其他所有的cache機器都不用變。
一致性雜湊演算法最大程度的避免了key在服務節點列表上的重新分布,其他附帶的改進就是有的一致性雜湊演算法還增加了虛擬服務節點的方法,也就是乙個服務節點在環上有多個對映點,這樣就能抑制分布不均勻,最大限度地減小服務節點增減時的快取重新分布。
轉 nginx五種負載均衡演算法共有五種:輪詢、ip_hash、weight、fair(第三方)、url_hash(第三方)
負載均衡演算法小結
網際網路分布式系統中,很多服務是資料儲存相關的,海量訪問量下,直接訪問儲存介質是抗不住的,需要使用cache,cache集群的負載均衡演算法就成為乙個重要的話題,這裡對現有的負載均衡演算法進行一些總結。btw 雖然是cache負載均衡演算法小結,其實可以說是負載均衡演算法小結,只是針對cache應用...
負載均衡演算法小結
網際網路分布式系統中,很多服務是資料儲存相關的,海量訪問量下,直接訪問儲存介質是抗不住的,需要使用cache,cache集群的負載均衡演算法就成為乙個重要的話題,這裡對現有的負載均衡演算法進行一些總結。btw 雖然是cache負載均衡演算法小結,其實可以說是負載均衡演算法小結,只是針對cache應用...
負載均衡演算法小結
from 網際網路分布式系統中,很多服務是資料儲存相關的,海量訪問量下,直接訪問儲存介質是抗不住的,需要使用cache,cache集群的負載均衡演算法就成為乙個重要的話題,這裡對現有的負載均衡演算法進行一些總結。btw 雖然是cache負載均衡演算法小結,其實可以說是負載均衡演算法小結,只是針對ca...