天天看點

Web伺服器群集——(HAproxy基本負載均衡)+(Nginx七層負載均衡叢集)+(HAproxy+Keepalived負載均衡叢集實作動靜分離)HAproxy概述初始HAproxy實作簡單的負載均衡Nginx七層負載均衡叢集HAproxy+Keepalived負載均衡叢集實作動靜分離

HAproxy基本負載均衡)+(Nginx七層負載均衡叢集)+(HAproxy+Keepalived負載均衡叢集實作動靜分離)

  • HAproxy概述
      • HAproxy簡單特點概述
  • 初始HAproxy實作簡單的負載均衡
  • Nginx七層負載均衡叢集
  • HAproxy+Keepalived負載均衡叢集實作動靜分離

HAproxy概述

  • 關于4/7層負載均衡叢集
無負載均衡
Web伺服器群集——(HAproxy基本負載均衡)+(Nginx七層負載均衡叢集)+(HAproxy+Keepalived負載均衡叢集實作動靜分離)HAproxy概述初始HAproxy實作簡單的負載均衡Nginx七層負載均衡叢集HAproxy+Keepalived負載均衡叢集實作動靜分離
  • 在此示例中,使用者直接連接配接到您的Web伺服器,在yourdomain.com上,并且沒有負載平衡。如果您的單個Web伺服器出現故障,使用者将無法再通路您的Web伺服器。此外,如果許多使用者試圖同時通路您的伺服器并且無法處理負載,他們可能會遇到緩慢的體驗,或者可能根本無法連接配接。
四層負載均衡
Web伺服器群集——(HAproxy基本負載均衡)+(Nginx七層負載均衡叢集)+(HAproxy+Keepalived負載均衡叢集實作動靜分離)HAproxy概述初始HAproxy實作簡單的負載均衡Nginx七層負載均衡叢集HAproxy+Keepalived負載均衡叢集實作動靜分離
  • 将網絡流量負載,平衡到多個伺服器的最簡單方法,是使用第4層(傳輸層)負載平衡。以這種方式進行負載均衡将根據IP範圍和端口轉發使用者流量(即,如果請求進入http://yourdomain.com/anything,則流量将轉發到處理yourdomain.com的所有請求的後端。端口80)
  • 使用者通路負載均衡器,負載均衡器将使用者的請求轉發給後端伺服器的Web後端組。無論選擇哪個後端伺服器,都将直接響應使用者的請求。通常,Web後端中的所有伺服器應該提供相同的内容-否則使用者可能會收到不一緻的内容。
七層負載均衡
Web伺服器群集——(HAproxy基本負載均衡)+(Nginx七層負載均衡叢集)+(HAproxy+Keepalived負載均衡叢集實作動靜分離)HAproxy概述初始HAproxy實作簡單的負載均衡Nginx七層負載均衡叢集HAproxy+Keepalived負載均衡叢集實作動靜分離
  • 7層負載平衡是更複雜的負載均衡網絡流量的方法是使用第7層(應用層)負載均衡。使用第7層允許負載均衡器根據使用者請求的内容将請求轉發到不同的後端伺服器。這種負載平衡模式允許您在同一域和端口下運作多個Web應用程式伺服器。
  • 示例中,如果使用者請求yourdomain.com/blog,則會将其轉發到部落格後端,後端是一組運作部落格應用程式的伺服器。其他請求被轉發到web-backend,後端可能正在運作另一個應用程式。

關于HAproxy

7層負載均衡、應用程式負載均衡、URL負載均衡、動靜分離技術,免費、快速并且可靠

是一款高性能的負載均衡軟體。因為其專注于負載均衡這一些事情,是以與nginx比起來在負載均衡這件事情上做更好,更專業。

  • HAProxy Session親緣性
    • haproxy負載均衡保持用戶端和伺服器Session親緣性的三種方式
    • 使用者IP識别
    • cookie識别
    • session識别

HAproxy簡單特點概述

  • 支援tcp / http兩種協定層的負載均衡,使得其負載均衡功能非常豐富。
  • 支援8種左右的負載均衡算法,尤其是在http模式時,有許多非常實在的負載均衡算法,适用各種需求。
  • 性能非常優秀,基于事件驅動的連結處理模式及單程序處理模式(和Nginx類似)讓其性能卓越。
  • 擁有一個功能出色的監控頁面,實時了解系統的目前狀況。
  • 功能強大的ACL支援,給使用者極大的友善。

初始HAproxy實作簡單的負載均衡

Web伺服器群集——(HAproxy基本負載均衡)+(Nginx七層負載均衡叢集)+(HAproxy+Keepalived負載均衡叢集實作動靜分離)HAproxy概述初始HAproxy實作簡單的負載均衡Nginx七層負載均衡叢集HAproxy+Keepalived負載均衡叢集實作動靜分離
#環境
四台Linux,做好域名解析
HAproxy:192.168.100.10
Web1:192.168.100.20
Web2:192.168.100.30
Client:192.168.100.40

#域名解析
[[email protected] ~]# vim /etc/hosts
192.168.100.10 haproxy
192.168.100.20 web1
192.168.100.30 web2
192.168.100.40 client
[[email protected] ~]# scp /etc/hosts web1:/etc/
[[email protected] ~]# scp /etc/hosts web2:/etc/
[[email protected] ~]# scp /etc/hosts client:/etc/
           
  • Web1和Web2建立測試頁面
[[email protected] ~]# yum -y install httpd
[[email protected] ~]# echo web1 > /var/www/html/index.html
[[email protected] ~]# systemctl enable httpd --now

[[email protected] ~]# yum -y install httpd
[[email protected] ~]# echo web2 > /var/www/html/index.html
[[email protected] ~]# systemctl enable httpd --now
           
  • 配置HAproxy
[[email protected] ~]# yum -y install haproxy

[[email protected] ~]# vim /etc/haproxy/haproxy.cfg
global                                    #全局配置
        log 127.0.0.1 local3 info         #日志配置記錄本機日志中 local3 日志類型自定義 
        maxconn 4096                      #最大連接配接限制(優先級低)
        user nobody                       #運作haproxy使用者是誰/也可以寫99
        group nobody                      #組使用者
                daemon                    #守護程序常駐系統記憶體
                nbproc 1                  #haproxy程序數,該值的設定應與伺服器cpu核心數一緻,如16,即2顆8核心
                pidfile /run/haproxy.pid  #haproxy 程序id存放位置
defaults                                  #預設配置
        log global                        #日志使用全局設定
        mode http                         #haproxy工作模式七層LB,程式會檢查使用者url
        maxconn 2048                      #haproxy最大連接配接數(優先級中)
        retries 3                         #健康檢查,對後端真實伺服器,3次失敗認為服務不可用
        option redispatch                 #重新比對,伺服器不可用後的操作,重定向至健康伺服器
        timeout connect 5000              #重傳計時器,定義haproxy将用戶端請求轉發至後端伺服器所等待的時間/毫秒
        timeout client 50000              #向後長連接配接,haproxy作為客戶,和後端伺服器之間空閑連接配接的逾時時間,到時發送fin指令
        timeout server 50000              #向前長連接配接,haproxy作為伺服器,和使用者之間空閑連接配接的逾時時間,到時發送fin指令

        option abortonclose               #關于關閉的選項,當伺服器過載過高,自動結束目前隊列處理較久的連接配接

        stats uri /admin?stats            #設定統計頁面的uri為/admin?stats
        stats realm Private lands         #設定統計頁面認證時的提示内容
        stats auth admin:password         #設定統計頁面認證的使用者和密碼,如果設定多個,另一行寫入即可
        stats hide-version                #隐藏統計頁面上的haproxy版本資訊

frontend http-in                          #前端虛拟伺服器
        bind 0.0.0.0:80                   #綁定位址,為本機所有IP服務
        mode http                         #面對前端http模式檢查使用者uri
        log global                        #可以對面向前端日志單獨存放,也可以放入本機全局設定
        option httplog                    #日志格式,記錄詳細
        option httpclose                  #關閉長連接配接

acl html url_reg -i \.html$               #通路控制列名名稱html,使用者url位址可以被正則比對,-i:忽略大小寫,if如果html規則命中,則向後端真實伺服器轉發
use_backend html-server if html           #如果滿足acl html規則,則推送給後端伺服器html-server
default_backend html-server               #預設的後端伺服器

backend html-server                              #真實伺服器
        mode http                                #觀察使用者url位址進行分發
        balance roundrobin                       #輪詢政策
        option httpchk GET /index.html           #健康狀态檢查檢視伺服器首頁
        cookie SERVERID insert indirect nocache  #将相同使用者請求,轉發給相同的真實伺服器
        server html-A web1:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
        server html-B web2:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5
#cookie 3 伺服器id,避免rr算法将客戶機請求轉發給其他伺服器,對後端伺服器的健康狀态檢查為2000毫秒,連續兩次健康檢查成功,則認為有效,連續五次健康檢查失敗,則認為當機
[[email protected] ~]# systemctl start haproxy        #啟動haproxy
           
  • 測試結果
Web伺服器群集——(HAproxy基本負載均衡)+(Nginx七層負載均衡叢集)+(HAproxy+Keepalived負載均衡叢集實作動靜分離)HAproxy概述初始HAproxy實作簡單的負載均衡Nginx七層負載均衡叢集HAproxy+Keepalived負載均衡叢集實作動靜分離
  • HAproxy配置檔案五部分
    • global:設定全局配置參數,屬于程序的配置,通常是和作業系統相關;
    • defaults:配置預設參數,這些參數可以被用到frontend,backend,Listen元件;
    • frontend:接收請求的前端虛拟節點,Frontend可以更加規則直接指定具體使用後端的backend;
    • backend:後端服務叢集的配置,是真實伺服器,一個Backend對應一個或者多個實體伺服器;
    • Listen:frontend和backend的組合體。

HAproxy狀态

http://192.168.100.10/admin?stats
           

密碼為剛才在配置檔案中配置的賬戶密碼

Web伺服器群集——(HAproxy基本負載均衡)+(Nginx七層負載均衡叢集)+(HAproxy+Keepalived負載均衡叢集實作動靜分離)HAproxy概述初始HAproxy實作簡單的負載均衡Nginx七層負載均衡叢集HAproxy+Keepalived負載均衡叢集實作動靜分離
Web伺服器群集——(HAproxy基本負載均衡)+(Nginx七層負載均衡叢集)+(HAproxy+Keepalived負載均衡叢集實作動靜分離)HAproxy概述初始HAproxy實作簡單的負載均衡Nginx七層負載均衡叢集HAproxy+Keepalived負載均衡叢集實作動靜分離

Nginx七層負載均衡叢集

  • 特點
    • 功能強大,性能卓越,運作穩定
    • 配置簡單靈活
    • 能夠自動剔除工作不正常的後端伺服器
    • 上傳檔案使用異步模式。client—nginx-web1 web2 web3 lvs同步請求DRclient–>dr—web1
    • 支援多種配置設定政策,可以配置設定權重,配置設定方式靈活。
  • 優勢
    • nginx複制使用者請求,在後端伺服器出現問題時,nginx會再複制一份請求發給另一台後端伺服器,lvs則在這種情況,隻能使用者重新發請求
  • 缺點
    • 流量會經過nginx,nginx成為瓶頸

生産架構

Web伺服器群集——(HAproxy基本負載均衡)+(Nginx七層負載均衡叢集)+(HAproxy+Keepalived負載均衡叢集實作動靜分離)HAproxy概述初始HAproxy實作簡單的負載均衡Nginx七層負載均衡叢集HAproxy+Keepalived負載均衡叢集實作動靜分離
  • Nginx配置
基于剛才的實驗環境
[[email protected] ~]# systemctl stop haproxy   #停止haproxy

nginx:192.168.100.10
Web1:192.168.100.20
Web2:192.168.100.30
           
  • 域名解析
[[email protected] ~]# vim /etc/hosts
192.168.100.10 nginx
192.168.100.20 web1
192.168.100.30 web2
192.168.100.40 client
[[email protected] ~]# scp /etc/hosts web1:/etc/
[[email protected] ~]# scp /etc/hosts web2:/etc/
[[email protected] ~]# scp /etc/hosts client:/etc/
#頁面準備使用剛才實驗的試驗首頁
           
  • 配置Nginx
[[email protected] ~]# yum -y install nginx
[[email protected] ~]# vim /etc/nginx/nginx.conf
...
#找到http子產品添加 upstream
http {
         upstream html {                        #上遊伺服器,伺服器名html
                 server web1:80;
                 server web2:80;
         }
...
#找到server子產品中的location /
         location / {
        		 proxy_pass http://html;       #html對應上方html伺服器叢集名
         }
...
[[email protected] ~]# systemctl restart nginx
           
  • 測試負載均衡
Web伺服器群集——(HAproxy基本負載均衡)+(Nginx七層負載均衡叢集)+(HAproxy+Keepalived負載均衡叢集實作動靜分離)HAproxy概述初始HAproxy實作簡單的負載均衡Nginx七層負載均衡叢集HAproxy+Keepalived負載均衡叢集實作動靜分離
如需做動靜分離添加location即可
#例:
location / {                                  upstream html {
													server web1:80;		
	}                                               server web2:80;
location ~\.html$ {									}
proxy_pass ...                                upstream php {
}                                                   server web3:80;
location ~\php$ {                                   server web4:80;
proxy_pass ...                                      }
}                                             server {
location ~\.(jpg|png|css|js)$ {                     location / {
proxy_pass ...                                      proxy_pass http://html;                            
}                                                   }
                                                    location ~\.php$ {
                                                    proxy_pass http://php;
                                                    }
           

HAproxy+Keepalived負載均衡叢集實作動靜分離

  • 基本的架構圖大概是這樣
    Web伺服器群集——(HAproxy基本負載均衡)+(Nginx七層負載均衡叢集)+(HAproxy+Keepalived負載均衡叢集實作動靜分離)HAproxy概述初始HAproxy實作簡單的負載均衡Nginx七層負載均衡叢集HAproxy+Keepalived負載均衡叢集實作動靜分離
主機 IP位址
HAproxy主(01) 192.168.100.50
HAproxy從(02) 192.168.100.51
html01 192.168.100.60
html02 192.168.100.61
php01 192.168.100.70
php02 192.168.100.71

安裝

HAproxy

Keepalived

[[email protected] ~]# yum -y install haproxy keepalived
[[email protected] ~]# yum -y install haproxy keepalived
           

配置HAproxy

[[email protected] ~]# vim /etc/haproxy/haproxy.cfg
global                                    #全局配置
        log 127.0.0.1 local3 info         #日志配置記錄本機日志中 local3 日志類型自定義 
        maxconn 4096                      #最大連接配接限制(優先級低)
        user nobody                       #運作haproxy使用者是誰/也可以寫99
        group nobody                      #組使用者
                daemon                    #守護程序常駐系統記憶體
                nbproc 1                  #haproxy程序數,該值的設定應與伺服器cpu核心數一緻,如16,即2顆8核心
                pidfile /run/haproxy.pid  #haproxy 程序id存放位置
defaults                                  #預設配置
        log global                        #日志使用全局設定
        mode http                         #haproxy工作模式七層LB,程式會檢查使用者url
        maxconn 2048                      #haproxy最大連接配接數(優先級中)
        retries 3                         #健康檢查,對後端真實伺服器,3次失敗認為服務不可用
        option redispatch                 #重新比對,伺服器不可用後的操作,重定向至健康伺服器
        timeout connect 5000              #重傳計時器,定義haproxy将用戶端請求轉發至後端伺服器所等待的時間/毫秒
        timeout client 50000              #向後長連接配接,haproxy作為客戶,和後端伺服器之間空閑連接配接的逾時時間,到時發送fin指令
        timeout server 50000              #向前長連接配接,haproxy作為伺服器,和使用者之間空閑連接配接的逾時時間,到時發送fin指令

        option abortonclose               #關于關閉的選項,當伺服器過載過高,自動結束目前隊列處理較久的連接配接

        stats uri /admin?stats            #設定統計頁面的uri為/admin?stats
        stats realm Private lands         #設定統計頁面認證時的提示内容
        stats auth admin:password         #設定統計頁面認證的使用者和密碼,如果設定多個,另一行寫入即可
        stats hide-version                #隐藏統計頁面上的haproxy版本資訊

frontend http-in                          #前端虛拟伺服器
        bind 0.0.0.0:80                   #綁定位址,為本機所有IP服務
        mode http                         #面對前端http模式檢查使用者uri
        log global                        #可以對面向前端日志單獨存放,也可以放入本機全局設定
        option httplog                    #日志格式,記錄詳細
        option httpclose                  #關閉長連接配接

acl html url_reg -i \.html$               #通路控制列名名稱html,使用者url位址可以被正則比對,-i:忽略大小寫,if如果html規則命中,則向後端真實伺服器轉發
acl php url_reg -i \.php$
        use_backend html-server if html   #如果滿足acl html規則,則推送給後端伺服器html-server
        use_backend php-server if php
default_backend html-server               #預設的後端伺服器

backend html-server                              #後端真實伺服器
        mode http                                #觀察使用者url位址進行分發
        balance roundrobin                       #輪詢政策rr
        option httpchk GET /index.html           #健康狀态檢查檢視伺服器首頁
        cookie SERVERID insert indirect nocache  #将相同使用者請求,轉發給相同的真實伺服器
        server html-A 192.168.100.60:80 weight 1 cookie 1 check inter 2000 rise 2 fall 5
        server html-B 192.168.100.61:80 weight 1 cookie 2 check inter 2000 rise 2 fall 5
#cookie 3 伺服器id,避免rr算法将客戶機請求轉發給其他伺服器,對後端伺服器的健康狀态檢查為2000毫秒,連續兩次健康檢查成功,則認為有效,連續五次健康檢查失敗,則認為當機
backend php-server                              #後端真實伺服器
        mode http                               #觀察使用者url位址進行分發
        balance roundrobin                       #輪詢政策rr
        option httpchk GET /index.php           #健康狀态檢查檢視伺服器首頁
        cookie SERVERID insert indirect nocache #将相同使用者請求,轉發給相同的真實伺服器
        server php-A 192.168.100.70:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
        server php-B 192.168.100.71:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5
[[email protected] ~]# scp -r /etc/haproxy/haproxy.cfg 192.168.100.51:/etc/haproxy/

[[email protected] ~]# systemctl start haproxy
[[email protected] ~]# systemctl start haproxy
           

網站配置

[[email protected] ~]# yum -y install httpd
[[email protected] ~]# echo html01 > /var/www/html/index.html
[[email protected] ~]# systemctl enable httpd --now

[[email protected] ~]# yum -y install httpd
[[email protected] ~]# echo html02 > /var/www/html/index.html
[[email protected] ~]# systemctl enable httpd --now

[[email protected] ~]# yum -y install httpd
[[email protected] ~]# echo php01 > /var/www/html/index.php
[[email protected] ~]# systemctl enable httpd --now

[[email protected] ~]# yum -y install httpd
[[email protected] ~]# echo php02 > /var/www/html/index.php
[[email protected] ~]# systemctl enable httpd --now
           

配置Keepalived

[[email protected] ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived                        #keepalived配置檔案文檔聲明
global_defs {                                              #全局配置
router_id 1                                                #路由器編号,裝置在組中的辨別
   }

vrrp_script chk_httpd {                                    #健康檢查 
       script "/etc/keepalived/ck_httpd.sh"                #檢查腳本
       interval 2                                          #檢查頻率/秒 
       weight -5                                           #優先級減5
       fall 3                                              #失敗三次 
       }

vrrp_instance VI_1 {                                       #VRRP子產品執行個體 VI_1,執行個體名,兩台路由器相同
        state MASTER                                       #主或從狀态
        interface ens32                                    #監控心跳網卡,(因為實驗環境就一張網卡是以監控ens32)
        mcast_src_ip 192.168.100.50                        #心跳源IP
        virtual_router_id 55                               #虛拟路由編号,主備一緻
        priority 100                                       #優先級
        advert_int 1                                       #心跳間隔/秒

        authentication {                                   #認證子產品
        auth_type PASS                                     #認證類型為密碼認證
        auth_pass 123456                                   #認證密碼123456(1-8位)
        }

virtual_ipaddress {                                        #VIP
        192.168.100.100/24
}

track_script {                                             #跟蹤腳本 
       chk_httpd
       }
}

#編寫keepalived主的監控腳本
[[email protected] ~]# vim /etc/keepalived/ck_httpd.sh
#!/bin/bash
A=`ps -C haproxy --no-header | wc -l`
if [  $A -eq 0 ];then
        systemctl start haproxy
        echo "haproxy start"
        sleep 3
        if [ `ps -C haproxy --no-header | wc -l` -eq 0 ];then
        systemctl stop keepalived
        echo "keepalived stop"
        fi
fi

[[email protected] ~]# scp -r /etc/keepalived/keepalived.conf 192.168.100.51:/etc/keepalived/
[[email protected] ~]# chmod +x /etc/keepalived/ck_httpd.sh
[[email protected] ~]# systemctl restart keepalived
[[email protected] ~]# systemctl enable keepalived
           

配置Keepalived

[[email protected] ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived                        #keepalived配置檔案文檔聲明
global_defs {                                              #全局配置
router_id 2                                                #路由器編号,裝置在組中的辨別
   }

vrrp_script chk_httpd {                                    #健康檢查
       script "/etc/keepalived/ck_httpd.sh"                #檢查腳本
       interval 2                                          #檢查頻率/秒
       weight -5                                           #優先級減5
       fall 3                                              #失敗三次
       }

vrrp_instance VI_1 {                                       #VRRP子產品執行個體 VI_1,執行個體名,兩台路由器相同
        state BACKUP                                       #主或從狀态
        interface ens32                                    #監控心跳網卡,(因為實驗環境就一張網卡是以監控ens32)
        mcast_src_ip 192.168.100.51                        #心跳源IP
        virtual_router_id 55                               #虛拟路由編号,主備一緻
        priority 90                                        #優先級
        advert_int 1                                       #心跳間隔/秒

        authentication {                                   #認證子產品
        auth_type PASS                                     #認證類型為密碼認證
        auth_pass 123456                                   #認證密碼123456(1-8位)
        }

virtual_ipaddress {                                        #VIP
        192.168.100.100/24
}

track_script {                                             #跟蹤腳本
       chk_httpd
       }
}

#編寫keepalived從的監控腳本
[[email protected] ~]# vim /etc/keepalived/ck_httpd.sh
#!/bin/bash
A=`ip a | grep 192.168.9.200 | wc -l`
B=`ps -ef | grep haproxy | grep -v grep | awk '{print $2}'`
if [ $A -gt 0 ];then
        systemctl start haproxy
else
        kill -9 $B
fi
[[email protected] ~]# chmod +x /etc/keepalived/ck_httpd.sh
[[email protected] ~]# systemctl restart keepalived
[[email protected] ~]# systemctl enable keepalived
           

測試

#浏覽器通路
http://192.168.100.100/
http://192.168.100.100/index.php

#伺服器間的測試,如下
           
  • 測試結果
    • 停止

      HAproxy主

      HAproxy

      服務,服務會在3秒後重新開機
    • 此時

      HAproxy主

      的虛拟IP依舊存在
      Web伺服器群集——(HAproxy基本負載均衡)+(Nginx七層負載均衡叢集)+(HAproxy+Keepalived負載均衡叢集實作動靜分離)HAproxy概述初始HAproxy實作簡單的負載均衡Nginx七層負載均衡叢集HAproxy+Keepalived負載均衡叢集實作動靜分離
#停止HAproxy的keepalived服務
[[email protected] ~]# systemctl stop keepalived
           
  • 再次檢視

    HAproxy從

    IP

    配置,虛拟IP已成功漂移,實驗完成!
    Web伺服器群集——(HAproxy基本負載均衡)+(Nginx七層負載均衡叢集)+(HAproxy+Keepalived負載均衡叢集實作動靜分離)HAproxy概述初始HAproxy實作簡單的負載均衡Nginx七層負載均衡叢集HAproxy+Keepalived負載均衡叢集實作動靜分離
  • 需要注意的是,測試中每測試一次需要清空一次緩存,因為配置檔案中設定對用戶端

    cookie

    緩存的原因