我的線上環境是阿裡雲,既然阿裡雲有SLB,比自己運維一個要省事兒的多,事實上,自己做也真不一定做得比它好,本文試圖以haproxy來解釋一下slb的原理
講解haproxy的目的是介紹負載算法,便於理解SLB,最後給出node-slb解決方案
目前,在線上環境中應用較多的負載均衡器硬件有F5 BIG-IP,軟件有LVS,Nginx及HAProxy,高可用軟件有Heartbeat. Keepalived
成熟的架構有
優點
官網 http://www.haproxy.org/ (自備梯子)
我覺得它是所有負載軟件裡最簡單最好用的。配置文件比nginx還簡單,而且還有監控頁面。
下載最新版軟件 http://www.haproxy.org/download/1.5/src/haproxy-1.5.12.tar.gz
解壓
tar -zxvf haproxy-1.5.12.tar.gz
切換到目錄
cd haproxy-1.5.12
打開readme看一下,如何安裝
make TARGET=linux26 sudo make install
# Simple configuration for an HTTP proxy listening on port 80 on all # interfaces and forwarding requests to a single backend "servers" with a # single server "server1" listening on 127.0.0.1:8000 global daemon maxconn 256 defaults mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms frontend http-in bind *:80 default_backend servers backend servers server server1 127.0.0.1:8000 maxconn 32 # The same configuration defined with a single listen block. Shorter but # less expressive, especially in HTTP mode. global daemon maxconn 256 defaults mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms listen http-in bind *:80 server server1 127.0.0.1:8000 maxconn 32
haproxy -f test.cfg
記得在配置文件裡加上
listen admin_stats bind 0.0.0.0:8888 stats refresh 30s stats uri /stats stats realm Haproxy Manager stats auth admin:admin #stats hide-version
http://ip:8888/stats
HAProxy的算法有如下8種:
負載均衡(Server Load Balancer,簡稱SLB)是對多台雲服務器進行流量分發的負載均衡服務。SLB可以通過流量分發擴展應用系統對外的服務能力,通過消除單點故障提升應用系統的可用性
使用tengine實現的。
Tengine是由淘寶網發起的Web服務器項目。它在Nginx的基礎上,針對大訪問量網站的需求,添加了很多高級功能和特性。
see http://tengine.taobao.org/
創建slb
點擊管理按鈕,進入實例詳情
沒啥需要改的,我們直接看服務監聽功能,看看如何配置slb
點擊編輯按鈕,此時可以看到具體配置頁面
目前slb支持2種轉發規則
輪詢應該是和haproxy的roundrobin調度算法一樣,表示簡單的輪詢
最小連接數SLB會自動判斷 當前ECS 的established 來判斷是否轉發
配置完了slb server,下一步要設置具體slb把請求轉發給哪台機器,這實際上才是最核心的的配置。
阿裡雲把這件事兒做的超級簡單
假設我現在有一個ecs服務器為已填加
點擊【未添加的服務器】,此時會列出未加入負載池的ecs服務器
選中一台服務器
點擊批量添加
配置一下權重,如果機器性能一樣就配置權重一樣,性能越好,權重越大
可選值【0 -- 100】
完成配置後,已添加服務器裡就有了2台服務器
保證你的服務器都啟動,比如2台服務器的80端口都正常即可
此時你需要做的是把你的域名解析到slb服務器的ip地址上
an expressjs middleware for aliyun slb
http://bbs.aliyun.com/read/188736.html?page=1
2)請問健康檢查發的什麼請求? head 還是 get? head請求。
如果express路由沒有處理head請求的話,會觸發其他路由,可能會出現請求重定向死循環
var debug = require('debug')('slb'); module.exports = function (req, res, next) { if(req.method.toLowerCase() == 'head'){ debug('[ALIYUN.COM LOG]: SLB health checking....OK...'); return res.sendStatus(200); } next(); };
原理非常簡單:以中間件的形式,處理一下req.method為head的適合,終止此請求即可
npm install --save node-slb
var slb = require('node-slb'); var app = express(); app.user(slb);
首先啟動demo的服務
➜ node-slb git:(master) ✗ npm start > [email protected] start /Users/sang/workspace/github/node-slb > cd demo && npm install && npm start > [email protected] start /Users/sang/workspace/github/node-slb/demo > node ./bin/www
執行test命令,測試請求
➜ node-slb git:(master) ✗ npm test > [email protected] test /Users/sang/workspace/github/node-slb > curl -i -X HEAD http://127.0.0.1:3000 HTTP/1.1 200 OK X-Powered-By: Express Content-Type: text/plain; charset=utf-8 Content-Length: 2 ETag: W/"2-d736d92d" Date: Mon, 29 Jun 2015 03:46:49 GMT Connection: keep-alive
此時,觀察服務器日志
➜ node-slb git:(master) ✗ npm start > [email protected] start /Users/sang/workspace/github/node-slb > cd demo && npm install && npm start > [email protected] start /Users/sang/workspace/github/node-slb/demo > DEBUG=slb node ./bin/www [ALIYUN.COM LOG]: SLB health checking....OK...
如果出現[ALIYUN.COM LOG]: SLB health checking....OK...
說明正常。
如果想打印日志,可以DEBUG=slb,如果不想打印日志,默認即無。