一、 使用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-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服務是正常
兩個HK節點都安裝haproxy和keepalived
[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想實現雙主就須要先配置雙實例,分別監聽兩個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
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 } }
設置完成以後兩個節點分別啓動haproxy和keepalived服務,集羣就配置完成了
[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