HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速而且可靠的一種解決方案。HAProxy特別適用於那些負載特大的web站點,這些站點一般又須要會話保持或七層處理。HAProxy運行在當前的硬件上,徹底能夠支持數以萬計的併發鏈接。而且它的運行模式使得它能夠很簡單安全的整合進您當前的架構中,同時能夠保護你的web服務器不被暴露到網絡上.前端
haproxy 配置中分紅五部份內容,分別以下:node
一、global:參數是進程級的,一般是和操做系統相關。這些參數通常只設置一次,若是配置無誤,就不須要再次進行修改web
二、defaults:配置默認參數,這些參數能夠被用到frontend,backend,Listen組件算法
三、frontend:接收請求的前端虛擬節點,Frontend能夠更加規則直接指定具體使用後端的backendvim
四、backend:後端服務集羣的配置,是真實服務器,一個Backend對應一個或者多個實體服務器後端
五、Listen Fronted和backend的組合體安全
HAProxy負載均衡策略很是多,HAProxy的負載均衡算法如今具體有以下8種:bash
① roundrobin,表示簡單的輪詢,這個很少說,這個是負載均衡基本都具有的;服務器
② static-rr,表示根據權重,建議關注;cookie
③ leastconn,表示最少鏈接者先處理,建議關注;
④ source,表示根據請求源IP,這個跟Nginx的IP_hash機制相似,咱們用其做爲解決session問題的一種方法,建議關注;
⑤ ri,表示根據請求的URI;
⑥ rl_param,表示根據請求的URl參數’balance url_param’ requires an URL parameter name;
⑦ hdr(name),表示根據HTTP請求頭來鎖定每一次HTTP請求;
⑧ rdp-cookie(name),表示根據據cookie(name)來鎖定並哈希每一次TCP請求。
192.168.1.90
+-----------VIP----------+
| |
| |
Master Backup
192.168.0.110 192.168.0.111
+----------+ +----------+
| HAProxy | ß------à | HAProxy |
|keepalived| |keepalived|
+----------+ +----------+
|
v
+-----------+---------+
| | |
| | |
v v v
+--------+ +-------+ +-------+
| Docker | | Docker | | Docker |
| WEB1 | | WEB2 | | WEB3 |
+--------+ +-------+ +-------+
安裝HAProxy,KeepAlived
add-apt-repository ppa:vbernat/haproxy-1.5
apt-get update
apt-get install haproxy
修改配置
sudo vim /etc/haproxy/haproxy.cfg
global
#log /dev/log local0
#log /dev/log local1 notice #定義haproxy 日誌級別[error warringinfo debug]
log 127.0.0.1 local2 #日誌輸出配置,全部日誌都記錄在本機,經過local2輸出
chroot /var/lib/haproxy #chroot運行路徑
nbproc 1 #設置進程數量
stats socket /run/haproxy/admin.sock mode 660 level admin #定義統計信息保存位置
stats timeout 30s #監控頁面超時時間
user haproxy #運行haproxy 用戶
group haproxy #運行haproxy 用戶組
daemon #之後臺形式運行harpoxy
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
defaults
log global #設置日誌繼承全局配置段的設置
mode http #設置haproxy的運行模式,有三種{http|tcp|health},tcp是4層,http是7層,health只會返回OK
option abortonclose
option http-server-close #打開http協議中服務器端關閉功能,使得支持長鏈接,使得會話能夠被重用,使得每個日誌記錄都會被記錄。
option httplog #表示開始打開記錄http請求的日誌功能
option dontlognull #若是產生了一個空鏈接,那這個空鏈接的日誌將不會記錄。
timeout connect 5000 #haproxy與後端服務器鏈接超時時間,若是在同一個局域網可設置較小的時間。
timeout client 50000 #定義客戶端與haproxy鏈接後,數據傳輸完畢,再也不有數據傳輸,即非活動鏈接的超時時間
timeout server 50000 #定義haproxy與上游服務器非活動鏈接的超時時間。
listen admin_stats #frontend和backend的組合體,監控組的名稱,按需自定義名稱
bind 0.0.0.0:8080 #配置監聽端口
mode http #配置監控運行的模式,在這爲http模式。
option httplog #表示開始打開記錄http請求的日誌功能
maxconn 10 #最大鏈接數
stats enable #開啓統計頁面
stats hide-version #配置隱藏統計頁面上的HAproxy版本信息。
stats refresh 30s #配置每隔30秒自動刷新監控頁面。
stats show-node #
stats auth admin:admin #設置監控頁面的用戶和密碼:admin,能夠設置多個用戶名
stats uri /haproxy #統計頁面url
stats admin if TRUE #設置手工啓動/禁用,後端服務器
#設置錯誤頁面
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
frontend www-frontend #定義一個名爲www-frontend的frontend。
Bind *:80 #定義haproxy前端部分監聽的端口。
reqadd X-Forwarded-Proto:\ http #
default_backend http-backend #定義默認backend
option forwardfor #使後端server獲取到客戶端的真實IP
acl http hdr(host) -i www.aaa.com #根據域名定義acl
acl web hdr(host) -i www.bbb.com
use_backend http-backend if http #定義訪問www.aaa.com的到http-backend
use_backend web-backend if web #定義訪問www.bbb.com的到web-backend
backend http-backend
balance roundrobin #定義負載均衡方式,roundrobin輪詢方式
cookie SERVERID insert indirect nocache
server web1 192.168.0.110:8001 cookie A check inter 1500 weight 1 rise 3 fall 3
server web2 192.168.0.110:8002 cookie B check inter 1500 weight 2 rise 3 fall 3
server web3 192.168.0.110:8003 cookie C check inter 1500 weight 3 rise 3 fall 3
#chookie指定serverID ,check inter指定檢測心跳頻率,rise指定正確次數,fall指定失敗次數,weight表明權重
backend web-backend
balance roundrobin #定義負載均衡方式,roundrobin輪詢方式
cookie SERVERID insert indirect nocache
server www1 192.168.0.111:8010 cookie A check inter 1500 weight 1 rise 3 fall 3
server www2 192.168.0.111:8020 cookie B check inter 1500 weight 2 rise 3 fall 3
listen tcptest #設置Frontend和Backend的組合體,監控組的名稱,按須要自定義名稱
bind 0.0.0.0:8009 #設置監聽端口
mode tcp #採用tcp
option tcplog #採用tcp日誌格式
balance source #定義負載均衡方式
server s1 192.168.0.111:8010 weight 1 check inter 1500 rise 3 fall 3
server s2 192.168.0.111:8020 weight 2 check inter 1500 rise 3 fall 3
日誌配置
sudo vi /etc/rsyslog.d/50-default.conf
增長如下一行
local2.* /var/log/haproxy.log
sudo vi /etc/rsyslog.conf
找到下面兩行,把註釋去掉
#$ModLoad imudp
#$UDPServerRun 514
重啓rsyslog服務
sudo service rsyslog restart
重啓haproxy服務
Sudo service haproxy restart
配置KeepAlived
Sudo vim /etc/keepalived/keepalived.conf ! Configuretion File for keepalived
globel_defs{
notification_email {
yqb813@gmail..com #指定keepalived在切換時須要發送到的email對象,一行一個
}
notification_email_from root@localhost ##指定發件人
smtp_server 127.0.0.1 #指定SMTP服務器地址
smtp_connect_timeout 30 #指定SMTP鏈接超時時間
router_id HAProxy_DEVEL #設置lvs的id,在一個網絡內應該是惟一的
}
#監測haproxy進程狀態,每2秒執行一次
vrrp_script chk_haproxy {
script "/usr/local/keepalived/chk_haproxy.sh"
interval 2
weight 2
}
vrrp_instance VI_1{
state MASTER #指定keepalived的角色,MASTER爲主,BACKUP爲備
interface eth0 #設置實例綁定到那個網卡
virtual_router_id 200 #VRID標記(0~255),主備要保持相同
priority 150 #優先級,MASTER要高於BACKUP的優先級(至少50)
advert_int 3 #檢查間隔時間,默認1秒
authentication {
auth_type PASS #指定要使用那一種認證(PASS|AH)
auth_pass 111111 #指定要使用的密碼字符串
}
track_script {
chk_haproxy #監測haproxy進程狀態
}
virtual_ipaddress {
192.168.0.90 dev eth0 #定義虛擬IP(VIP),可多設,每行-個
}
}
/usr/local/keepalived/chk_haproxy.sh
#!/bin/bash
#
# description:
# 定時查看haproxy是否存在,若是不存在則啓動haproxy,
# 若是啓動失敗,則中止keepalived
#
status=$(ps aux|grep haproxy | grep -v grep | grep -v bash | wc -l)
if [ "${status}" = "0" ]; then
/etc/init.d/haproxy restart
status2=$(ps aux|grep haproxy | grep -v grep | grep -v bash |wc -l)
if [ "${status2}" = "0" ]; then
/etc/init.d/keepalived stop
fi
fi
高可用測試
在master停掉keepalived,查看系統日誌
發現master釋放了vip
在backup查看系統日誌,發現backup已經進入master 角色,並綁定vip
在master上啓動keepalived,查看系統日誌,發現從新得到master角色,並綁定vip
在backup上查看系統日誌,發現從新回到backup角色,並釋放vip