Haproxy詳解以及基於Haproxy的高可用實戰
Haproxy與Keepalived VRRP 介紹
軟體:haproxy---主要是做負載均衡的7層,也可以做4層負載均衡
ha-proxy概述
ha-proxy是一款高效能的負載均衡軟體。因為其專注於負載均衡這一些事情,因此與nginx比起來在負載均衡這件事情上做更好,更專業。
ha-proxy的特點
ha-proxy 作為目前流行的負載均衡軟體,必須有其出色的一面。下面介紹一下ha-proxy相對LVS,Nginx等負載均衡軟體的優點。 •支援tcp / http 兩種協議層的負載均衡,使得其負載均衡功能非常豐富。 •支援8種左右的負載均衡演算法,尤其是在http模式時,有許多非常實在的負載均衡演算法,適用各種需求。 •效能非常優秀,基於單程序處理模式(和Nginx類似)讓其效能卓越。 •擁有一個功能出色的監控頁面,實時瞭解系統的當前狀況。 •功能強大的ACL支援,給使用者極大的方便。
haproxy演算法:
1.roundrobin 基於權重進行輪詢,在伺服器的處理時間保持均勻分佈時,這是最平衡,最公平的演算法.此演算法是動態的,這表示其權重可以在執行時進行調整. 2.static-rr 基於權重進行輪詢,與roundrobin類似,但是為靜態方法,在執行時調整其伺服器權重不會生效.不過,其在後端伺服器連線數上沒有限制 3.leastconn 新的連線請求被派發至具有最少連線數目的後端伺服器.
keepalived是什麼
keepalived是叢集管理中保證叢集高可用的一個服務軟體,用來防止單點故障。
keepalived工作原理
keepalived是以VRRP協議為實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗餘協議。(雲伺服器不支援VRRP) 虛擬路由冗餘協議,可以認為是實現高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組裡面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在區域網內其他機器的預設路由為該vip),master會發組播,當backup收不到vrrp包時就認為master宕掉了,這時就需要根據VRRP的優先順序來選舉一個backup當master。這樣的話就可以保證路由器的高可用了。
keepalived主要有三個模組,分別是core、check和vrrp。core模組為keepalived的核心,負責主程序的啟動、維護以及全域性配置檔案的載入和解析。check負責健康檢查,包括常見的各種檢查方式。vrrp模組是來實現VRRP協議的。
腦裂(裂腦): Keepalived的BACKUP主機在收到不MASTER主機報文後就會切換成為master,如果是它們之間的通訊線路出現問題,無法接收到彼此的組播通知,但是兩個節點實際都處於正常工作狀態,這時兩個節點均為master強行繫結虛擬IP,導致不可預料的後果,這就是腦裂。 解決方式: 1、新增更多的檢測手段,比如冗餘的心跳線(兩塊網絡卡做健康監測),ping對方等等。儘量減少"裂腦"發生機會。(指標不治本,只是提高了檢測到的概率); 2、做好對裂腦的監控報警(如郵件及手機簡訊等或值班).在問題發生時人為第一時間介入仲裁,降低損失。例如,百度的監控報警短倍就有上行和下行的區別。報警訊息傳送到管理員手機上,管理員可以通過手機回覆對應數字或簡單的字串操作返回給伺服器.讓伺服器根據指令自動處理相應故障,這樣解決故障的時間更短. 3、爆頭,將master停掉。然後檢查機器之間的防火牆。網路之間的通訊
專案準備
準備四臺虛擬機器,兩臺做代理伺服器,兩臺做真實伺服器(真實伺服器只是用來進行web測試) 1、選擇兩臺Haproxy伺服器作為代理伺服器(一臺master 一臺backup)。 真實伺服器需要nginx來提供web服務進行測試 2、給兩臺代理伺服器安裝keepalived製作高可用生成VIP 3、配置nginx的負載均衡 以上兩臺nginx伺服器配置檔案一致 根據站點分割槽進行排程 配置upstream檔案
[root@master ~]# 192.168.13.128 主節點 [root@backup ~]# 192.168.13.129 備用節點 [root@real-server1 ~]# 192.168.13.133 第一臺真實伺服器 [root@real-server2 ~]# 192.168.13.137 第二臺真實伺服器
我們也可以養成一個良好的習慣,不管用不用的到,我們都要對IP進行解析,不僅是為了自己方便,也便於其他人。
所有虛擬機器 [root@master ~]# cat /etc/hosts 127.0.0.1 localhost 192.168.13.128 master 192.168.13.129 backup 192.168.13.133 real-server1 192.168.13.137 real-server2
nginx安裝
只給兩臺真實伺服器配置安裝nginx ,所有機器關閉防火牆和selinux
192.168.13.133 [root@real-server1 ~]# systemctl stop firewalld && setenforce 0 [root@real-server1 ~]# cd /etc/yum.repos.d/ [root@real-server1 yum.repos.d]# vim nginx.repo [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1 [root@real-server1 yum.repos.d]# yum install yum-utils -y [root@real-server1 yum.repos.d]# yum install nginx -y [root@real-server1 yum.repos.d]# systemctl start nginx #啟動 [root@real-server1 ~]# echo "this is first real-server" > /usr/share/nginx/html/index.html #方便區分,看出效果 [root@real-server1 ~]# vim /etc/nginx/nginx.conf keepalive_timeout 0; #設定長連結 [root@real-server1 ~]# nginx -s reload 192.168.13.138 [root@real-server2 ~]# systemctl stop firewalld && setenforce 0 [root@real-server2 ~]# cd /etc/yum.repos.d/ [root@real-server2 yum.repos.d]# vim nginx.repo [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1 [root@real-server2 yum.repos.d]# yum install yum-utils -y [root@real-server2 yum.repos.d]# yum install nginx -y [root@real-server2 yum.repos.d]# systemctl start nginx #啟動 [root@real-server2 ~]# echo "this is second real-server"> /usr/share/nginx/html/index.html [root@real-server2 ~]# vim /etc/nginx/nginx.conf keepalive_timeout 0;#預設keepalive_timeout 65; [root@real-server2 ~]# nginx -s reload #修改後端nginx伺服器的長連線是為了方便測試
排程器配置Haproxy(主/備)都執行
192.168.13.128 [root@ha-proxy-master ~]# yum -y install haproxy [root@ha-proxy-master ~]# cp -rf /etc/haproxy/haproxy.cfg{,.bak} #備份 [root@master ~]# sed -i -r '/^[ ]*#/d;/^$/d' /etc/haproxy/haproxy.cfg #修改配置檔案去掉註釋,或者你可以直接複製我的程式碼 [root@ha-proxy-master ~]# vim /etc/haproxy/haproxy.cfg global log 127.0.0.1 local2 info pidfile /var/run/haproxy.pid maxconn 4000 #優先順序低 user haproxy group haproxy daemon #以後臺形式執行ha-proxy nbproc 1 #工作程序數量 cpu核心是幾就寫幾 defaults mode http #工作模式 http ,tcp 是 4 層,http是 7 層 log global retries 3 #健康檢查。3次連線失敗就認為伺服器不可用,主要通過後面的check檢查 option redispatch #服務不可用後重定向到其他健康伺服器。 maxconn 4000 #優先順序中 contimeout 5000 #ha伺服器與後端伺服器連線超時時間,單位毫秒ms clitimeout 50000 #客戶端超時 srvtimeout 50000 #後端伺服器超時 listen stats bind *:81 stats enable stats uri /haproxy #使用瀏覽器訪問 http://192.168.246.169/haproxy,可以看到伺服器狀態 stats auth yjssjm:123 #使用者認證,客戶端使用elinks瀏覽器的時候不生效 frontend web mode http bind *:80 #監聽哪個ip和什麼埠 option httplog #日誌類別 http 日誌格式 acl html url_reg -i \.html$ #1.訪問控制列表名稱html。規則要求訪問以html結尾的url(可選) use_backend httpservers if html #2.如果滿足acl html規則,則推送給後端伺服器httpservers default_backend httpservers #預設使用的伺服器組 backend httpservers #名字要與上面的名字必須一樣 balance roundrobin #負載均衡的方式 server http1 192.168.13.133:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2 server http2 192.168.13.137:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
192.168.13.129 [root@ha-proxy-master ~]# yum -y install haproxy [root@ha-proxy-master ~]# cp -rf /etc/haproxy/haproxy.cfg{,.bak} #備份 [root@master ~]# sed -i -r '/^[ ]*#/d;/^$/d' /etc/haproxy/haproxy.cfg #修改配置檔案去掉註釋,或者你可以直接複製我的程式碼 [root@ha-proxy-master ~]# vim /etc/haproxy/haproxy.cfg global log 127.0.0.1 local2 info pidfile /var/run/haproxy.pid maxconn 4000 #優先順序低 user haproxy group haproxy daemon #以後臺形式執行ha-proxy nbproc 1 #工作程序數量 cpu核心是幾就寫幾 defaults mode http #工作模式 http ,tcp 是 4 層,http是 7 層 log global retries 3 #健康檢查。3次連線失敗就認為伺服器不可用,主要通過後面的check檢查 option redispatch #服務不可用後重定向到其他健康伺服器。 maxconn 4000 #優先順序中 contimeout 5000 #ha伺服器與後端伺服器連線超時時間,單位毫秒ms clitimeout 50000 #客戶端超時 srvtimeout 50000 #後端伺服器超時 listen stats bind *:81 stats enable stats uri /haproxy #使用瀏覽器訪問 http://192.168.246.169/haproxy,可以看到伺服器狀態 stats auth yjssjm:123 #使用者認證,客戶端使用elinks瀏覽器的時候不生效 frontend web mode http bind *:80 #監聽哪個ip和什麼埠 option httplog #日誌類別 http 日誌格式 acl html url_reg -i \.html$ #1.訪問控制列表名稱html。規則要求訪問以html結尾的url(可選) use_backend httpservers if html #2.如果滿足acl html規則,則推送給後端伺服器httpservers default_backend httpservers #預設使用的伺服器組 backend httpservers #名字要與上面的名字必須一樣 balance roundrobin #負載均衡的方式 server http1 192.168.13.133:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2 server http2 192.168.13.137:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
其中你需要修改的地方
如果我們訪問http://192.168.13.144:81/haproxy
頁面主要引數解釋 Queue Cur: current queued requests //當前的佇列請求數量 Max:max queued requests //最大的佇列請求數量 Limit: //佇列限制數量
Errors Req:request errors //錯誤請求 Conn:connection errors //錯誤的連線
Server列表: Status:狀態,包括up(後端機活動)和down(後端機掛掉)兩種狀態 LastChk: 持續檢查後端伺服器的時間 Wght: (weight) : 權重
如果出現bind失敗的報錯,執行下列命令 setsebool -P haproxy_connect_any=1
Keepalived實現排程器HA(兩個節點都需要下載)
注:主/備排程器均能夠實現正常排程 1.主/備排程器安裝軟體
192.168.13.128 [root@localhost ~]# yum install -y keepalived [root@localhost ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak #備份 [root@localhost ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id directory1 #只是名字而已,輔節點改為directory2(兩個名字一定不能一樣) } vrrp_instance VI_1 { state MASTER #定義主還是備,備用的話寫backup interface ens33 #VIP繫結介面 virtual_router_id 80 #整個叢集的排程器一致(在同一個叢集) priority 100 #(優先權)back改為50(50一間隔) advert_int 1 #發包 authentication { auth_type PASS #主備節點認證 auth_pass 1111 } virtual_ipaddress { 192.168.13.144/24 #VIP(自己網段的) } }
192.168.13.129 [root@backup ~]# yum install -y keepalived [root@backup ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak [root@backup ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id directory2 } vrrp_instance VI_1 { state BACKUP #設定為backup interface ens33 nopreempt #設定到back上面,不搶佔資源 virtual_router_id 80 priority 50 #輔助改為50 advert_int 1 #檢測間隔1s authentication { auth_type PASS auth_pass 1111 #認證型別和密碼主備一樣,要不然無法互相認證 } virtual_ipaddress { 192.168.13.144/24 #搶佔的VIP也一樣 } }
2.啟動KeepAlived(主備均啟動)
[root@master ~]# systemctl start keepalived [root@backup ~]# systemctl start keepalived 開機自啟(可以不設定) [root@master ~]# systemctl enable keepalived [root@backup ~]# systemctl enable keepalived
[root@backup ~]# systemctl enable keepalived 注意: 如果你網頁訪問不到,可能是配置檔案出錯了。如果你是直接複製本文章的程式碼,建議你將註釋都去掉,有時候可能你的輸入法的問題,導致配置檔案出現一些多餘的空格之類的。 訪問你自己設定的VIP 192.168.13.144
檢視兩個節點伺服器,你會發現VIP在主節點
如果這個時候主節點伺服器宕機了(我們把服務停止了用來測試),VIP會自己漂移到備用節點上。
但是使用者訪問時卻感覺不到
網頁照樣可以繼續使用,這就是高可用性。
基於nginx的高可用性
以上我們只是實現了高可用,基於Haproxy的前提是Haproxy服務是正常。如果有突發情況使得nginx服務不能啟動,但是我們的keepalived服務是正常,這個時候使用者是訪問不到的,VIP也不會自動漂移到備用的節點伺服器上。所以我們需要寫一些程式碼來判斷一下Haproxy服務是不是正常,如果不正常的話我們就將Haproxy服務關掉,然後實現VIP的漂移,這個時候使用者就不會出現無法訪問的情況了。
思路: 讓Keepalived以一定時間間隔執行一個外部指令碼,指令碼的功能是當Haproxy失敗,則關閉本機的Keepalived [root@master ~]# vim /etc/keepalived/check_haproxy_status.sh #!/bin/bash /usr/bin/curl -I http://localhost &>/dev/null if [ $? -ne 0 ];then # /etc/init.d/keepalived stop systemctl stop keepalived fi [root@localhost ~]# chmod a+x /etc/keepalived/check_haproxy_status.sh #一定要加執行許可權 (2)keepalived使用script [root@localhost ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id director1 } vrrp_script check_haproxy { script "/etc/keepalived/check_haproxy_status.sh" interval 5 #每5秒執行一次 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 80 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.13.144/24 } track_script { check_haproxy } } 注:必須先啟動Haproxy,再啟動keepalived,建議備用節點也新增上.
測試訪問: 將keepalived叢集的主節點的nginx服務關閉,檢視vip是否漂移,如果漂移,即成功
配置haproxy的日誌
兩臺機器都配置haproxy的日誌:需要開啟註釋並新增
[root@master ~]# vim /etc/rsyslog.conf # Provides UDP syslog reception #由於haproxy的日誌是用udp傳輸的,所以要啟用rsyslog的udp監聽 $ModLoad imudp $UDPServerRun 514 找到 #### RULES #### 下面新增 local2.* /var/log/haproxy.log
[root@master ~]# systemctl restart rsyslog [root@master ~]# systemctl restart haproxy [root@master ~]# tail -f /var/log/haproxy.log #實時檢視日誌 Mar 19 12:53:27 localhost haproxy[73866]: Proxy stats started. Mar 19 12:53:27 localhost haproxy[73866]: Proxy web started. Mar 19 12:53:27 localhost haproxy[73866]: Proxy httpservers started.
》》點選免費領取:2020持續更新Linux學習教程視訊實戰進階提升(學習路線+課程大綱+視訊教程+面試題+學習工具+大廠實戰手冊)