1. 程式人生 > 實用技巧 >Haproxy詳解以及基於Haproxy的高可用實戰

Haproxy詳解以及基於Haproxy的高可用實戰

Haproxy與Keepalived VRRP 介紹

軟體:haproxy---主要是做負載均衡的7層,也可以做4層負載均衡 apache也可以做7層負載均衡,但是很麻煩。實際工作中沒有人用。 負載均衡是通過OSI協議對應的 7層負載均衡:用的7層http協議, 4層負載均衡:用的是tcp協議加埠號做的負載均衡


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學習教程視訊實戰進階提升(學習路線+課程大綱+視訊教程+面試題+學習工具+大廠實戰手冊)