超级负载均衡
超級(jí)負(fù)載均衡旨在為解決服務(wù)不斷擴(kuò)展、機(jī)器不斷增多、機(jī)器性能差異等問題,以增強(qiáng)系統(tǒng)的穩(wěn)定性,自動(dòng)分配請(qǐng)求壓力。算法實(shí)現(xiàn)了多個(gè)模型和均衡策略,能通過配置實(shí)現(xiàn)隨機(jī)、輪詢、一致hash等。同時(shí)也能實(shí)現(xiàn)跨機(jī)房的相關(guān)分配。現(xiàn)已經(jīng)在多個(gè)系統(tǒng)中使用。
TAG
負(fù)載均衡
內(nèi)容
現(xiàn)有系統(tǒng)中存在的問題:
1. 慢連接、瞬時(shí)訪問慢。
場(chǎng)景一:
如果后端新增加機(jī)器,cache命中率低,因此響應(yīng)速度慢,但是能連接上且不超時(shí)。如果ui持續(xù)訪問就會(huì)把ui夯住。
場(chǎng)景二:
如果后端模塊某一臺(tái)機(jī)器響應(yīng)較慢。如果前端持續(xù)訪問就會(huì)被夯住。
2. 死機(jī)。
場(chǎng)景一:
能斷斷續(xù)續(xù)響應(yīng)請(qǐng)求,不過速度很慢。造成ui夯住。
3. 混合部署。
場(chǎng)景一:
多個(gè)模塊在同一機(jī)器上,項(xiàng)目影響。
4. 機(jī)器權(quán)重。
場(chǎng)景一:
老機(jī)器,性能差;新機(jī)器,性能彪悍。因此他們應(yīng)該承載不同的壓力。
5. 跨機(jī)房冗余。
場(chǎng)景一:
后端對(duì)cache依賴很高的模塊,因?yàn)椴捎玫氖且恢耯ash算法,如果掛掉一臺(tái)機(jī)器,對(duì)另外的機(jī)器cache命中率沖擊很大。因此希望將對(duì)這個(gè)機(jī)器的請(qǐng)求均衡到另外一個(gè)機(jī)房。
6. php和c使用同樣的策略。
現(xiàn)在php和c希望能使用的策略實(shí)際上是有很大的一致。為了避免重復(fù)開發(fā),php和c希望采用同樣的負(fù)載均衡庫。
要解決的問題:
設(shè)計(jì)思路:
1. 根據(jù)均衡策略計(jì)算出的均衡值對(duì)Server進(jìn)行逆序排序。
2. 負(fù)載選擇。對(duì)步驟1排序后的Server按以下順序進(jìn)行選擇:
a、按連接失敗概率進(jìn)行選擇。
注:橫軸代表失敗次數(shù),縱軸代表選擇的概率。
Cconn:一段區(qū)間內(nèi)失敗次數(shù)
f(Cconn):連接概率,取值范圍在(0,100]
b、按健康狀態(tài)選擇。
整個(gè)模型基于服務(wù)處理時(shí)間的收斂性。
分析:
1) 如果機(jī)器狀態(tài)良好,則平均處理時(shí)間會(huì)保持在一個(gè)穩(wěn)定水平;即使是小波動(dòng),也會(huì)較快平穩(wěn)在一個(gè)狀態(tài)。
2) 如果機(jī)器開始出現(xiàn)問題,處理時(shí)間會(huì)開始增長。如果增長持續(xù)超過一段時(shí)間,則說明有可能會(huì)影響服務(wù);如果一段時(shí)間后穩(wěn)定了,說明對(duì)請(qǐng)求沒有太多影響。
f(healthy):機(jī)器健康狀態(tài),取值范圍[0,1]
select(healthy):機(jī)器選擇概率,取值范圍[R,1]
c、如果所有機(jī)器都沒選中,則隨機(jī)選擇一臺(tái)機(jī)器進(jìn)行服務(wù)。
3. 機(jī)器流量均分。
不同的機(jī)器處理能力是不一樣的。當(dāng)按照步驟2選擇了某臺(tái)機(jī)器,需要將其他處理時(shí)間為他的1/T(T>=2)的機(jī)器也選取出來,將部分壓力分給對(duì)應(yīng)的機(jī)器。
設(shè)k臺(tái)機(jī)器的處理時(shí)間分別是t1, t2,…,tk, 選中的機(jī)器id=i,比該機(jī)器處理能力高的機(jī)器時(shí)間分別為p1,p2,..,pr, (其中pj × T <= ti)。設(shè)一段時(shí)間總訪問量為Y,每臺(tái)機(jī)器理論上的訪問量應(yīng)該為Vg=Y/k。而實(shí)際的Vr=Y/(ti * (1/t1+1/t2+…+1/tk))。則應(yīng)該分出Vg-Vr的流量給pj。pj的流量比例為1/p1:1/p2:…:1/pr
算法設(shè)計(jì):
A、均衡算法
1. 一致hash算法。
將每個(gè)server的ip和port加上balance_key三者做字符串拼接后,做md5簽名。
value(server) = md5(server_ip + server_port + balance_key)
2. 隨機(jī)算法。
value(server) = random();
3. 輪詢算法。
value(server) =((server.id – (rounds % server_count)) + server_count) % server_count
4. 多個(gè)選一算法。
rank初始化為1, 如果默認(rèn)的server失敗,則rank+1
value(server) =((server.id – (rank % server_count)) + server_count) % server_count
B、負(fù)載算法
1. 連接狀態(tài)算法。
a、對(duì)每一個(gè)server開辟一個(gè)狀態(tài)隊(duì)列。bool queue[K] 用來統(tǒng)計(jì)失敗次數(shù)。每次有壞狀態(tài)進(jìn)隊(duì),計(jì)數(shù)加一。如果有壞狀態(tài)出隊(duì),則計(jì)數(shù)減一。
b、按照f(Cconn)公式計(jì)算出選擇概率。
c、利用rand()%100是否在[0,f(Cconn)]來決定是否選擇該機(jī)器。
2. 健康狀態(tài)算法。
a、每臺(tái)機(jī)器維持一個(gè)一秒鐘內(nèi)的處理時(shí)間T和次數(shù)C。
b、當(dāng)一秒過去以后,將T、C計(jì)算為平均處理時(shí)間R。
c、每M秒,統(tǒng)計(jì)每臺(tái)機(jī)器最近一段時(shí)間的平均處理時(shí)間, 按照公式select(healthy)算出選擇概率。
d、利用rand()%100是否在[0, select(healthy)*100]來決定是否選擇該機(jī)器。
C、流量均分
按照策略選出滿足要求的機(jī)器,按照流量均分公式進(jìn)行流量分配。
分配時(shí)按照balance_key+server方式和random()來分配機(jī)器, 盡量保證請(qǐng)求落在同一臺(tái)機(jī)器。
總結(jié)
- 上一篇: qq个性网签名
- 下一篇: “分布式哈希”和“一致性哈希”的概念与算