HAProxy負載平衡,
1》HAProxy簡介:
HAProxy是免費,高效,可靠的高可用及負載平衡解決方案,該軟體非常適合於處理高負載網站的七層資料請求,HAProxy的工作模式使其可以非常容易且安全地整合 到我們現有的網站架構中,使用類似的代理軟體還可以對外屏蔽內部的真實WEB伺服器,防止內部伺服器遭受外部攻擊;HAProxy架構中終端使用者通過訪問HAProxyProxy 伺服器 獲得網站頁面,而Proxy 伺服器在收到用戶端請求後會根據自身規則將資料請求轉寄給後端真實伺服器;為了讓同一Client Access Server時可以保持會話(同一用戶端第二次訪問網 站時可以被轉寄至相同的後端真實伺服器),HAProxy有三種解決方案:用戶端IP,Cookie以及Session,第一種方式中,HAProxy將用戶端IP進行Hash計算並儲存,以此確保當 相同的IP訪問Proxy 伺服器時可以轉寄到固定的真實伺服器上;第二種方式中,HAProxy依靠真實伺服器發送給用戶端的Cookie資訊進行會話保持;第三種方式中,HAProxy將保 存真實伺服器的Session及伺服器標識,實現會話保持功能;
HAProxy軟體包可以在其官方網站上下載,下面通過源碼方式安裝該軟體,在使用make命令產生makefile檔案時,TARGET=linux2628代表Linux作業系統使用的核心版 本為2.6.28及以上版本;
#yum install gcc
#tar -xvf haproxy-1.4.24.tar.gz
#cd /usr/local/src/haproxy-1.4.24
#make TARGET=linux2628
#make install
2》設定檔解析:
HAProxy安裝後沒有預設的設定檔,需要手動建立,本例將建立/etc/haproxy.cfg設定檔,當啟動HAProxy服務時需要使用-f選項指定設定檔路徑,HAProxy設定檔主 要包含全域設定段與代理段,global代表全域段,defaults,listen,frontend,backend為代理段;frontend用來匹配用戶端請求的網域名稱或URI等,backend定義後端伺服器叢集,listen 是frontend與backend的集合,有時僅使用listen即可代替frontend與backend,下面給出了一個監聽80連接埠的HTTP代理案例,Proxy 伺服器將轉寄資料請求到單一後台伺服器 127.0.0.1:8000;
HAProxy主設定檔的具體文法格式及描述:
global:
chroot<jail dir>:將工作目錄切換至<jail dir>並執行chroot,該配置可增強HAProxy的安全性,但需要使用超級賬戶啟動HAProxy程式;
daemon:配置HAProxy以後台進程模式工作;
uid<number>:配置進程的賬戶ID,建議設定為HAProxy專用賬戶;
gid<number>:配置進程的組ID,建議設定為HAProxy專用組;
log<address><facility>:配置全域syslog伺服器,可以設定兩台Log Service器;
nbproc<number>:指定後台進程的數量;
pidfile<pidfile>:將進程ID號寫入<pidfile>檔案;
ulimit-n<number>:設定每個進程的最大檔案描述符數量;
maxconn<number>:設定每個進程支援的最大並發數;
tune.bufsize<number>:設定buffer大小,預設值為16384,單位為位元組(B);
代理設定:
mode:HAProxy工作模式,可選項為:tcp,http,health;
timeout check<timeout>:設定檢查逾時時間;
contimeout<timeout>:設定連線逾時時間;
balance roundrobin:預設負載平衡工作模式,輪詢;
bind<address>:<port>:定義一個或過個監聽地址或連接埠;
stats auth admin:admin:設定監控介面的使用者名稱稱與密碼;
stats refresh <number>:統計頁面重新整理間隔時間;
option httplog:使用http日誌;
cookie<name>:啟用基於cookie的保持串連功能;
option forwardfor:允許插入X-Forwarded-For資料包頭給後端真實伺服器,可以讓後台伺服器獲得用戶端的真實IP地址;
option abortonclose:伺服器負載高時,自動關閉隊列裡處理時間比較長的串連請求;
option allbackups:當後端伺服器全部宕機時,是否啟用所有備用的伺服器,預設僅啟動第一個待命伺服器;
option dontlognull:不記錄空串連日誌,主要用於不記錄健全狀態檢查日誌;
option redispatch:在HTTP模式,如果使用cookie的伺服器宕機,用戶端還好堅持串連它,該選項在後端伺服器宕機時強制將請求轉寄給其他健康主機;
monitor-uri<uri>:檢查<uri>檔案是否存在,依次判斷主機健康狀態;
monitor-fail if site_dead:當伺服器宕機時,返回503錯誤碼,需要定義ACL;
option httpchk<uri>:使用HTTP協議檢查伺服器健康狀態;
retries<value>:伺服器串連失敗後的重試次數;
timeout client<n>:設定用戶端最大逾時時間為n,預設單位為毫秒(ms);
timeout server<n>:設定伺服器端最大逾時時間為n,預設單位為毫秒(ms);
timeout connect<n>:設定串連最大逾時時間為n,預設單位為毫秒(ms);
default_backend:設定檔中沒有use_backend規則時,設定預設後端伺服器組,伺服器組由backend定義;
use_backend:當條件滿足時,指定後端伺服器組,需要設定ACL;
acl<name><criterion>:定義存取控制清單,設定檔中通過name調用該ACL,常用限制包括:dst(目標地址),dst_port(目標連接埠),src(源地址),hdr(串連頭部 資訊),path_reg(訪問路徑匹配正則),url(統一資源定位器);
ACL存取控制清單案例如下:
3》HAProxy應用案例:
本例以生產環境為原型,簡化網路拓撲後使用HAProxy實現所示的高效能Proxy 伺服器架構,本例將使用listen定義一個監控連接埠;使用frontend定義一個前端80端 口;通過backend分別定義名為inside_servers和external_servers的伺服器組;使用default_backend定義預設伺服器組為external_servers;定義ACL規則時,如果內網 (192.168.0.0/24)訪問WEB服務,則由inside_servers伺服器組提供WEB頁面;
external_servers伺服器組中包含web1.example.com和web2.example.com兩台伺服器,inside_servers伺服器組中包含web2.example.com一台伺服器;
=》Web1
Client------->Internet--------->HAProxy--------->router-----=
=》Web2
1>實驗環境;
haproxy.example.com: eth0:172.31.16.163
eth1:192.168.10.10
web1.example.com: eth0:192.168.10.20
web2.example.com: eth0:192.168.10.30
client.example.com: eth0:172.31.16.229
2>具體配置:
兩台WEB伺服器基本採用相同的配置,下面僅以WEB1為例,為了示範HAProxy可以輪詢訪問後端伺服器,我們將兩台伺服器的版面設定為不同的內容以示區 別:
#service network restart
#yum -y install httpd
#echo "192.168.10.20" >/var/www/html/index.html
#service iptables stop
#service network restart
#yum -y install httpd
#echo "192.168.10.30" >/var/www/html/index.html
#service iptables stop
HAProxyProxy 伺服器設定如下:
#service network restart
#service iptables stop
核心調優,檔案中插入如下兩行:
#yum install gcc
#tar -xvf haproxy-1.4.24.tar.gz
#cd /usr/local/src/haproxy-1.4.24
#make TARGET=linux2628
#make install
#mkdir /var/haproxy #chroot所需目錄
建立設定檔:
global
maxconn4096
log 127.0.0.1 local3 info
chroot /var/haproxy
uid 99
gid 99
daemon
nbproc 1
pidfile /var/run/haproxy.pid
ulimit-n 65535
stats socket /var/tmp/stats
defaults
log global
mode http
maxconn 20480
option httplog
option httpclose
option dontlognull
option forwardfor
option redispatch
option abortonclose
stats refresh 30
retries 3
balance roundrobin
cookie SRV
timeout check 2000ms
timeout connect 5000ms
timeout server 50000ms
timeout client 50000ms
listen admin_status #定義HAProxy到監控介面
bind 0.0.0.0:6553
mode http
log 127.0.0.1 local3 info
stats enable
stats refresh 5s #監控統計頁面自動重新整理時間為5s
stats realm Haproxy\ Statistics #登入監控統計頁面提示符
stats uri /admin?stats #監控頁面URL路徑
stats auth admin1:AdMiN123 #查看HAProxy監控頁面到賬戶與密碼
stats hide-version #隱藏HAProxy版本資訊
frontend web_service #定義終端使用者訪問到前端伺服器
bind 0.0.0.0:80
mode http
log global
option httplog
option httpclose
option forwardfor
acl inside_src src 192.168.10.0/24 #定義ACL
#use_backend調用ACL定義,如果源地址為192.168.10.0/24,則Proxy 伺服器將會把請求轉寄#給inside_servers伺服器組
use_backend inside_servers if inside_src
default_backendexternal_servers
backend external_servers
mode http
balance roundrobin #輪詢真實伺服器
#檢查真實伺服器到index.html檔案,以此判斷伺服器的健康狀態
option httpchk GET /index.html
#定義後端真實伺服器,向cookie資訊中插入web1資訊,check代表允許對伺服器進行健康檢#查,健全狀態檢查到時間間隔為2000ms,連續兩次健全狀態檢查成功則認為伺服器是有效開啟的,連續三次健全狀態檢查失敗後,認為伺服器已經宕機,伺服器權重為1
server web1 192.168.10.20:80 cookie web1 check inter 2000 rise 2 fall 3 weight 1server web2 192.168.10.30:80 cookie web2 check inter 2000 rise 2 fall 3 weight 1backend inside_servers
mode http
balance roundrobin
option httpchk GET /index.html
server web1 192.168.10.30:80 cookie web2 check inter 1500 rise 3 fall 3 weight 1
3>修改HAProxy伺服器日誌設定檔,插入以下內容:
#vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
local3.*
#service rsyslog restart #重啟系統Log Service
#haproxy -f /etc/haproxy.cfg #指定設定檔啟動HAProxy服務
#echo "/usr/local/sbin/haproxy -f /etc/haproxy.cf" >>/etc/rc.local
4》用戶端驗證如下:
首先為用戶端主機配置正確的網路環境,確保用戶端與HAProxyProxy 伺服器可以直接連通,使用瀏覽器訪問http://172.31.16.163:6553/admin?stats查看Proxy 伺服器狀態統 計資訊:
配置用戶端主機IP地址為172.31.16.229,通過瀏覽器訪問http://172.31.16.163,重新整理將分別得到web1.example.com以及web2.example.com兩台主機返回的頁面資訊,如 果用戶端主機IP地址配置為192.168.10.0/24網路內的IP,則訪問http://192.168.10.10,伺服器將返回的頁面將永遠都是web2.example.com主機的頁面資訊;