新聞中心
HAProxy提供高可用性、負(fù)載均衡以及基于TCP和HTTP應(yīng)用的代理,它是免費(fèi)、開源、快速并且可靠的一種解決方案。

haproxy能夠?qū)崿F(xiàn)的功能
4層負(fù)載均衡,透明代理,7層負(fù)載均衡(會(huì)話保持,動(dòng)靜分離,多種輪詢算法)
安裝haproxy
centos7 自帶HA-Proxy version 1.5
yum update -y && yum install epel* -y && yum update -y && yum install haproxy -y
配置使其能夠進(jìn)行轉(zhuǎn)發(fā)(haproxy是基于nat模式的負(fù)載均衡需要打開系統(tǒng)的轉(zhuǎn)發(fā)功能)
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p #刷新配置
編輯haproxy的配置
vim /etc/haproxy/haproxy.conf,待會(huì)兒將詳細(xì)介紹各種參數(shù),現(xiàn)完成以下案例
1:利用tcp模式,實(shí)現(xiàn)ssl的代理與負(fù)載均衡
2:利用http模式,實(shí)現(xiàn)簡單的web負(fù)載均衡,(后面會(huì)介紹利用frontend,backend實(shí)現(xiàn)負(fù)載的負(fù)載均衡,比如動(dòng)靜分離)
3:利用listen模塊,實(shí)現(xiàn)配置整體監(jiān)控頁面
配置文件haproxy.conf的內(nèi)容
#################################
global
maxconn 20480 #默認(rèn)最大連接數(shù)
log 127.0.0.1 local3 notice
chroot /var/lib/haproxy #注意,這里的路徑與1.4,1.3版本的路徑不太一樣
user haproxy
group haproxy
daemon #以后臺(tái)形式運(yùn)行haproxy
nbproc 1 #進(jìn)程數(shù)量(可以設(shè)置多個(gè)進(jìn)程提高性能)
pidfile /var/run/haproxy.pid #haproxy的pid存放路徑,啟動(dòng)進(jìn)程的用戶必須有權(quán)限訪問此文件
ulimit-n 65535 #ulimit的數(shù)量限制
defaults
log global
mode http #所處理的類別 (#7層 http;4層tcp )
maxconn 20480 #最大連接數(shù)
option httplog #日志類別http日志格式
option httpclose #每次請(qǐng)求完畢后主動(dòng)關(guān)閉http通道
option dontlognull #不記錄健康檢查的日志信息
option forwardfor #如果后端服務(wù)器需要獲得客戶端真實(shí)ip需要配置的參數(shù),可以從Http Header中獲得客戶端ip
option redispatch #當(dāng)serverid對(duì)應(yīng)的服務(wù)器掛掉后,強(qiáng)制定向到其他健康服務(wù)器
#當(dāng)使用了cookie時(shí),haproxy將會(huì)將其請(qǐng)求的后端服務(wù)器的serverID插入到cookie中,以保證會(huì)話的SESSION持久性;而此時(shí),如果后端的服務(wù)器宕掉了,但是客戶端的cookie是不會(huì)刷新的,如果設(shè)置此參數(shù),將會(huì)將客戶的請(qǐng)求強(qiáng)制定向到另外一個(gè)后端server上,以保證服務(wù)的正常。
option abortonclose #當(dāng)服務(wù)器負(fù)載很高的時(shí)候,自動(dòng)結(jié)束掉當(dāng)前隊(duì)列處理比較久的連接
stats refresh 30 #統(tǒng)計(jì)頁面刷新間隔
retries 3 #3次連接失敗就認(rèn)為服務(wù)不可用,也可以通過后面設(shè)置
balance roundrobin #默認(rèn)的負(fù)載均衡的方式,輪詢方式
#balance source #默認(rèn)的負(fù)載均衡的方式,類似nginx的ip_hash
#balance leastconn #默認(rèn)的負(fù)載均衡的方式,最小連接
timeout connect 10s #連接超時(shí),注意這里的關(guān)鍵詞與1.3,1.4版本不一樣
timeout client 1m #客戶端超時(shí)
timeout server 1m #服務(wù)器超時(shí)
timeout http-keep-alive 10s
timeout check 10s #心跳檢測超時(shí)
listen jiankong *:80 #利用listen模塊,實(shí)現(xiàn)配置整體監(jiān)控頁面
description web-jiqun
mode http #http的7層模式
log 127.0.0.1 local3 err #錯(cuò)誤日志記錄
stats refresh 5s #每隔5秒自動(dòng)刷新監(jiān)控頁面
stats uri /admin #監(jiān)控頁面的url
stats realm itnihao\ itnihao #監(jiān)控頁面的提示信息
stats auth admin:admin #監(jiān)控頁面的用戶和密碼admin,可以設(shè)置多個(gè)用戶名
stats auth admin1:admin1 #監(jiān)控頁面的用戶和密碼admin1
stats hide-version #隱藏統(tǒng)計(jì)頁面上的HAproxy版本信息
stats admin if TRUE #手工啟用/禁用,后端服務(wù)器(haproxy-1.4.9以后版本)
########HAProxy的日志記錄內(nèi)容設(shè)置##########
capture request header Host len 40
capture request header Content-Length len 10
capture request header Referer len 200
capture response header Server len 40
capture response header Content-Length len 10
capture response header Cache-Control len 8
listen web *:100 #利用http模式,實(shí)現(xiàn)簡單的web負(fù)載均衡
description web
mode http
balance roundrobin
server web1 192.168.10.188:80 check inter 1500 rise 3 fall 3 weight 1
server web2 192.168.10.153:80 check inter 1500 rise 3 fall 3 weight 1
listen ssl *:200 #利用tcp模式,實(shí)現(xiàn)ssl的代理與負(fù)載均衡
description ssl-web
mode tcp
balance roundrobin
server web1 192.168.10.188:22
server web2 192.168.10.153:22
**********************************
為haproxy配置log,實(shí)現(xiàn)記錄日志的功能
vim /etc/rsyslog.conf #在這個(gè)文件里追加一行
local3.* /var/log/haproxy.log
重啟rsyslog服務(wù)
systemctl restart rsyslog
haproxy -f /etc/haproxy/haproxy.cfg -c #檢查指定配置是否正確
haproxy -f /etc/haproxy/haproxy.cfg -D #指定配置文件啟動(dòng)
在啟動(dòng)haproxy后,查看是否有/var/log/haproxy.log這個(gè)文件,若是沒有,可以考慮禁止selinux
安裝keepalived
keepalived不僅可以實(shí)現(xiàn)高可用(控制vip的漂移),還能實(shí)現(xiàn)負(fù)載均衡,我們這里只需要它實(shí)現(xiàn)vip漂移;keepalived采用官網(wǎng)下載的源碼方式安裝
先安裝依賴
yum install openssl-devel.x86_64 -y
下載地址:http://www.keepalived.org/
./configure #若是這步出錯(cuò),很可能是沒安裝openssl-devel.x86_64
make -j4
make install
(注意:編譯時(shí)盡量別添加prefix參數(shù),因?yàn)閗eepalived啟動(dòng)是默認(rèn)的配置文件路徑是/etc/keepalived/keepalived.conf,若路徑或文件不存在,就無法實(shí)現(xiàn)vip的綁定)
安裝完成后需要把配置文件cp /usr/local/etc/keepalived /etc -r
keepalived實(shí)現(xiàn)HA的原理
利用vrrp協(xié)議;(MASTER一直發(fā)送心跳給BACKUP,backup若收不到心跳則會(huì)接管vip)
keepalived配置文件vim /etc/keepalived/keepalived.conf(主與備)-(注意:主與備節(jié)點(diǎn),只需改動(dòng)state MASTER和priority 100這兩個(gè)地方)
keepalived在啟動(dòng)時(shí)并不檢查語法的正確性,需要特別注意,配置語法別錯(cuò)
#全局定義部分
global_defs {
notification_email {
root@wsfnk.com #設(shè)置郵件報(bào)警地址,可以設(shè)置多個(gè),每行一個(gè)
112323250@qq.com
}
notification_email_from Alexandre.Cassen@firewall.loc #設(shè)置郵件的發(fā)送地址
smtp_server 192.168.200.1 #設(shè)置smtp server
smtp_connect_timeout 30 #設(shè)置連接smtp server的超時(shí)時(shí)間
router_id LVS_DEVEL #表示運(yùn)行keepalived服務(wù)器的一個(gè)標(biāo)示,發(fā)送郵件時(shí)顯示在郵件主題中的信息
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_http_port { #定義一個(gè)檢查haproxy的腳本
script "/root/check_haproxy.sh"
interval 2
weight 2
}
#vrrp實(shí)例定義部分
vrrp_instance VI_1 {
state MASTER #指定角色為主MASTER,備為BACKUP
interface eth0 #指定HA監(jiān)測網(wǎng)絡(luò)的接口,注意網(wǎng)絡(luò)設(shè)備的名字,要與系統(tǒng)一致
virtual_router_id 51 #虛擬路由標(biāo)示,這個(gè)標(biāo)示是一個(gè)數(shù)字,同一個(gè)vrrp實(shí)例使用唯一的標(biāo)示
priority 100 #主權(quán)值必須設(shè)得比 back 高,數(shù)字越大越高
advert_int 1 #設(shè)定keepalived-master與備節(jié)點(diǎn)的心跳間隔時(shí)間,單位是秒
authentication { #設(shè)置驗(yàn)證類型和密碼
auth_type PASS #設(shè)置驗(yàn)證類型,由PASS與HA兩種
auth_pass 1111 #設(shè)置驗(yàn)證密碼,同一vrrp實(shí)例下,keepalived-master與backup節(jié)點(diǎn)必須使用相同的密碼才能正常通信
}
track_script { #調(diào)用上面定義檢查haproxy的腳本
chk_http_port
}
virtual_ipaddress { #設(shè)置虛擬ip,可以設(shè)置多個(gè)虛擬的vip,每行一個(gè)
192.168.200.16
192.168.200.18
}
}
******************************************
keepalived控制haproxy的啟動(dòng)
下面腳本的意思是,當(dāng)主備啟動(dòng)keepalived時(shí),會(huì)分別啟動(dòng)haproxy,只要keepalived不停,haproxy程序就殺不死,用vip承載業(yè)務(wù),兩邊haproxy都啟動(dòng)沒有影響,只需要做好監(jiān)控,當(dāng)然完善一下也可以
cd /root
vim check_haproxy.sh
#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -D
fi
sleep 2
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
keepalived stop
fi
chmod +x check_haproxy.sh
啟動(dòng)keepalived
keepalived start
***************************************
stop若要深入研究haproxy與keepalived,下面是他們的配置示例
以下是haproxy的配置講解,主要講listen,acl,frontend,backend
##################全局配置信息#####################
#######參數(shù)是進(jìn)程級(jí)的,通常和操作系統(tǒng)(OS)相關(guān)#########
global
###################默認(rèn)的全局設(shè)置###################
##這些參數(shù)可以被利用配置到frontend,backend,listen組件##
defaults
##################網(wǎng)站監(jiān)測listen配置################
#########此用法主要是監(jiān)控haproxy后端服務(wù)器的監(jiān)控狀態(tài)#######
listen site_status
bind 0.0.0.0:1081 #監(jiān)聽端口
mode http #http的7層模式
log 127.0.0.1 local3 err #[err warning info debug]
monitor-uri /site_status #網(wǎng)站健康檢測URL,用來檢測HAProxy管理的網(wǎng)站是否可以用,正常返回200,不正常返回503
acl site_dead nbsrv(server_web) lt 2 #定義網(wǎng)站down時(shí)的策略當(dāng)掛在負(fù)載均衡上的指定backend的中有效機(jī)器數(shù)小于1臺(tái)時(shí)返回true
acl site_dead nbsrv(server_blog) lt 2
acl site_dead nbsrv(server_bbs) lt 2
monitor fail if site_dead #當(dāng)滿足策略的時(shí)候返回503,網(wǎng)上文檔說的是500,實(shí)際測試為503
monitor-net 192.168.16.2/32 #來自192.168.16.2的日志信息不會(huì)被記錄和轉(zhuǎn)發(fā)
monitor-net 192.168.16.3/32
########frontend配置############
#####注意,frontend配置里面可以定義多個(gè)acl進(jìn)行匹配操作########
frontend http_80_in
bind 0.0.0.0:80 #監(jiān)聽端口,即haproxy提供web服務(wù)的端口,和lvs的vip端口類似
mode http #http的7層模式
log global #應(yīng)用全局的日志配置
option httplog #啟用http的log
option httpclose #每次請(qǐng)求完畢后主動(dòng)關(guān)閉http通道,HA-Proxy不支持keep-alive模式
option forwardfor #如果后端服務(wù)器需要獲得客戶端的真實(shí)IP需要配置次參數(shù),將可以從Http Header中獲得客戶端IP
########acl策略配置#############
acl itnihao_web hdr_reg(host) -i ^(www.itnihao.cn|ww1.itnihao.cn)$
#如果請(qǐng)求的域名滿足正則表達(dá)式中的2個(gè)域名返回true -i是忽略大小寫
acl itnihao_blog hdr_dom(host) -i blog.itnihao.cn
#如果請(qǐng)求的域名滿足www.itnihao.cn返回true -i是忽略大小寫
#acl itnihao hdr(host) -i itnihao.cn
#如果請(qǐng)求的域名滿足itnihao.cn返回true -i是忽略大小寫
#acl file_req url_sub -i killall=
#在請(qǐng)求url中包含killall=,則此控制策略返回true,否則為false
#acl dir_req url_dir -i allow
#在請(qǐng)求url中存在allow作為部分地址路徑,則此控制策略返回true,否則返回false
#acl missing_cl hdr_cnt(Content-length) eq 0
#當(dāng)請(qǐng)求的header中Content-length等于0時(shí)返回true
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 app
########acl策略匹配相應(yīng)#############
#block if missing_cl
#當(dāng)請(qǐng)求中header中Content-length等于0阻止請(qǐng)求返回403
#block if !file_req || dir_req
#block表示阻止請(qǐng)求,返回403錯(cuò)誤,當(dāng)前表示如果不滿足策略file_req,或者滿足策略dir_req,則阻止請(qǐng)求
use_backend server_web if itnihao_web
#當(dāng)滿足itnihao_web的策略時(shí)使用server_web的backend
use_backend server_blog if itnihao_blog
#當(dāng)滿足itnihao_blog的策略時(shí)使用server_blog的backend
#redirect prefix http://blog.itniaho.cn code 301 if itnihao
#當(dāng)訪問itnihao.cn的時(shí)候,用http的301挑轉(zhuǎn)到http://192.168.16.3
default_backend server_bbs
#以上都不滿足的時(shí)候使用默認(rèn)server_bbs的backend
##########backend的設(shè)置##############
#下面我將設(shè)置三組服務(wù)器 server_web,server_blog,server_bbs
#############backend server_web##############
backend server_web
mode http #http的7層模式
balance roundrobin #負(fù)載均衡的方式,roundrobin平均方式
cookie SERVERID #允許插入serverid到cookie中,serverid后面可以定義
option httpchk GET /index.html #心跳檢測的文件
server web1 192.168.16.2:80 cookie web1 check inter 1500 rise 3 fall 3 weight 1
#服務(wù)器定義,cookie 1表示serverid為web1,check inter 1500是檢測心跳頻率rise 3是3次正確認(rèn)為服務(wù)器可用,
#fall 3是3次失敗認(rèn)為服務(wù)器不可用,weight代表權(quán)重
server web2 192.168.16.3:80 cookie web2 check inter 1500 rise 3 fall 3 weight 2
#服務(wù)器定義,cookie 1表示serverid為web2,check inter 1500是檢測心跳頻率rise 3是3次正確認(rèn)為服務(wù)器可用,
#fall 3是3次失敗認(rèn)為服務(wù)器不可用,weight代表權(quán)重
##############backend server_blog##############
backend server_blog
mode http #http的7層模式
balance roundrobin #負(fù)載均衡的方式,roundrobin平均方式
cookie SERVERID #允許插入serverid到cookie中,serverid后面可以定義
option httpchk GET /index.html #心跳檢測的文件
server blog1 192.168.16.2:80 cookie blog1 check inter 1500 rise 3 fall 3 weight 1
#服務(wù)器定義,cookie 1表示serverid為blog1,check inter 1500是檢測心跳頻率rise 3是3次正確認(rèn)為服務(wù)器可用,fall 3是3次失敗認(rèn)為服務(wù)器不可用,weight代表權(quán)重
server blog2 192.168.16.3:80 cookie blog2 check inter 1500 rise 3 fall 3 weight 2
#服務(wù)器定義,cookie 1表示serverid為blog2,check inter 1500是檢測心跳頻率rise 3是3次正確認(rèn)為服務(wù)器可用,fall 3是3次失敗認(rèn)為服務(wù)器不可用,weight代表權(quán)重
###########backend server_bbs#################
backend server_bbs
mode http #http的7層模式
balance roundrobin #負(fù)載均衡的方式,roundrobin平均方式
cookie SERVERID #允許插入serverid到cookie中,serverid后面可以定義
option httpchk GET /index.html #心跳檢測的文件
server bbs1 192.168.16.2:80 cookie bbs1 check inter 1500 rise 3 fall 3 weight 1
#服務(wù)器定義,cookie 1表示serverid為bbs1,check inter 1500是檢測心跳頻率rise 3是3次正確認(rèn)為服務(wù)器可用,fall 3是3次失敗認(rèn)為服務(wù)器不可用,weight代表權(quán)重
server bbs2 192.168.16.3:80 cookie bbs2 check inter 1500 rise 3 fall 3 weight 2
#服務(wù)器定義,cookie 1表示serverid為bbs2,check inter 1500是檢測心跳頻率rise 3是3次正確認(rèn)為服務(wù)器可用,fall 3是3次失敗認(rèn)為服務(wù)器不可用,weight代表權(quán)重
***************************************
下面是keepalived的詳細(xì)參數(shù)介紹
#全局定義部分
global_defs {
notification_email {
root@wsfnk.com #設(shè)置郵件報(bào)警地址,可以設(shè)置多個(gè),每行一個(gè)
1123323230@qq.com
}
notification_email_from Alexandre.Cassen@firewall.loc #設(shè)置郵件的發(fā)送地址
smtp_server 192.168.200.1 #設(shè)置smtp server
smtp_connect_timeout 30 #設(shè)置連接smtp server的超時(shí)時(shí)間
router_id LVS_DEVEL #表示運(yùn)行keepalived服務(wù)器的一個(gè)標(biāo)示,發(fā)送郵件時(shí)顯示在郵件主題中的信息
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_http_port { #定義一個(gè)檢查haproxy的腳本
script "/root/check_haproxy.sh"
interval 2
weight 2
}
#vrrp實(shí)例定義部分
vrrp_instance VI_1 {
state MASTER #指定角色為主MASTER,備為BACKUP
interface eth0 #指定HA監(jiān)測網(wǎng)絡(luò)的接口,注意網(wǎng)絡(luò)設(shè)備的名字,要與系統(tǒng)一致
virtual_router_id 51 #虛擬路由標(biāo)示,這個(gè)標(biāo)示是一個(gè)數(shù)字,同一個(gè)vrrp實(shí)例使用唯一的標(biāo)示
priority 100 #主權(quán)值必須設(shè)得比 back 高,數(shù)字越大越高
advert_int 1 #設(shè)定keepalived-master與備節(jié)點(diǎn)的心跳間隔時(shí)間,單位是秒
authentication { #設(shè)置驗(yàn)證類型和密碼
auth_type PASS #設(shè)置驗(yàn)證類型,由PASS與HA兩種
auth_pass 1111 #設(shè)置驗(yàn)證密碼,同一vrrp實(shí)例下,keepalived-master與backup節(jié)點(diǎn)必須使用相同的密碼才能正常通信
}
track_script { #調(diào)用上面定義檢查haproxy的腳本
chk_http_port
}
virtual_ipaddress { #設(shè)置虛擬ip,可以設(shè)置多個(gè)虛擬的vip,每行一個(gè)
192.168.200.16
192.168.200.18
}
}
#虛擬服務(wù)器定義部分
virtual_server 192.168.200.100 443 { #設(shè)置虛擬服務(wù)器,需要指定虛擬ip,端口,用空格分開
delay_loop 6 #設(shè)置運(yùn)行情況檢查時(shí)間間隔,單位是秒
lb_algo rr #設(shè)置負(fù)載調(diào)度算法,rr是輪詢算法
lb_kind NAT #設(shè)置lvs實(shí)現(xiàn)負(fù)載均衡的機(jī)制,有NAT,TUN,DR
persistence_timeout 50 #會(huì)話保持時(shí)間,單位是秒,這個(gè)選項(xiàng)對(duì)動(dòng)態(tài)網(wǎng)頁非常有用,為集群中的session共享提供了一個(gè)很好的解決方案
#有了這個(gè)會(huì)話保持功能,用戶的請(qǐng)求會(huì)被一直分發(fā)到一臺(tái)服務(wù)器上,直到超過這個(gè)會(huì)話保持時(shí)間,需要注意的是
#這個(gè)會(huì)話保持時(shí)間是最大無響應(yīng)超時(shí)時(shí)間,也就是說,用戶在操作動(dòng)態(tài)頁面時(shí),如果在50秒內(nèi)沒有執(zhí)行任何操作
#那么就會(huì)認(rèn)為超時(shí),以后的操作會(huì)被分發(fā)到別的節(jié)點(diǎn)上,以此類推
protocol TCP #指定轉(zhuǎn)發(fā)的協(xié)議類型,有TCP,UDP兩種
real_server 192.168.201.100 443 { #配置服務(wù)節(jié)點(diǎn)1,需要指定real_server的真實(shí)ip,端口
weight 1 #配置權(quán)重,數(shù)字越大,權(quán)重越高,性能好的服務(wù)器可以設(shè)大些
SSL_GET {
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3 #存活檢測,表示3秒內(nèi)無響應(yīng)超時(shí),單位是秒
nb_get_retry 3 #表示檢測次數(shù)
delay_before_retry 3 #表示檢測的時(shí)間間隔
}
}
}
virtual_server 10.10.10.3 1358 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.200.4 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.200.5 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
名稱欄目:通過haproxy+keepalived實(shí)現(xiàn)高可用配置
文章URL:http://m.5511xx.com/article/dhjsepo.html


咨詢
建站咨詢
