Haproxy+keepalived實現雙主負載均衡高可用集羣

項目說明

一、         使用Haproxy負載均衡用戶請求到後端web服務器,而且實現健康狀態檢查html

二、         使用keepalived高可用Haproxy,避免LVS單點故障web

三、         集羣中分別在HK-01和HK-02運行一個VIP地址,實現Haproxy雙主redis

四、         用戶經過DNS輪訓的方式實現訪問集羣的負載均衡(不演示)vim

實驗拓撲

環境介紹:後端


IP地址bash

功能描述服務器

HK-01負載均衡

172.16.4.100curl

調度用戶請求到後端web服務器,而且和HK-02互爲備份socket

HK-02

172.16.4.101

調度用戶請求到後端web服務器,而且和HK-01互爲備份

WEB-01

172.16.4.102

提供web服務

WEB-02

172.16.4.103

提供web服務

DNS

172.16.4.10

實現DNS輪訓解析用戶請求域名地址

VIP1

172.16.4.1

用戶訪問集羣的入口地址,可能在HK-01,也可能在HK-02

VIP2

172.16.4.2

用戶訪問集羣的入口地址,可能在HK-01,也可能在HK-02

配置示例

後端WEB服務器配置

Web服務器的配置極其簡單,只須要提供測試頁面啓動web服務便可,配置以下:

Web-01配置

[root@WEB-01 ~]# echo "web-01" >/var/www/html/index.html
[root@WEB-01 ~]# service httpd start
Web-02配置
[root@WEB-02 ~]# echo "web-02" >/var/www/html/index.html
[root@WEB-02 ~]# service httpd start

Haproxy訪問後端web服務器,驗證web服務提供成功

[root@HK-01 ~]# curl 172.16.4.102
web-01
[root@HK-01 ~]# curl 172.16.4.103
web-02

出現設置的頁面,就說明web服務是正常

 

Haproxy+keepalived配置

兩個HK節點都安裝haproxykeepalived

[root@HK-01 ~]# yum -y install haproxy
[root@HK-02 ~]# yum -y install haproxy
[root@HK-01 ~]# yum -y install keepalived
[root@HK-02 ~]# yum -y install keepalived

修改內核參數設置,設置haproxy啓動的時候無論有沒有vip地址均可以啓動

[root@HK-01 ~]# echo"net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
[root@HK-01 ~]# sysctl –p
[root@HK-02 ~]# echo "net.ipv4.ip_nonlocal_bind= 1" >> /etc/sysctl.conf
[root@HK-02 ~]# sysctl -p

此選項爲集羣中關鍵選項,否則VIP地址沒有在Haproxy服務器的時候,服務器沒法正常啓動


設置haproxy

Haproxy想實現雙主就須要先配置雙實例,分別監聽兩個VIP地址,而且兩個實例都得將用戶的請求負載均衡轉發給後端web服務器,使用戶不論訪問那個節點均可以實現負載均衡。

兩個haproxy節點的配置文件如出一轍,因此只放出一個

[root@HK-01 ~]# vim /etc/haproxy/haproxy.cfg
global
    log         127.0.0.1 local2
 
     chroot      /var/lib/haproxy
     pidfile     /var/run/haproxy.pid
     maxconn     4000
    user        haproxy
     group       haproxy
    daemon
 
    statssocket /var/lib/haproxy/stats
 
defaults
    mode                 http
    log                  global
     option                httplog
     option                dontlognull
    optionhttp-server-close
    optionforwardfor       except 127.0.0.0/8
     option                redispatch
     retries                3
    timeouthttp-request           10s
    timeoutqueue           1m
    timeoutconnect           10s
    timeoutclient           1m
    timeoutserver           1m
    timeouthttp-keep-alive 10s
    timeoutcheck           10s
     maxconn              3000
 
     stats enable         #啓用Haproxy的狀態頁面
     statsuri /admin?stats    #設置Haproxy狀態頁面的訪問URL
     statsauth proxy:proxy    #設置訪問Haproxy狀態頁面的用戶名和密碼
 
 
listen www1                   #定義一個實例
       bind172.16.4.1:80   #監聽地址爲VIP地址
       mode tcp       #設置轉發模式爲TCP
       option forwardfor   #容許在發往服務器的請求首部中插入「X-Forwarded-For」首部
       server www01  172.16.4.102:80  check  #定義後端服務器的,並啓用健康檢查
       server www02  172.16.4.103:80  check
listen www2                     #定義第二個實例
       bind172.16.4.2:80   #除了綁定的VIP地址和第一個實例不一樣以外,其餘均相同
       mode tcp
       option forwardfor
       server www01  172.16.4.102:80  check
       server www01  172.16.4.103:80  check

Haproxy的配置就是安裝,修改配置文件,設置完成以後只要啓動Haproxy就能夠正常提供服務了

keepalived設置

HK-01配置

[root@HK-01 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
   router_idLVS_DEVEL
}
 
vrrp_script chk_mt_down {
  script"[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"  #定義一個腳本,判斷down文件是否存在,存在就退出執行,不存在繼續執行
  interval 1           #1秒檢測一次
  weight -5           #優先級減五
}
 
vrrp_instance VI_1 {            #定義VRRP熱備實例
   state MASTER             #MASTER表示主節點
   interfaceeth0              #承載VIP地址的物理接口
   virtual_router_id 51        #虛擬路由器的ID號
   priority100            #優先級,數值越高優先級越大
   advert_int 1           #通知間隔秒數(心跳頻率)
   authentication {         #認證信息配置
       auth_type PASS    #設置認證類型爲密碼
        auth_pass asdfgh  #設置認證的密碼
    }
   virtual_ipaddress {         #指定漂移地址
       172.16.4.1/32 brd 172.16.4.1 dev eth0 label eth0:0
    }
  track_script {
   chk_mt_down   #調用上面定義的腳本,若是這裏沒有調用,那麼上面定義的腳本是沒法生效的
   }
}
 
vrrp_instance VI_2 {         #定義實例爲HK-02的備份節點
   stateBACKUP           #BACKUP表示備份節點
   interfaceeth0 
   virtual_router_id 52  
   priority99           #優先級,低於主服務器
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass qwerty
    }
   virtual_ipaddress {
       172.16.4.2
    }
  track_script {
   chk_mt_down
   }
}

HK-02配置,配置和HK-01基本一致,只不過主備設置的位置不一樣

[root@HK-02 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
   router_idLVS_DEVEL
}
 
vrrp_script chk_mt_down {
  script"[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
  interval 1
  weight -5
}
 
vrrp_instance VI_1 {
   state BACKUP
   interfaceeth 0
   virtual_router_id 51
   priority 99
    advert_int 1
   authentication {
       auth_type PASS
       auth_pass asdfgh
    }
   virtual_ipaddress {
       172.16.4.1/32 brd 172.16.4.1 dev eth0 label eth0:0
    }
  track_script {
     chk_mt_down
   }
}
vrrp_instance VI_2 {
   stateMASTER
   interfaceeth0
   virtual_router_id 52
   priority100
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass qwerty
    }
   virtual_ipaddress {
       172.16.4.2
    }
    track_script {
     chk_mt_down
   }
}


設置完成以後兩個節點分別啓動haproxykeepalived服務,集羣就配置完成了

[root@HK-01 ~]# service haproxy start
[root@HK-01 ~]# service keepalived start
[root@HK-02 ~]# service haproxy start
[root@HK-02 ~]# service keepalived start

 

驗證

訪問狀態頁面,www1,和www2示例都顯示正常

VIP地址也都分別啓動到了兩個節點實現了雙主

[root@HK-01 ~]# ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500 qdisc pfifo_fast state UP qlen 1000
   link/ether 00:0c:29:22:c5:c2 brd ff:ff:ff:ff:ff:ff
    inet172.16.4.100/16 brd 172.16.255.255 scope global eth0
    inet172.16.4.1/32 brd 172.16.4.1 scope global eth0:0   #VIP地址正常啓動
    inet6fe80::20c:29ff:fe22:c5c2/64 scope link
      valid_lft forever preferred_lft forever
[root@HK-02 ~]# ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500 qdisc pfifo_fast state UP qlen 1000
   link/ether 00:0c:29:f1:dd:b2 brd ff:ff:ff:ff:ff:ff
    inet172.16.4.101/16 brd 172.16.255.255 scope global eth0
    inet172.16.4.2/32 scope global eth0                      #VIP地址正常啓動
    inet6fe80::20c:29ff:fef1:ddb2/64 scope link
      valid_lft forever preferred_lft forever

負載均衡測試

分別訪問兩個vip地址均實現了負載均衡的效果

[root@localhost ~]# curl 172.16.4.1
web-02
[root@localhost ~]# curl 172.16.4.1
web-01
[root@localhost ~]# curl 172.16.4.2
web-01
[root@localhost ~]# curl 172.16.4.2
web-02

高可用驗證

手動關閉其中HK-02,驗證vip地址是否會自動漂移到HK-01服務器

[root@HK-02 ~]# touch /etc/keepalived/down

兩個vip地址均正常漂移到HK-02

[root@HK-01 ~]# ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500 qdisc pfifo_fast state UP qlen 1000
   link/ether 00:0c:29:22:c5:c2 brd ff:ff:ff:ff:ff:ff
    inet172.16.4.100/16 brd 172.16.255.255 scope global eth0
    inet172.16.4.1/32 brd 172.16.4.1 scope global eth0:0   
    inet172.16.4.2/32 scope global eth0         #HK-02的VIP地址已經漂移過來了
    inet6fe80::20c:29ff:fe22:c5c2/64 scope link
      valid_lft forever preferred_lft forever

健康狀態檢測驗證

手動關閉web-02,查看是否會自動下線web-02

[root@WEB-02 ~]# service httpd stop

查看web狀態頁面,WEB-02已經自動下線了

訪問驗證,調度請求不會轉發到web-02

[root@localhost ~]# curl 172.16.4.1
web-01
[root@localhost ~]# curl 172.16.4.1
web-01
[root@localhost ~]# curl 172.16.4.2
web-01
[root@localhost ~]# curl 172.16.4.2
web-01
相關文章
相關標籤/搜索