HAProxy是一種免費、快速、可靠的反向代理,為基于TCP和HTTP的應用程序提供高可用性、負載平衡和代理,它非常適合應用在高并發大流量的網站上。這些年來,HAProxy已成為事實上的標準開源負載均衡,目前HAProxy已與大多數主流Linux發行版一起提供,很多云平臺也默認集成了HAProxy。
??LVS、Nginx、HAProxy是常用的三款負載均衡,網上有很多三種負載均衡詳細的對比文章,下面一句話總結LVS、Nginx、HAProxy的優缺點:
通常我們把Keepalived和HAProxy一起使用,來實現Web服務器的高可用性和負載平衡。Keepalived是一個用C編寫的路由軟件,它使用虛擬路由冗余協議(VRRP)和健康檢查機制的組合來確定服務器的狀態,并在需要時觸發故障轉移。VRRP確保只有一個服務器在任何給定時間內 actively 響應請求,而健康檢查則監視服務器的健康狀態,并在主服務器失敗時觸發選舉過程。
關閉SELinux,盡管SELinux可以增強生產服務器的安全性,它是為每個軟件配置控制權限,使用它的前提是必須詳細了解每個需要部署的軟件并為它配置。很多國內云服務器默認安裝的Linux環境也是禁用SELinux,否則在安裝部署時會有很多問題。
# 首先臨時關閉SELinuxsetenforce 0# 修改配置文件,永久關閉SELinuxvi /etc/sysconfig/selinux# 設置SELINUX=disabled
VIP(虛擬IP)有兩種實現方式:一種是直接配置Linux服務器網絡,還有一種是使用Keepalived,我們這里直接使用Keepalived的方式來實現。在實際部署中發現,如果多網卡時,不同的虛擬IP綁定在同一網卡,在虛擬IP切換時會發生無法訪問的情況,所以盡量將虛擬IP設置為統一網段綁定在同一網卡。
yum list keepalived
yum install -y keepalived
# 安裝編譯源碼所需依賴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# 從解壓的源碼包中將開機啟動文件復制到/etc/rc.d/init.d/cp /opt/software/keepalived-2.2.8/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/# 給keepalived賦權限/etc/init.d/是/etc/rc.d/init.d/的軟鏈接chmod +x /etc/init.d/keepalived# 設置開機啟動echo "/etc/init.d/keepalived start" >> /etc/rc.local
在生產環境中,高可用服務的狀態變化需要及時通知系統管理員,以保障管理員及時處理服務故障,使服務正常運行。Keepalived提供notification_email、smtp_server等郵件發送配置,但是它不支持SMTP身份驗證,也不支持SMTP的TLS,它是使用HELO且不使用身份驗證的RFC821實現,所以Keepalived沒有配置郵件服務器用戶名、密碼的方法,導致無法使用外部郵箱服務器,所以,這里選擇網上大多數方法,編寫腳本,當Keepalived狀態切換時,調用Linux系統的mailx(mailx是一個命令行郵件客戶端)進行郵件發送。
[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)
yum install mailx -y
vi /etc/mail.rc# 一下內容加在mail.rc文件底部set from=xxxxxxxxxxx@163.comset smtp=smtp.163.comset smtp-auth-user=xxxxxxxx@163.comset smtp-auth-password=密碼set smtp-auth=loginset ssl-verify=ignore
echo "虛擬IP發生浮動,請及時處理。" | mail -s "Keepalived告警郵件" gitegg@gitegg.com
vi /etc/keepalived/keepalived_notify.sh
keepalived_notify.sh內容如下:
# 填寫一下內容#!/bin/bashmailto=收件人郵箱1,收件人郵箱2notify() { mailsubject="【Keepalived狀態切換告警郵件】$(hostname) 狀態切換為 $1" mailbody="$(date +'%F %T'): Keepalived狀態發生切換, $(hostname) 狀態切換為 $1,請檢查服務器運行狀態。" echo "$mailbody" | mail -s "$mailsubject" $mailto}case $1 inmaster) notify master ;;backup) notify backup ;;fault) notify fault ;;*) echo "Usage: $(basename $0) {master|backup|fault}" exit 1 ;;esac
keepalived_notify.sh賦可執行權限。
chmod +x /etc/keepalived/keepalived_notify.sh# 測試腳本是否可以發送bash /etc/keepalived/keepalived_notify.sh master
vi /etc/hostname#修改hostname,注意格式localhost.ServerA#立即生效hostname $(cat /etc/hostname)
net.ipv4.ip_forward = 1 開啟允許數據包轉發?? 2. net.ipv4.ip_nonlocal_bind = 1 開啟允許綁定非本機的IP?? 3. --in-interface后面一定要修改為你自己的網卡。
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.confecho "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf sysctl -p# 雙網卡,網卡enp6s0f1 firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface enp6s0f1 --destination 224.0.0.18 --protocol vrrp -j ACCEPTfirewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface enp6s0f1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT# 雙網卡,網卡enp6s0f0firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface enp6s0f0 --destination 224.0.0.18 --protocol vrrp -j ACCEPTfirewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface enp6s0f0 --destination 224.0.0.18 --protocol vrrp -j ACCEPTfirewall-cmd --reload
配置Keepalived的虛擬IP(VIP),多網卡配置,虛擬一個內網VIP,一個外網VIP主節點服務器192.168.1.210的keepalived.conf配置。
! Configuration File for keepalivedglobal_defs { router_id NODE_MASTER #名稱唯一 vrrp_skip_check_adv_addr # 默認是不跳過檢查。檢查收到的VRRP通告中的所有地址可能會比較耗時,設置此命令的意思是,如果通告與接收的上一個通告來自相同的master路由器,則不執行檢查(跳過檢查)。 #vrrp_strict # 嚴格遵守VRRP協議 #vrrp_garp_interval 0 #在一個接口發送的兩個免費ARP之間的延遲。可以精確到毫秒級。默認是0. #vrrp_gna_interval 0 #在一個網卡上每組na消息之間的延遲時間,默認為0 script_user root enable_script_security max_auto_priority 1}vrrp_instance VI_1 { state MASTER # 設置初始狀態均主 interface enp6s0f1 enp6s0f0 # 設置綁定虛擬IP的網卡,多個網卡可以在后面添加 virtual_router_id 51 # 集群的virtual_router_id值,主備一致 priority 100 # 路由權重 advert_int 1 #檢查間隔,默認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 #認證方式 auth_pass 11111111 #認證密碼(密碼只識別前8位) } virtual_ipaddress { 內網虛擬ip dev enp6s0f1 # 內網虛擬ip,后面可以加網卡名稱綁定不同網卡 公網虛擬ip dev enp6s0f0 # 公網虛擬ip,后面可以加網卡名稱綁定不同網卡 }}
備節點服務器192.168.1.195的keepalived.conf配置。
! Configuration File for keepalivedglobal_defs { router_id NODE_SLAVE #名稱唯一 vrrp_skip_check_adv_addr # 默認是不跳過檢查。檢查收到的VRRP通告中的所有地址可能會比較耗時,設置此命令的意思是,如果通告與接收的上一個通告來自相同的master路由器,則不執行檢查(跳過檢查)。 vrrp_strict # 嚴格遵守VRRP協議 #vrrp_garp_interval 0 #在一個接口發送的兩個免費ARP之間的延遲。可以精確到毫秒級。默認是0. #vrrp_gna_interval 0 #在一個網卡上每組na消息之間的延遲時間,默認為0 script_user root enable_script_security max_auto_priority 1}vrrp_instance VI_1 { state BACKUP # 設置初始狀態均備 interface enp6s0f1 # 設置綁定虛擬IP的網卡 virtual_router_id 51 # 集群的virtual_router_id值,主備一致 priority 100 # 路由權重 advert_int 1 #檢查間隔,默認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 #認證方式 auth_pass 11111111 #認證密碼(密碼只識別前8位) } virtual_ipaddress { 內網虛擬ip/24 # 內網虛擬ip 公網虛擬ip/24 # 公網虛擬ip }}
分別在主備節點啟動keepalived。
systemctl start keepalived# 查看啟動狀態/etc/init.d/keepalived status
設置keepalived開機啟動。
systemctl enable keepalived.service
在主節點通過ip addr命令驗證,查看虛擬IP192.168.1.200在主節點。
[root@localhost ~]# ip addr | grep 192.168.1.200 inet 192.168.1.200/24 scope global secondary enp6s0f1
在備節點通過ip addr命令驗證,查看虛擬IP192.168.1.200不在備節點。
[root@localhost ~]# ip addr | grep 192.168.1.200[root@localhost ~]#
通過以上驗證,說明Keepalived虛擬IP配置成功,如果主備同時存在虛擬IP,那么說明沒有配置成功,請檢查防火墻firewall是否配置正確。同時,為了驗證虛擬IP是否會自動漂移,可以使用systemctl stop keepalived 停止主節點的Keepalived,此時虛擬IP漂移到備節點。
HAProxy也有兩種安裝方式,yum和源碼包。同樣,因為yum源的原因,yum方式安裝的不是最新穩定版本,所以我們這里選擇采用編譯源碼包的方式安裝。
HAProxy編譯安裝需要用到Lua,所以首先安裝Lua。記住Lua的src路徑/opt/software/lua-5.4.6/src,后續HAProxy編譯需要用到。
cd /opt/software/curl -R -O http://www.lua.org/ftp/lua-5.4.6.tar.gztar zxf lua-5.4.6.tar.gzcd lua-5.4.6make 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.gztar zxf haproxy-2.8.2.tar.gzcd haproxy-2.8.2make 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/haproxyln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/
安裝成功后,查看HAProxy版本。
[root@localhost haproxy-2.8.2]# haproxy -vHAProxy 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.htmlRunning on: Linux 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64
新建HAProxy服務文件haproxy.service,讓其可以使用systemd系統和服務管理器管理。
mkdir /var/run/haproxyvi /usr/lib/systemd/system/haproxy.service
[Unit]Description=HAProxy Load BalancerAfter=syslog.target network.target[Service]ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -qExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy/haproxy.pidExecReload=/bin/kill -USR2 $MAINPID[Install]WantedBy=multi-user.target
創建HAProxy配置文件。
mkdir /etc/haproxyvi /etc/haproxy/haproxy.cfg
haproxy.cfg配置文件內容,nginx配置請查看前面章節,有詳細介紹如何安裝配置。
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 #最大連接數 user haproxy #用戶 或者 uid group haproxy #組 或者 gid daemon #后臺運行 nbproc 12 #工作進程數量defaults #默認參數 mode http #模式 http or tcp log global retries 3 #重試次數 option redispatch #服務不可用后,重定向到其他健康服務器 option dontlognull #不記錄健康檢查的日志信息 maxconn 20000 #最大連接數 timeout client 60s # 客戶端超時時間 timeout server 60s # 服務端超時時間 timeout connect 1s # haproxy與服務端超時時間listen admin_stats # frontend and backend 監控 bind *:8118 stats uri /haproxy?stats #查看服務器狀態路徑 stats auth admin:123456 #用戶認證,密碼一定要改復雜,可以設置多個 stats hide-version #隱藏統計頁面上的HAproxy版本信息 stats refresh 5s # 統計刷新頻率frontend web #listen 接收客戶不同請求,并根據acl策略做不同的請求轉發至backend處理 mode http bind *:80 #端口 bind *:443 ssl crt /etc/ssl/certs/***.gitegg.com.pem #端口 option httplog #http格式日志 option forwardfor # 轉發客戶端真實地址 option httpclose #請求完即關閉 default_backend nginx_servers #默認服務器組 acl nginx_acl hdr_dom(host) -i **n.gitegg.com #定義ACL,根據域名判斷 redirect scheme https code 301 if !{ ssl_fc } nginx_acl #nginx_acl http強制跳轉ssl use_backend nginx_servers if nginx_acl #調用ACLbackend nginx_servers #backend 定義Nginx服務器集群 balance roundrobin #基于權重的負載均衡的方式 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 2backend nginx_servers_ssl #backend 定義Nginx服務器集群 SSL balance roundrobin #基于權重的負載均衡的方式 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服務器,因為它不執行任何文件系統訪問。使用它的標準方式是通過UDP發送日志到日志服務器,通常將其配置為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.loglocal5.notice /usr/local/haproxy/logs/notice.log
選一個磁盤空間大的目錄保存日志,重啟rsyslog。
mkdir /usr/local/haproxy/logschmod 777 /usr/local/haproxy/logssystemctl restart rsyslog
啟動haproxy。
systemctl start haproxy#查看啟動狀態,如果Active: active (running),表示啟動成功systemctl status haproxy.service
設置haproxy開機啟動。
systemctl enable haproxy.service
Keepalived默認監測自身狀態是否正常,如果不正常則切換主備,虛擬IP漂移到服務狀態正常的服務器上。我們需要保持HAproxy高可用,也就是主HAproxy服務掛掉后,Keepalived也需要切換主備,將虛擬IP切換到HAproxy服務狀態正常的服務器上。Keepalived通過調用自定義健康檢查腳本實現以上功能。
創建腳本存放目錄。
mkdir /etc/keepalived/scripts
新建haproxy_check.sh文件。
vi /etc/keepalived/scripts/haproxy_check.sh
haproxy_check.sh內容如下:
#!/bin/bashHA=`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 fifiexit 0
賦予haproxy_check.sh執行權限。
chmod +x /etc/keepalived/scripts/haproxy_check.sh
vrrp_strict # 嚴格遵守VRRP協議,如果防火墻開啟,此模式下,如果keepalived切換VIP會無法訪問,可以注釋掉試一下。
! Configuration File for keepalivedglobal_defs { router_id NODE_MASTER #名稱唯一 vrrp_skip_check_adv_addr # 默認是不跳過檢查。檢查收到的VRRP通告中的所有地址可能會比較耗時,設置此命令的意思是,如果通告與接收的上一個通告來自相同的master路由器,則不執行檢查(跳過檢查)。 #vrrp_strict # 嚴格遵守VRRP協議 #vrrp_garp_interval 0 #在一個接口發送的兩個免費ARP之間的延遲。可以精確到毫秒級。默認是0. #vrrp_gna_interval 0 #在一個網卡上每組na消息之間的延遲時間,默認為0 script_user root enable_script_security max_auto_priority 1}# 添加HAProxy監測腳本vrrp_script check_haproxy { script "/etc/keepalived/haproxy_check.sh" interval 2 #檢查間隔2s weight 2 #權重 fall 1 # 2次失敗代表服務不可用 rise 1 # 1次正確代表服務可用}vrrp_instance VI_1 { state MASTER # 設置初始狀態均主 interface enp6s0f1 enp6s0f0 # 設置綁定虛擬IP的網卡 virtual_router_id 51 # 集群的virtual_router_id值,主備一致 priority 100 # 路由權重 advert_int 1 #檢查間隔,默認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 #認證方式 auth_pass 11111111 #認證密碼(密碼只識別前8位) } virtual_ipaddress { 內網虛擬ip dev enp6s0f1 # 內網虛擬ip 公網虛擬ip dev enp6s0f0 # 公網虛擬ip } track_script { check_haproxy }}
重啟keepalived服務。
systemctl restart keepalived
通過以上配置之后,可以使用命令停止HAProxy,查看HAProxy服務是否能夠重啟,根據我們的監測腳本,即使手動停止,HAProxy仍然能夠啟動,Keepalived并不會發生狀態轉移。可以修改HAProxy的配置文件使服務無法啟動,然后測試Keepalived狀態轉移情況。
關于SSL證書是放在Nginx處理還是HAProxy處理,網上有相關壓測結果,HAProxy的性能不如Nginx,所以我們使用SSL-Pass-Through透傳的方式,將SSL證書放在Nginx處理。
可以測試HAProxy使用SSL證書訪問Java后臺服務。
HAProxy使用的pem文件,是pem和key的合并文件,即把key的內容復制到pem中。
cd /etc/ssl/certscat ***.gitegg.com.pem ***.gitegg.com.key | tee ***.gitegg.com.pem
如果開啟了防火墻,需要使用防火墻開放端口命令,開發對應的端口。
firewall-cmd --zone=public --add-port=80/tcp --permanentfirewall-cmd --zone=public --add-port=443/tcp --permanentfirewall-cmd --zone=public --add-port=8118/tcp --permanentfirewall-cmd --zone=public --add-port=8000/tcp --permanentfirewall-cmd --reload# 查看當前系統打開的所有端口firewall-cmd --zone=public --list-ports
通過http://ip:port/haproxy?stats訪問,查看HAProxy統計狀態。
本文鏈接:http://www.www897cc.com/showinfo-26-13622-0.html微服務部署—HAProxy+Keepalived高可用負載均衡集群配置
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: Scala語言入門:初學者的基礎語法指南