目前市場上,有關實作負載均衡的軟體,使用比較多的是haproxy、nginx和lvs。
首先,介紹一下:什麼是負載均衡?負載均衡一般通過兩種方式來實作:基于作業系統的負載實作和基于第三方應用的負載實作。LVS就是基于Linux作業系統實作的一種負載,HAProxy就是開源的并且基于第三應用實作的負載。
兩者之間的不同:LVS的特點是:
1、抗負載能力強。抗負載能力強、性能高,能達到F5硬體的60%;對記憶體和cpu資源消耗比較低;
2、工作在網絡4層,通過vrrp協定轉發(僅作分發之用),具體的流量由linux核心處理,是以沒有流量的産生。
HAProxy的特點是:
1、支援兩種代理模式:TCP(四層)和HTTP(七層),支援虛拟主機;
2、haproxy特别适用于那些負載特别大的web站點,這些站點通常又需要會話保持或七層處理。當haproxy運作在硬體上,完全可以支援數以萬計的并發連接配接。
介紹完基本知識,讓我們開始學習haprxoy這款軟體。
一、HAProxy介紹
反向代理伺服器,支援雙機熱備,支援虛拟主機,但其配置簡單,擁有非常不錯的伺服器健康檢查功能,當其代理的後端伺服器出現故障,HAProxy會自動将該伺服器摘除,故障恢複後再自動将該伺服器加入。
二、HAProxy的優點
1、免費開源,可靠性與穩定性都非常出色,可與硬體級裝置媲美
2、支援連接配接拒絕,可以用于防止DDoS攻擊
3、支援長連接配接、短連接配接和日志功能,可根據需要靈活配置
4、路由HTTP請求到後端伺服器,基于cookie作會話綁定;同時支援通過擷取指定的url來檢測後端伺服器的狀态
5、HAProxy還擁有功能強大的ACL支援,可靈活配置路由功能,實作動靜分離,在架構設計與實作上帶來很大友善
6、可支援四層和七層負載均衡,幾乎能為所有服務常見的提供負載均衡功能
7、擁有功能強大的後端伺服器的狀态監控web頁面,可以實時了解裝置的運作狀态,還可實作裝置上下線等簡單操作。
8、支援多種負載均衡排程算法,并且也支援session保持。
三、配置檔案介紹
haproxy 的配置檔案由兩部分組成:全局設定和對代理的設定,共分為五段:global,defaults,frontend,backend,listen。
3.1 配置檔案格式
HAProxy的配置處理3類來主要參數來源:
——最優先處理的指令行參數;
——“global”配置段,用于設定全局配置參數;
——proxy相關配置段,如“defaults”、“listen”、“frontend”和“backend”;
3.2 時間格式
一些包含了值的參數表示時間,如逾時時長。這些值一般以毫秒為機關,但也可以使用其它的時間機關字尾。
3.3 全局配置
* 程序管理及安全相關的參數
– chroot :修改haproxy的工作目錄至指定的目錄并在放棄權限之前執行chroot()操作,可以提升haproxy的安全級别,不過需要注意的是要確定指定的目錄為空目錄且任何使用者均不能有寫權限;
– daemon:讓haproxy以守護程序的方式工作于背景,其等同于“-D”選項的功能,當然,也可以在指令行中以“-db”選項将其禁用;
– gid :以指定的GID運作haproxy,建議使用專用于運作haproxy的GID,以免因權限問題帶來風險;
– group :同gid,不過指定的組名;
– log [max level [min level]]:定義全局的syslog伺服器,最多可以定義兩個;
– log-send-hostname []:在syslog資訊的首部添加目前主機名,可以為“string”指定的名稱;
– nbproc :指定啟動的haproxy程序的個數,隻能用于守護程序模式的haproxy;預設隻啟動一個程序,鑒于調試困難等多方面的原因,一般隻在單程序僅能打開少數檔案描述符的場景中才使用多程序模式;
– uid:以指定的UID身份運作haproxy程序;
– ulimit-n:設定每程序所能夠打開的最大檔案描述符數目,預設情況下其會自動進行計算,是以不推薦修改此選項;Linux預設單程序打開檔案數為1024個;
– user:同uid,但使用的是使用者名;
– stats:使用者通路統計資料的接口;
– node:定義目前節點的名稱,用于HA場景中多haproxy程序共享同一個IP位址時;
– description:目前執行個體的描述資訊;
* 性能調整相關的參數
– maxconn :設定每個haproxy程序所接受的最大并發連接配接數,其等同于指令行選項“-n”;“ulimit -n”自動計算的結果正是參照此參數設定的;
– maxpipes :haproxy使用pipe完成基于核心的tcp封包重組,此選項則用于設定每個程序所允許使用的最大pipe個數;每個pipe會打開兩個檔案描述符,是以,“ulimit -n”自動計算時會根據需要調大此值;預設為maxconn/4,其通常會顯得過大;
3.4 代理
代理相關的配置可以如下配置段中。
defaults”段用于為所有其它配置段提供預設參數,這預設配置參數可由下一個“defaults”所重新設定。
“frontend”段用于定義一系列監聽的套接字,這些套接字可接受用戶端請求并與之建立連接配接。
“backend”段用于定義一系列“後端”伺服器,代理将會将對應用戶端的請求轉發至這些伺服器。
“listen”段通過關聯“frontend”和“backend”定義了一個完整的代理,通常隻對TCP流量有用。
所有代理的名稱隻能使用大寫字母、小寫字母、數字、-(中線)、_(下劃線)、.(點号)和:(冒号)。此外,ACL名稱會區分字母大小寫。
四、配置案例
一個最簡單的http服務的配置
global log 127.0.0.1 local2chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s #在用戶端建立連接配接但不請求資料時,關閉用戶端連接配接 timeout queue 1m # 等待最大時長 timeout connect 10s # 定義haproxy将用戶端請求轉發至後端伺服器所等待的逾時時長 timeout client 1m # 用戶端非活動狀态的逾時時長 timeout server 1m # 用戶端與伺服器端建立連接配接後,等待伺服器端的逾時時長 timeout http-keep-alive 10s # 定義保持連接配接的逾時時長 timeout check 10s # 健康狀态監測時的逾時時間,過短會誤判,過長資源消耗 maxconn 3000 # 每個server最大的連接配接數 frontend webser #webser為名稱 option forwardfor bind *:80 #自定義監聽端口 default_backend app backend app balance roundrobin #使用roundrobin 算法 server app1 192.168.159.120:80 check server app2 192.168.159.121:80 check
動靜分離示例
frontend webservs
bind *:80
acl url_static path_beg -i /static/images/javascript/stylesheets
acl url_static path_end -i .jpg.gif.png.css.js.html
acl url_php path_end -i .php
acl host_static hdr_beg(host) -i img. imgs. video. videos. ftp. image. download.
use_backend static if url_static or host_static
use_backend dynamic if url_php
default_backend dynamic
backend static
balance roundrobin
server node1 192.168.159.120:80 check maxconn 3000
backend dynamic
balance roundrobin
server node2 192.168.159.121:80 check maxconn 1000
五、HAProxy+Keepalived實作高可用負載均衡
下圖描述了使用keepalived+Haproxy主從配置來達到能夠針對前段流量進行負載均衡到多台後端web1、web2、web3、img1、img2。但是由于haproxy會存在單點故障問題,是以使用keepalived來實作對Haproxy單點問題的高可用處理。

一、環境準備:
centos系統伺服器4台、兩台用于做haproxy主從架構,兩台作為後端server,伺服器配置好
yum源、防火牆關閉、各節點時鐘服務同步、各節點之間可以通過主機名互相通信。
1、準備四台主機:
一台Director-master,DIP:192.168.159.151 VIP:172.17.253.115(橋接模式和僅主機模式)
一台Director-backup,DIP:192.168.159.129 VIP:172.17.253.115(橋接模式和僅主機模式)
一台背景伺服器,RIP:192.168.159.120 僅主機模式
一台背景伺服器,RIP:192.168.159.121 僅主機模式
二、安裝步驟:
1、iptables -F && setenforing 清空防火牆政策,關閉selinux
2、兩台伺服器Director-master和Director-backup都使用yum方式安裝haproxy、keepalived服務
或編譯安裝:tar zxvf haproxy-1.4.8.tar.gz
cd haproxy-1.4.8
uname -a //檢視linux核心版本
make TARGET=linux26 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
3、後端伺服器配置好基于LNMP架構的web服務
三、修改配置檔案:
1.修改/etc/keepalived/keepalived.conf配置檔案内容
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 5
router_id LVS_DEVEL
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 23
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass riqi
virtual_ipaddress {
172.17.253.115
啟動服務:systemctl start keepalived
2、配置日志服務
vim /etc/rsyslog.conf
$ModLoad imudp 開啟UDP的日志服務,也可以開啟TCP $UDPServerRun 514 local2.* /var/log/haproxy.log 定義日志标準
systemctl restart rsyslog 重新開機日志服務
3、在haproxy-master上操作haproxy配置檔案,定義全局配置
vim /etc/haproxy/haproxy.conf
global #全局配置
log 127.0.0.1 local2 #日志類型
chroot /var/lib/haproxy #修改haproxy的工作目錄
pidfile /var/run/haproxy.pid #程序id
maxconn 4000 #最大連接配接數
user haproxy #運作使用者
group haproxy #所屬組
daemon #讓haproxy以守護程序的方式工作
mode http #實作http的七層協定
log global #日志定義,沿用global的日志檔案
option httplog #啟用日志記錄http請求
option dontlognull#日志将不會記錄空連接配接
option http-server-close #強制短連接配接
option forwardfor except 127.0.0.0/8 #添加xforward日志标記
option redispatch #出錯時重新配置設定
retries 3 #重試次數
timeout http-request 10s #請求逾時時間
timeout queue 1m #隊列逾時
timeout connect 10s #連接配接逾時
timeout client 1m #用戶端逾時
timeout server 1m #服務端逾時
timeout http-keep-alive 10s #持久連接配接
timeout check 10s #檢查逾時
maxconn 3000 #最大連接配接
listen stats #定義一個統計報告服務
mode http #基于http服務
bind 0.0.0.0:1080 #1080端口的全局監聽
stats enable #開啟統計報告服務
stats hide-version #隐藏統計報告版本資訊
stats uri /haproxyadmin #統計報告通路url (假若想通路監控界面:配置stats uri /haproxy項,重新開機服務:通路位址為:本機IP位址:PORT或URL)
stats realm Haproxy\ Statistics #頁面登陸資訊
stats auth admin:admin #驗證賬号資訊
stats admin if TRUE #驗證模式
frontend web #定義一系列監聽套接字
bind *:80
#acl url_static path_beg -i /static /images /javascript /stylesheets
#acl url_static path_end -i .jpg .gif .png .css .js
#use_backend static if url_static
default_backend lnmpserver
backend lnmpserver
balance roundrobin
option httpchk /index.php 檢查頁面
server lnmpserver1 192.168.159.120:80 check inter 3000 rise 3 fall 3
server lnmpserver2 192.168.159.121:80 check inter 3000 rise 3 fall 3
啟動服務:systemctl start haproxy
netstat -nult 出現1080端口
開啟轉發 echo 1 > /proc/sys/net/ipv4/ip_forward
3、在haproxy-backup上操作:
修改/etc/keepalived/keepalived.conf配置檔案内容
state BACKUP
priority 88
stats uri /haproxyadmin #統計報告通路url
netstat -nult 出現1080端口和80端口
4、測試
測試keepalived高可用:當主伺服器正常工作時,VIP在主伺服器上,當關閉主伺服器的keepalived服務,VIP會漂移到從伺服器上,而且網站照常可以通路。(關閉主伺服器後IP漂移,可檢視ip add)
通路:http://172.17.253.115:1080/haproxyadmin
本文轉自 優果馥思 51CTO部落格,原文連結:http://blog.51cto.com/youguofusi/2046643