1. 程式人生 > >高可用負載均衡叢集之 HAProxy 部署

高可用負載均衡叢集之 HAProxy 部署

一、HAProxy 簡介

    1、HAProxy 是開源、免費、快速並且可靠的一種解決方案,他可以執行在大部分主流的 Linux 伺服器上。

    2、HAProxy 適用於負載那些特大的 WEB 站點,而這些站點通常又需要會話保持或者進行七層處理。

    3、HAProxy 是能夠提供高可用性、負載均衡以及基於 L4(TCP) 和 L7(HTTP)的應用的代理。

    4、HAProxy 功能豐富,且效能穩定。

二、影響 HAProxy 負載均衡器的效能因素

    1、Session 會話率:即每秒產生的會話數,這個因素取決於客戶端的訪問量,因此,訪問量越大,Session 會話率越大,負載均衡壓力就越大。

    2、Session concurrency 併發會話數:即併發會話數越多,伺服器處理的會話時間就越長,客戶端表現出來的訪問就會越慢。

    3、Date rate 資料速率:它以 MB/s 或者 Mbps 來衡量,其資料量越大,併發會話數就會增加,併發會話數越多、資料速率越高,所要求使用的記憶體就越多。

    因此,這三個因素,在高併發負載均衡中,可能會成為 HAProxy 的效能瓶頸。

三、HAProxy 負載均衡器的核心功能和關鍵特性

    1、HAProxy 的核心功能

    負載均衡:HAProxy 的負載均衡有兩種模式,分別為 L4(TCP) 和 L7(HTTP),這兩種負載均衡均支援以下負載均衡排程演算法:

              roundrobin:動態輪詢演算法

              rr:輪詢演算法

              static-rr:靜態輪詢演算法

              lc:最少連線

              IP Hash:IP 地址雜湊(包括源地址和目標地址)

              URL_PARAM Hash:對使用者請求的 uri 僅  params 部分中的引數的值作hash計算

              HTTP_HEADER Hash:對使用者請求的 uri 的 http 頭部資訊作hash計算

    這裡僅列舉常用的這些演算法,當然還有其他演算法,都不常用。

    健康檢查:其實健康檢查可以算作 HAProxy 的一種工作模式,不過這種工作模式,現在幾乎很少用到,所以,健康檢查,一般是做為 L4(TCP) 和 L7(HTTP)的狀態檢查。

    會話保持:對於未實現會話共享的應用叢集,可通過 Insert Cookie/Rewrite Cookie/Prefix Cookie,以及上述的多種Hash方式實現會話保持。

    解析 SSL:HAProxy 可以解析 HTTPS 協議,並且能夠將客戶端 HTTPS 請求解密為 HTTP 後向後端傳輸。

    HTTP 請求重寫和重定向:HAProxy 可以使用正則表示式將 HTTP 請求重寫和重定向。

    監控與統計:HAProxy 提供了基於 WEB 介面的統計資訊頁面,在該頁面能夠展示應用伺服器的健康狀態和資料流量。做為運維,我們可以基於此頁面來開發監控程式以監控 HAProxy 的狀態。

    2、HAProxy 的關鍵特性

    關於 HAProxy 的特性,其實和 HTTP 協議的特性是是息息相關的。

    a、HTTP 事務模型:

          - HTTP 協議是事務驅動的

          - 每個請求(Request)僅能對應一個響應(Response)

          - HTTP 常用連結模式

                     HTTP close:每個 Request 產生且僅產生一個 Response,客戶端傳送請求時,將建立一個從客戶端到服務端的 TCP 連線,客戶端傳送的每一個 Request 都經過此連線傳送給服務端,然後服務端發出 Response 報文。隨後這個 TCP 連線將關閉,下一個 Request 將重新開啟一個 tcp連線進行傳送。

                     Keep-alive:Http close 模式下,TCP 連結會隨著 Response 的關閉而關閉,因此,頻繁的連結和關閉會造成資源和時間的大量消耗。為了避免這種情況,在伺服器端傳送 Response 時給出 content-length 的標記,讓客戶端知道還有多少內容沒有接收到,沒有接收完則tcp連線不關閉。這種模式我們稱為 “Keep-alive”。

                     Pipelining:這種模式能夠提升 Http close ,不過它任然使用 keep-alive 模式。但是在使用這種模式時,客戶端不需要等待收到服務端的 Response 後才傳送後續的 Request 請求。因此,這種模式在請求含有大量圖片的頁面時很有用,所以能夠很好的提高效能。

           HAProxy 支援的 5 種連線模式:

           1、keep alive:分析並處理所有的 Request 和  Response(預設),當後端為靜態或快取伺服器建議使用此模式

           2、tunnel:僅分析處理第一個 Request 和 Response,剩餘所有內容不進行任何分析直接轉發。較早的版本使用,現在已基本不用。

           3、passive close:在請求和響應首部加上 "connection:close" 標記的 tunnel ,在處理完第一個 Request 和 Response 後嘗試關閉兩端連線。

           4、server close:處理完第一個 Response 後關閉和 Server 端的連線,但和客戶端的連線仍然保持,當後端為動態應用程式伺服器組建議使用此模式

           5、forced close:傳輸完一個response後客戶端和服務端都關閉連線。

  b、HAProxy 使用單執行緒,能夠減少上下文切換時對資源的消耗。

  c、HAProxy 能夠最大化的利用系統本身的特性,是的系統在處理請求時能發揮出最高的效能。

四、HAProxy 安裝和配置

伺服器地址分配

image

    1、HAProxy 的安裝

         在這裡,我們採用 yum 源安裝:

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

    2、HAProxy的配置:

         a、日誌配置

對於 HAProxy 的日誌配置,我們這裡需要介紹下系統日誌的構成。對於系統日誌,主要有兩部分構成,即

Faciliti.priority,這種構成相當於  服務.優先順序

Facility 可以是這些關鍵字:auth, authpriv, cron, daemon, kern, lpr, mail, mark, news, security, syslog, user, uucp 以及 local0 到 local7。local0 到 local7 是預留出來的介面,給第三方應用呼叫。

priority可以使用的關鍵字:debug, info, notice, warning, warn, err, error, crit, alert, emerg, panic 。debug 是最不嚴重的級別,panic 是最嚴重的級別。如果日誌級別優先順序是 info,表示比 info 嚴重的日誌都需要記錄。

而對於關鍵字的獲取,我們可以在 rsyslog.conf 中獲得,使用命令 man 5 rsyslog.conf  ,一直往下找 SELECTORS(選擇器)。

         b、配置本機接收通過網路發來的日誌,即日誌伺服器的配置:

[[email protected] ~]# vim /etc/rsyslog.conf

image

取消上圖中紅框內內容的註釋即可,圖中已取消。

重啟 rsyslog 服務

[[email protected] ~]# systemctl restart rsyslog

         c、HAProxy 的配置檔案解釋

HAProxy 的配置檔案位於 /etc/haproxy/ 目錄下,如圖:

3

如圖,HAProxy 的配置檔案分為 5 部分:global、defaults、frontend、backend static、backend app

但是在實際配置過程中,我們可將後面三部分簡化為 listen。因此,我們在這裡對 global、defaults 部分的配置欄位做一一解釋,如下表:

image

         d、HAProxy 配置檔案修改

一般情況下,第一部分 global 和第二部分 defaults 不用修改,保持預設即可,因此,我們這裡主要進行第三部分 listen 的修改。

我們將

image

行下的部分全部刪除,然後新增 listen 部分:

listen stats                                                                                                                                                                            #這裡的 stats 可以自定義

         bind 0.0.0.0:1050                                                                                                                                                         #監聽埠,可自定義

         stats refresh 30s                                                                                                                                                          #統計頁面自動重新整理時間

         stats uri /monitor                                                                                                                                                        #統計頁面 url

         stats realm Haproxy Monitor                                                                                                                                      #統計頁面密碼框提示文字

         stats auth admin:admin                                                                                                                                              #統計頁面使用者名稱和密碼

         stats hide-version                                                                                                                                                        #隱藏統計介面上的 HAProxy 的版本資訊


listen myweb 0.0.0.0:80                                                                                                                                                        #可以自定義命名,網址+ip+埠

         cookie SERVERID rewrite

         balance roundrobin                                                                                                                                                     #動態輪詢排程演算法

         server web1 172.16.0.3:80 cookie application1instances1 check inter 2000 rise 2 fall 5

         server web2 172.16.0.4:80 cookie application1instances2 check inter 2000 rise 2 fall 5                                            #表示後端伺服器 web1 和 web2 ,IP 地址分別為 172.16.0.3 和 172.16.0.4,通過寫cookie資訊設定狀態,application,應用,instances,例項,check對伺服器做健康檢查,inter 2000毫秒,如果連續兩次檢查都是成功的(rise 2)則說明伺服器是好的,如果連續五次檢查都是失敗的(fall 5)則說明伺服器是壞的。

如圖:

image

儲存並退出,啟動或重啟(之前有啟動過) HAProxy 服務。

[[email protected] ~]# systemctl start haproxy

[[email protected] ~]# systemctl restart haproxy

         e、驗證

首先,我們驗證站點訪問,在瀏覽器中輸入http://192.168.20.140/,結果如圖:

imageimage

其次,我們驗證監控站點,在瀏覽器中輸入http://192.168.20.140:1050/monitor,如圖:

會要我們輸入使用者名稱和密碼,就是我們在配置檔案中設定的 admin

image

登陸之後,介面如下:

image

如圖,在左邊紅框內,主要展示一些 HAProxy 伺服器的狀態,包括啟動時間、PID號等等,而右邊紅框內主要展示顏色標誌,具體的顏色變化會展示在下邊的 web1、web2 的行,需要注意的時,4個顏色的變化,如下圖:

image  表示服務線上正常

image      表示服務線上,但是已經 down 掉

image   表示服務已經 down 掉,但是正在恢復中

image     表示服務已經全部 down 掉,無法提供服務

以上配置是 HAProxy 的 L7(HTTP)負載均衡配置。下面我們看下 L4(TCP)負載均衡配置

五、HAProxy 的 L4 (TCP)配置

    其實 HAProxy 的 L4(TCP)配置和 L7(HTTP)配置是差不多的,只需要更改如下三個地方

1、將配置檔案中 mode http 修改為 mode tcp ,表示開啟 TCP 模式

2、將配置檔案中 option httplog 修改為 option tcplog ,表示開啟 tcplog

3、將 balance roundeobin 修改為 balance source,表示基於客戶端的 IP 會話保持。

而其他部分暫時可以不用修改,在使用過程中,我們可以根據實際資料進行更改。

六、日誌檢視

    前面我們配置了 HAProxy 的日誌,它的日誌會記錄在系統的 messages 日誌裡面,現在我們來看一下,日誌的內容

    圖片.png

    當我們訪問站點時,日誌會在 messages 中重新整理,如上圖,主要會記錄後端伺服器的訪問情況以及當會話閒置時 HAProxy 的狀態日誌,當然,我們只是配置僅限有日誌,並未配置其他型別的日誌進行記錄,所以這裡只會顯示這麼多。

到此為止,我們的 HAProxy 部署配置已結束,如果想了解更多相關的只是,請參閱官方文件。官方文件