微服務(wù)部署—HAProxy+Keepalived高可用負(fù)載均衡集群配置
HAProxy是一種免費、快速、可靠的反向代理,為基于TCP和HTTP的應(yīng)用程序提供高可用性、負(fù)載平衡和代理,它非常適合應(yīng)用在高并發(fā)大流量的網(wǎng)站上。這些年來,HAProxy已成為事實上的標(biāo)準(zhǔn)開源負(fù)載均衡,目前HAProxy已與大多數(shù)主流Linux發(fā)行版一起提供,很多云平臺也默認(rèn)集成了HAProxy。
??LVS、Nginx、HAProxy是常用的三款負(fù)載均衡,網(wǎng)上有很多三種負(fù)載均衡詳細(xì)的對比文章,下面一句話總結(jié)LVS、Nginx、HAProxy的優(yōu)缺點:
- LVS:工作在OSI七層協(xié)議模型的第四層傳輸層上,簡單、穩(wěn)定、性能最強,但可配置性遜于其他兩種,不支持正則處理,不能做動靜分離,不支持URL和目錄轉(zhuǎn)發(fā)。
- HAProxy:工作在OSI七層協(xié)議模型的第四層傳輸層和第七層應(yīng)用層上,性能強但不如Lvs,但是配置比Lvs靈活,支持URL和目錄轉(zhuǎn)發(fā),但不能作為web服務(wù)器。
- Nginx:工作在OSI七層協(xié)議模型的第七層應(yīng)用層上,三種負(fù)載均衡軟件Nginx配置最為簡單靈活,但性能最差,可作為web服務(wù)器使用。
??綜合各方面的優(yōu)缺點考慮,我們選擇使用HAproxy+Keepalived作為負(fù)載均衡配置,Nginx作為前端靜態(tài)頁面Web服務(wù)器的架構(gòu)使用。HAProxy的偶數(shù)發(fā)行版本為穩(wěn)定且長期支持版本,追求系統(tǒng)極端穩(wěn)定性的用戶可以選擇這個版本,目前(2023年08月09日)最新發(fā)布版本為 HAProxy 2.8.2 release,我們將在環(huán)境上部署并配置這個版本。
一、 HAProxy+Keepalived高可用負(fù)載均衡集群安裝配置
通常我們把Keepalived和HAProxy一起使用,來實現(xiàn)Web服務(wù)器的高可用性和負(fù)載平衡。Keepalived是一個用C編寫的路由軟件,它使用虛擬路由冗余協(xié)議(VRRP)和健康檢查機(jī)制的組合來確定服務(wù)器的狀態(tài),并在需要時觸發(fā)故障轉(zhuǎn)移。VRRP確保只有一個服務(wù)器在任何給定時間內(nèi) actively 響應(yīng)請求,而健康檢查則監(jiān)視服務(wù)器的健康狀態(tài),并在主服務(wù)器失敗時觸發(fā)選舉過程。
- Keepalived的作用:Keepalived負(fù)責(zé)管理虛擬IP(VIP)并確保高可用性。它監(jiān)控服務(wù)器的健康狀況,如果主服務(wù)器(主服務(wù)器)出現(xiàn)故障或無響應(yīng),Keepalive會觸發(fā)到備份服務(wù)器(從服務(wù)器)的故障轉(zhuǎn)移。在故障轉(zhuǎn)移過程中,Keepalived會更新VIP以指向備份服務(wù)器,從而無縫地將流量重定向到備份服務(wù)器。
- HAProxy的作用:HAProxy是一款功能強大且可靠的負(fù)載均衡器,可跨多個服務(wù)器分配傳入流量。它充當(dāng)反向代理,接收來自客戶端的請求并將其轉(zhuǎn)發(fā)到適當(dāng)?shù)暮蠖朔?wù)器。HAProxy的主要功能是平衡服務(wù)器之間的負(fù)載,確保最佳性能和可用性。
1、集群服務(wù)器規(guī)劃配置
- VIP(虛擬IP):192.168.1.200
- 主節(jié)點服務(wù)器:HAProxy-01,192.168.1.210
- 備節(jié)點服務(wù)器:HAProxy-02,192.168.1.195
關(guān)閉SELinux,盡管SELinux可以增強生產(chǎn)服務(wù)器的安全性,它是為每個軟件配置控制權(quán)限,使用它的前提是必須詳細(xì)了解每個需要部署的軟件并為它配置。很多國內(nèi)云服務(wù)器默認(rèn)安裝的Linux環(huán)境也是禁用SELinux,否則在安裝部署時會有很多問題。
# 首先臨時關(guān)閉SELinux
setenforce 0
# 修改配置文件,永久關(guān)閉SELinux
vi /etc/sysconfig/selinux
# 設(shè)置
SELINUX=disabled
2、Keepalived安裝配置
VIP(虛擬IP)有兩種實現(xiàn)方式:一種是直接配置Linux服務(wù)器網(wǎng)絡(luò),還有一種是使用Keepalived,我們這里直接使用Keepalived的方式來實現(xiàn)。在實際部署中發(fā)現(xiàn),如果多網(wǎng)卡時,不同的虛擬IP綁定在同一網(wǎng)卡,在虛擬IP切換時會發(fā)生無法訪問的情況,所以盡量將虛擬IP設(shè)置為統(tǒng)一網(wǎng)段綁定在同一網(wǎng)卡。
(1)Keepalived軟件安裝步驟
- 查看 keepalived 軟件包
yum list keepalived
- (二選一)使用 yum 方式安裝軟件包,因為yum 源的原因,無法安裝最新穩(wěn)定版本,根據(jù)自己需要進(jìn)行選擇。
yum install -y keepalived
- (二選一)使用源碼包安裝,因為yum源的原因,默認(rèn)安裝的版本是1.3.5,而最新版是2.2.8,我們?yōu)榱耸褂米钚掳?,所以這里使用編譯源碼的方式安裝。
# 安裝編譯源碼所需依賴
yum -y install gcc openssl-devel libnl3-devel ipset-devel iptables-devel libnfnetlink-devel net-snmp-devel glib2-devel
# 下載源碼包
wget https://www.keepalived.org/software/keepalived-2.2.8.tar.gz
# 解壓源碼包
tar zxvf keepalived-2.2.8.tar.gz
# 編譯源碼包
cd keepalived-2.2.8
./configure --prefix=/
make && make install
# 從解壓的源碼包中將開機(jī)啟動文件復(fù)制到/etc/rc.d/init.d/
cp /opt/software/keepalived-2.2.8/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
# 給keepalived賦權(quán)限/etc/init.d/是/etc/rc.d/init.d/的軟鏈接
chmod +x /etc/init.d/keepalived
# 設(shè)置開機(jī)啟動
echo "/etc/init.d/keepalived start" >> /etc/rc.local
(2)安裝郵件通知服務(wù)
在生產(chǎn)環(huán)境中,高可用服務(wù)的狀態(tài)變化需要及時通知系統(tǒng)管理員,以保障管理員及時處理服務(wù)故障,使服務(wù)正常運行。Keepalived提供notification_email、smtp_server等郵件發(fā)送配置,但是它不支持SMTP身份驗證,也不支持SMTP的TLS,它是使用HELO且不使用身份驗證的RFC821實現(xiàn),所以Keepalived沒有配置郵件服務(wù)器用戶名、密碼的方法,導(dǎo)致無法使用外部郵箱服務(wù)器,所以,這里選擇網(wǎng)上大多數(shù)方法,編寫腳本,當(dāng)Keepalived狀態(tài)切換時,調(diào)用Linux系統(tǒng)的mailx(mailx是一個命令行郵件客戶端)進(jìn)行郵件發(fā)送。
- 查看Linux是否已經(jīng)安裝mailx,如果顯示no mailx in…,則表示沒有安裝,可以通過yum命令安裝
[root@localhost /]# which mailx
/usr/bin/which: no mailx in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/java/bin:/root/bin)
- 安裝郵件服務(wù)的yum命令
yum install mailx -y
- 在mail.rc文件中配置郵箱發(fā)送賬號和密碼,有些郵箱的密碼是單獨的授權(quán)碼,這個根據(jù)自己的郵箱來獲取。
vi /etc/mail.rc
# 一下內(nèi)容加在mail.rc文件底部
set from=xxxxxxxxxxx@163.com
set smtp=smtp.163.com
set smtp-auth-user=xxxxxxxx@163.com
set smtp-auth-password=密碼
set smtp-auth=login
set ssl-verify=ignore
- 通過命令行測試是否能夠發(fā)送郵件
echo "虛擬IP發(fā)生浮動,請及時處理。" | mail -s "Keepalived告警郵件" gitegg@gitegg.com
- 編寫郵件發(fā)送腳本keepalived_notify.sh。
vi /etc/keepalived/keepalived_notify.sh
keepalived_notify.sh內(nèi)容如下:
# 填寫一下內(nèi)容
#!/bin/bash
mailto=收件人郵箱1,收件人郵箱2
notify() {
mailsubject="【Keepalived狀態(tài)切換告警郵件】$(hostname) 狀態(tài)切換為 $1"
mailbody="$(date +'%F %T'): Keepalived狀態(tài)發(fā)生切換, $(hostname) 狀態(tài)切換為 $1,請檢查服務(wù)器運行狀態(tài)。"
echo "$mailbody" | mail -s "$mailsubject" $mailto
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac
keepalived_notify.sh賦可執(zhí)行權(quán)限。
chmod +x /etc/keepalived/keepalived_notify.sh
# 測試腳本是否可以發(fā)送
bash /etc/keepalived/keepalived_notify.sh master
- 修改系統(tǒng)hostname,否則使用hostname,無法區(qū)分是哪臺服務(wù)器出了問題,修改/etc/hostname文件即可。
vi /etc/hostname
#修改hostname,注意格式
localhost.ServerA
#立即生效
hostname $(cat /etc/hostname)
(3)Keepalived軟件配置
- 配置防火墻firewalld,使VRRP組播通過防火墻:
net.ipv4.ip_forward = 1 開啟允許數(shù)據(jù)包轉(zhuǎn)發(fā)?? 2. net.ipv4.ip_nonlocal_bind = 1 開啟允許綁定非本機(jī)的IP?? 3. --in-interface后面一定要修改為你自己的網(wǎng)卡。
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
sysctl -p
# 雙網(wǎng)卡,網(wǎng)卡enp6s0f1
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface enp6s0f1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface enp6s0f1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
# 雙網(wǎng)卡,網(wǎng)卡enp6s0f0
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface enp6s0f0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface enp6s0f0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload
配置Keepalived的虛擬IP(VIP),多網(wǎng)卡配置,虛擬一個內(nèi)網(wǎng)VIP,一個外網(wǎng)VIP主節(jié)點服務(wù)器192.168.1.210的keepalived.conf配置。
! Configuration File for keepalived
global_defs {
router_id NODE_MASTER #名稱唯一
vrrp_skip_check_adv_addr # 默認(rèn)是不跳過檢查。檢查收到的VRRP通告中的所有地址可能會比較耗時,設(shè)置此命令的意思是,如果通告與接收的上一個通告來自相同的master路由器,則不執(zhí)行檢查(跳過檢查)。
#vrrp_strict # 嚴(yán)格遵守VRRP協(xié)議
#vrrp_garp_interval 0 #在一個接口發(fā)送的兩個免費ARP之間的延遲。可以精確到毫秒級。默認(rèn)是0.
#vrrp_gna_interval 0 #在一個網(wǎng)卡上每組na消息之間的延遲時間,默認(rèn)為0
script_user root
enable_script_security
max_auto_priority 1
}
vrrp_instance VI_1 {
state MASTER # 設(shè)置初始狀態(tài)均主
interface enp6s0f1 enp6s0f0 # 設(shè)置綁定虛擬IP的網(wǎng)卡,多個網(wǎng)卡可以在后面添加
virtual_router_id 51 # 集群的virtual_router_id值,主備一致
priority 100 # 路由權(quán)重
advert_int 1 #檢查間隔,默認(rèn)1秒
notify_master "/etc/keepalived/keepalived_notify.sh master"
notify_backup "/etc/keepalived/keepalived_notify.sh backup"
notify_fault "/etc/keepalived/keepalived_notify.sh fault"
authentication {
auth_type PASS #認(rèn)證方式
auth_pass 11111111 #認(rèn)證密碼(密碼只識別前8位)
}
virtual_ipaddress {
內(nèi)網(wǎng)虛擬ip dev enp6s0f1 # 內(nèi)網(wǎng)虛擬ip,后面可以加網(wǎng)卡名稱綁定不同網(wǎng)卡
公網(wǎng)虛擬ip dev enp6s0f0 # 公網(wǎng)虛擬ip,后面可以加網(wǎng)卡名稱綁定不同網(wǎng)卡
}
}
備節(jié)點服務(wù)器192.168.1.195的keepalived.conf配置。
! Configuration File for keepalived
global_defs {
router_id NODE_SLAVE #名稱唯一
vrrp_skip_check_adv_addr # 默認(rèn)是不跳過檢查。檢查收到的VRRP通告中的所有地址可能會比較耗時,設(shè)置此命令的意思是,如果通告與接收的上一個通告來自相同的master路由器,則不執(zhí)行檢查(跳過檢查)。
vrrp_strict # 嚴(yán)格遵守VRRP協(xié)議
#vrrp_garp_interval 0 #在一個接口發(fā)送的兩個免費ARP之間的延遲。可以精確到毫秒級。默認(rèn)是0.
#vrrp_gna_interval 0 #在一個網(wǎng)卡上每組na消息之間的延遲時間,默認(rèn)為0
script_user root
enable_script_security
max_auto_priority 1
}
vrrp_instance VI_1 {
state BACKUP # 設(shè)置初始狀態(tài)均備
interface enp6s0f1 # 設(shè)置綁定虛擬IP的網(wǎng)卡
virtual_router_id 51 # 集群的virtual_router_id值,主備一致
priority 100 # 路由權(quán)重
advert_int 1 #檢查間隔,默認(rèn)1秒
notify_master "/etc/keepalived/keepalived_notify.sh master"
notify_backup "/etc/keepalived/keepalived_notify.sh backup"
notify_fault "/etc/keepalived/keepalived_notify.sh fault"
authentication {
auth_type PASS #認(rèn)證方式
auth_pass 11111111 #認(rèn)證密碼(密碼只識別前8位)
}
virtual_ipaddress {
內(nèi)網(wǎng)虛擬ip/24 # 內(nèi)網(wǎng)虛擬ip
公網(wǎng)虛擬ip/24 # 公網(wǎng)虛擬ip
}
}
分別在主備節(jié)點啟動keepalived。
systemctl start keepalived
# 查看啟動狀態(tài)
/etc/init.d/keepalived status
設(shè)置keepalived開機(jī)啟動。
systemctl enable keepalived.service
在主節(jié)點通過ip addr命令驗證,查看虛擬IP192.168.1.200在主節(jié)點。
[root@localhost ~]# ip addr | grep 192.168.1.200
inet 192.168.1.200/24 scope global secondary enp6s0f1
在備節(jié)點通過ip addr命令驗證,查看虛擬IP192.168.1.200不在備節(jié)點。
[root@localhost ~]# ip addr | grep 192.168.1.200
[root@localhost ~]#
通過以上驗證,說明Keepalived虛擬IP配置成功,如果主備同時存在虛擬IP,那么說明沒有配置成功,請檢查防火墻firewall是否配置正確。同時,為了驗證虛擬IP是否會自動漂移,可以使用systemctl stop keepalived 停止主節(jié)點的Keepalived,此時虛擬IP漂移到備節(jié)點。
3、HAProxy安裝配置
HAProxy也有兩種安裝方式,yum和源碼包。同樣,因為yum源的原因,yum方式安裝的不是最新穩(wěn)定版本,所以我們這里選擇采用編譯源碼包的方式安裝。
(1)HAProxy軟件安裝步驟
HAProxy編譯安裝需要用到Lua,所以首先安裝Lua。記住Lua的src路徑/opt/software/lua-5.4.6/src,后續(xù)HAProxy編譯需要用到。
cd /opt/software/
curl -R -O http://www.lua.org/ftp/lua-5.4.6.tar.gz
tar zxf lua-5.4.6.tar.gz
cd lua-5.4.6
make all test
安裝HAProxy編譯時必須的其他軟件,因為gcc和openssl-devel在前面安裝過,所以,這里我們只需要安裝pcre-devel和systemd-devel。
yum install -y pcre-devel systemd-devel
下載并編譯HAProxy。
cd /opt/software/
curl -R -O https://www.haproxy.org/download/2.8/src/haproxy-2.8.2.tar.gz
tar zxf haproxy-2.8.2.tar.gz
cd haproxy-2.8.2
make ARCH=x86_64 TARGET=linux-glibc USE_OPENSSL=1 USE_ZLIB=1 USE_PCRE=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/opt/software/lua-5.4.6/src/ LUA_LIB=/opt/software/lua-5.4.6/src/
make install PREFIX=/usr/local/haproxy
ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/
安裝成功后,查看HAProxy版本。
[root@localhost haproxy-2.8.2]# haproxy -v
HAProxy version 2.8.2-61a0f57 2023/08/09 - https://haproxy.org/
Status: long-term supported branch - will stop receiving fixes around Q2 2028.
Known bugs: http://www.haproxy.org/bugs/bugs-2.8.2.html
Running on: Linux 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64
新建HAProxy服務(wù)文件haproxy.service,讓其可以使用systemd系統(tǒng)和服務(wù)管理器管理。
mkdir /var/run/haproxy
vi /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
(2)HAProxy軟件配置
創(chuàng)建HAProxy配置文件。
mkdir /etc/haproxy
vi /etc/haproxy/haproxy.cfg
haproxy.cfg配置文件內(nèi)容,nginx配置請查看前面章節(jié),有詳細(xì)介紹如何安裝配置。
global
log 127.0.0.1 local6 info #info日志,有用的信息
log 127.0.0.1 local5 notice #notice日志,普通但重要的事件
pidfile /var/run/haproxy/haproxy.pid #pid文件
maxconn 20000 #最大連接數(shù)
user haproxy #用戶 或者 uid
group haproxy #組 或者 gid
daemon #后臺運行
nbproc 12 #工作進(jìn)程數(shù)量
defaults #默認(rèn)參數(shù)
mode http #模式 http or tcp
log global
retries 3 #重試次數(shù)
option redispatch #服務(wù)不可用后,重定向到其他健康服務(wù)器
option dontlognull #不記錄健康檢查的日志信息
maxconn 20000 #最大連接數(shù)
timeout client 60s # 客戶端超時時間
timeout server 60s # 服務(wù)端超時時間
timeout connect 1s # haproxy與服務(wù)端超時時間
listen admin_stats # frontend and backend 監(jiān)控
bind *:8118
stats uri /haproxy?stats #查看服務(wù)器狀態(tài)路徑
stats auth admin:123456 #用戶認(rèn)證,密碼一定要改復(fù)雜,可以設(shè)置多個
stats hide-version #隱藏統(tǒng)計頁面上的HAproxy版本信息
stats refresh 5s # 統(tǒng)計刷新頻率
frontend web #listen 接收客戶不同請求,并根據(jù)acl策略做不同的請求轉(zhuǎn)發(fā)至backend處理
mode http
bind *:80 #端口
bind *:443 ssl crt /etc/ssl/certs/***.gitegg.com.pem #端口
option httplog #http格式日志
option forwardfor # 轉(zhuǎn)發(fā)客戶端真實地址
option httpclose #請求完即關(guān)閉
default_backend nginx_servers #默認(rèn)服務(wù)器組
acl nginx_acl hdr_dom(host) -i **n.gitegg.com #定義ACL,根據(jù)域名判斷
redirect scheme https code 301 if !{ ssl_fc } nginx_acl #nginx_acl http強制跳轉(zhuǎn)ssl
use_backend nginx_servers if nginx_acl #調(diào)用ACL
backend nginx_servers #backend 定義Nginx服務(wù)器集群
balance roundrobin #基于權(quán)重的負(fù)載均衡的方式
option httpchk GET /test.html #心跳檢測
server nginx1 192.168.1.210:8000 maxconn 10000 cookie server1 weight 1 check inter 1s rise 2 fall 2
server nginx2 192.168.1.195:8000 maxconn 10000 cookie server2 weight 1 check inter 1s rise 2 fall 2
backend nginx_servers_ssl #backend 定義Nginx服務(wù)器集群 SSL
balance roundrobin #基于權(quán)重的負(fù)載均衡的方式
option httpchk GET /test.html #心跳檢測
server nginx1s 192.168.1.210:4443 ssl verify none check check-ssl maxconn 10000 cookie server1 weight 1 check inter 1s rise 2 fall 2
server nginx2s 192.168.1.195:4443 ssl verify none check check-ssl maxconn 10000 cookie server2 weight 1 check inter 1s rise 2 fall 2
配置HAProxy日志,HAProxy的日志記錄始終依賴于syslog服務(wù)器,因為它不執(zhí)行任何文件系統(tǒng)訪問。使用它的標(biāo)準(zhǔn)方式是通過UDP發(fā)送日志到日志服務(wù)器,通常將其配置為127.0.0.1。HAProxy日志的八個級別:
emerg alert crit err warning notice info debug。
vi /etc/rsyslog.conf
在文件中找到一下位置放開注釋。
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
在#### RULES ####下面新增。
local6.info /usr/local/haproxy/logs/info.log
local5.notice /usr/local/haproxy/logs/notice.log
選一個磁盤空間大的目錄保存日志,重啟rsyslog。
mkdir /usr/local/haproxy/logs
chmod 777 /usr/local/haproxy/logs
systemctl restart rsyslog
(3)啟動并驗證HAProxy
啟動haproxy。
systemctl start haproxy
#查看啟動狀態(tài),如果Active: active (running),表示啟動成功
systemctl status haproxy.service
設(shè)置haproxy開機(jī)啟動。
systemctl enable haproxy.service
三、配置Keepalived實現(xiàn)HAproxy高可用
Keepalived默認(rèn)監(jiān)測自身狀態(tài)是否正常,如果不正常則切換主備,虛擬IP漂移到服務(wù)狀態(tài)正常的服務(wù)器上。我們需要保持HAproxy高可用,也就是主HAproxy服務(wù)掛掉后,Keepalived也需要切換主備,將虛擬IP切換到HAproxy服務(wù)狀態(tài)正常的服務(wù)器上。Keepalived通過調(diào)用自定義健康檢查腳本實現(xiàn)以上功能。
1、自定義HAproxy健康檢查腳本
創(chuàng)建腳本存放目錄。
mkdir /etc/keepalived/scripts
新建haproxy_check.sh文件。
vi /etc/keepalived/scripts/haproxy_check.sh
haproxy_check.sh內(nèi)容如下:
#!/bin/bash
HA=`ps -C haproxy --no-header | wc -l`
if [ $HA -eq 0 ];then
systemctl start haproxy
sleep 3
if [ `ps -C haproxy --no-header | wc -l` -eq 0 ];then
systemctl stop keepalived
exit 1
fi
fi
exit 0
賦予haproxy_check.sh執(zhí)行權(quán)限。
chmod +x /etc/keepalived/scripts/haproxy_check.sh
2、修改Keepalived配置文件,加入HAProxy監(jiān)測腳本
vrrp_strict # 嚴(yán)格遵守VRRP協(xié)議,如果防火墻開啟,此模式下,如果keepalived切換VIP會無法訪問,可以注釋掉試一下。
! Configuration File for keepalived
global_defs {
router_id NODE_MASTER #名稱唯一
vrrp_skip_check_adv_addr # 默認(rèn)是不跳過檢查。檢查收到的VRRP通告中的所有地址可能會比較耗時,設(shè)置此命令的意思是,如果通告與接收的上一個通告來自相同的master路由器,則不執(zhí)行檢查(跳過檢查)。
#vrrp_strict # 嚴(yán)格遵守VRRP協(xié)議
#vrrp_garp_interval 0 #在一個接口發(fā)送的兩個免費ARP之間的延遲??梢跃_到毫秒級。默認(rèn)是0.
#vrrp_gna_interval 0 #在一個網(wǎng)卡上每組na消息之間的延遲時間,默認(rèn)為0
script_user root
enable_script_security
max_auto_priority 1
}
# 添加HAProxy監(jiān)測腳本
vrrp_script check_haproxy {
script "/etc/keepalived/haproxy_check.sh"
interval 2 #檢查間隔2s
weight 2 #權(quán)重
fall 1 # 2次失敗代表服務(wù)不可用
rise 1 # 1次正確代表服務(wù)可用
}
vrrp_instance VI_1 {
state MASTER # 設(shè)置初始狀態(tài)均主
interface enp6s0f1 enp6s0f0 # 設(shè)置綁定虛擬IP的網(wǎng)卡
virtual_router_id 51 # 集群的virtual_router_id值,主備一致
priority 100 # 路由權(quán)重
advert_int 1 #檢查間隔,默認(rèn)1秒
notify_master "/etc/keepalived/keepalived_notify.sh master"
notify_backup "/etc/keepalived/keepalived_notify.sh backup"
notify_fault "/etc/keepalived/keepalived_notify.sh fault"
authentication {
auth_type PASS #認(rèn)證方式
auth_pass 11111111 #認(rèn)證密碼(密碼只識別前8位)
}
virtual_ipaddress {
內(nèi)網(wǎng)虛擬ip dev enp6s0f1 # 內(nèi)網(wǎng)虛擬ip
公網(wǎng)虛擬ip dev enp6s0f0 # 公網(wǎng)虛擬ip
}
track_script {
check_haproxy
}
}
重啟keepalived服務(wù)。
systemctl restart keepalived
通過以上配置之后,可以使用命令停止HAProxy,查看HAProxy服務(wù)是否能夠重啟,根據(jù)我們的監(jiān)測腳本,即使手動停止,HAProxy仍然能夠啟動,Keepalived并不會發(fā)生狀態(tài)轉(zhuǎn)移??梢孕薷腍AProxy的配置文件使服務(wù)無法啟動,然后測試Keepalived狀態(tài)轉(zhuǎn)移情況。
四、HAProxy使用配置總結(jié)
關(guān)于SSL證書是放在Nginx處理還是HAProxy處理,網(wǎng)上有相關(guān)壓測結(jié)果,HAProxy的性能不如Nginx,所以我們使用SSL-Pass-Through透傳的方式,將SSL證書放在Nginx處理。
可以測試HAProxy使用SSL證書訪問Java后臺服務(wù)。
HAProxy使用的pem文件,是pem和key的合并文件,即把key的內(nèi)容復(fù)制到pem中。
cd /etc/ssl/certs
cat ***.gitegg.com.pem ***.gitegg.com.key | tee ***.gitegg.com.pem
如果開啟了防火墻,需要使用防火墻開放端口命令,開發(fā)對應(yīng)的端口。
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --zone=public --add-port=8118/tcp --permanent
firewall-cmd --zone=public --add-port=8000/tcp --permanent
firewall-cmd --reload
# 查看當(dāng)前系統(tǒng)打開的所有端口
firewall-cmd --zone=public --list-ports
通過http://ip:port/haproxy?stats訪問,查看HAProxy統(tǒng)計狀態(tài)。