目前只有思路,過兩天上**。。。。。。
伺服器 權重
a 5
b 3
c 2
1)總的權重是10,先隨機出乙個數字(肯定是10以內的數字)
2)然後遍歷權重的陣列[5,3,2]乙個乙個的去比較
核心**
遍歷ip 拿到權重weight
if(offset
數形結合
權重座標:
0————5——8—10
a b c
如果offset小於5就直接返回ip a
如果offset大於5 比如是7 就 用7減去當前的5得到offset=2
此時權重座標是:
0——3—5
b c然後下次遍歷2落在b的位置 直接返回ip b
這種演算法的好處和list相比 如果有個權重100 list需要放100個物件,而這種演算法比較省空間
伺服器 權重
a 5
b 1
c 1
如果請求
aaaaabc對abc三個伺服器不夠平衡
aababac 我們想要請求這個結果 nginx 平衡加權輪詢演算法
這時我們需要增加乙個動態權重變數 currentweight
返回結果aabacaa 達到了平均加權輪詢的目的,這個演算法的過程寫在圖上面了,過兩天上**
普通hash演算法
假設我們有三颱伺服器 s1 s2 s3。我們有三萬張據需要快取到伺服器上,這些資料最好均勻的分配到伺服器上。
1)hash(名稱)%機器數=餘數。 如果有三颱伺服器 取模的結果就是0 1 2 與伺服器編號對應
2)對同一條資料做相同的hash計算時得到的資料時不變的,訪問的時候 對進行hash計算 就可以知道快取在哪台伺服器上
通過這種演算法 就可以將三萬張快取在三颱伺服器上,而且下次訪問時 就能直接計算出快取在哪台伺服器上,這種演算法就是雜湊演算法
雜湊演算法缺陷:
伺服器從3臺變成4臺 hash(名稱)%機器數(由3變成4) 得到的餘數會發生變化,這裡由於快取伺服器數量發生變化,導致不能正常訪問快取資料,大量快取同一時間失效,導致快取雪崩
改進:一致性hash演算法
一致性hash演算法由乙個雜湊環組成 環上又2的32次方個點
1)hash(a)%2的32次方=結果,結果的值在0到2的32次方之間,可以把伺服器a b c對映到雜湊環上。
2)用同樣的方法 可以把要快取的物件對映到雜湊環上 hash(名稱)%2的32次方
3)確定需要快取在哪一台伺服器上:位置 瞬時間旋轉,遇到第乙個伺服器的位置,就是鎖存放的快取伺服器
假設增加了一台伺服器d 會有部分沿順時針遇到的第一台快取伺服器就由伺服器a變成了伺服器d
這樣 每增加一台伺服器會有一小部分快取失效,無法訪問大部分依然可以正常訪問 避免了快取雪崩
(如果abc不是均勻的分散在hash環上,距離很近)導致快取分部極度不均勻 這就是hash偏斜。解決辦法:增加一層虛擬節點
具體進行快取讀寫時:——>先找到虛擬節點——>虛擬節點在找到真實節點——>快取的讀取和儲存
資料定位演算法不變,只需要增加一步:虛擬節點到實際點的對映。
所以加入虛擬節點之後,即使在服務節點很少的情況下,也能做到資料的均勻分布。
nginx 負載均衡演算法
1 輪詢 就是按照時間順序分配下乙個請求的伺服器。2 權值輪詢 給每乙個伺服器加上權值,權值和分配的請求成正比,比較適應於伺服器配置不均的情況。upstream backend 3 ip雜湊 根據ip的雜湊值分配,這樣每個ip每次訪問的伺服器都相同,這樣session的處理會容易些。upstream...
Nginx 負載均衡演算法
1 輪詢 預設 每個請求按順序逐一分配到不同的伺服器,如果某台伺服器宕機,自動剔除故障系統,整個服務保證可用 2 weight 輪詢加權 weight的值越大分配到的訪問概率越高 upstream bakend 3 ip hash 每個請求按訪問ip的雜湊結果分配,使來自同乙個ip的訪客固定訪問一台...
Nginx 負載均衡演算法
nginx負載均衡演算法 1 輪詢 預設 每個請求按時間順序逐一分配到不同的後端服務,如果後端某台伺服器宕機,自動剔除故障系統,使使用者訪問不受影響。upstream tomcat server server 192.168.10.11 8080 weight 1 server 192.168.10...