伺服器群集—Haproxy+keepalived群集

康丶發表於2020-12-14

一、Haproxy

1.1 常見的Web叢集排程器

● 目前常見的Wb叢集排程器分為軟體和硬體
● 軟體通常使用開源的LVS、Haproxy、Nginx
● 硬體一般使用比較多的是F5,也有很多人使用國內的一些產品,如梭子魚、綠盟等

1.2 Haproxy應用分析

LVS在企業應用中抗負載能力很強,但存在不足
● LVS不支援正則處理,不能實現動靜分離
● 對於大型網站,LVS的實施配置複雜,維護成本相對較高
● LVS工作在TCP七層協議第四層

Haproxy是一款可提供高可用性、負載均衡、及基於TCP和HTTP應用的代理的軟體
● 適用於負載大的Web站點
● 執行在硬體上可支援數以萬計的併發連線的連線請求

1.3 Haproxy排程演算法原理(RR;LC;SH)

Haproxy支援多種排程演算法,最常用的有三種

1.31 ● RR (Round Robin)輪詢

RR演算法是最簡單最常用的一種演算法,即輪詢排程
理解舉例:
◆有三個節點A、B、C
第一個使用者訪問會被指派到節點A
第二個使用者訪問會被指派到節點B
第三個使用者訪問會被指派到節點C
第四個使用者訪問繼續指派到節點A,輪詢分配訪問請求實現負載均衡效果

1.32 ● LC (Least Connections)最小連線數

最小連線數演算法,根據後端的節點連線數大小動態分配前端請求
理解舉例:
有三個節點A、B、C,各節點的連線數分別為A:4、B:5、C:6
第一個使用者連線請求,會被指派到A上,連線數變為A:5、B:5、C:6
第二個使用者請求會繼續分配到A上,連線數變為A:6、B:5、C:6
再有新的請求會分配給B,每次將新的請求指派給連線數最小的客戶端
由於實際情況下A、B、C的連線數會動態釋放,很難會出現一樣連線數的情況
此演算法相比較rr演算法有很大改進,是目前用到比較多的一種演算法

1.33 ● SH (Source Hashing)來源訪問排程

基於來源訪問排程演算法,用於一些有Session會話記錄在伺服器端的場景,可以基於來源的IP、Cookie等做叢集排程
理解舉例:
有三個節點A、B、C,第一個使用者第一次訪問被指派到了A,第二個使用者第一次訪問被指派到了B
當第一個使用者第二次訪問時會被繼續指派到A,第二個使用者第二次訪問時依舊會被指派到B,只要負載均衡排程器不重啟,第一個使用者訪問都會被指派到A,第二個使用者訪問都會被指派到B,實現叢集的排程
此排程演算法好處是實現會話保持,但某些IP訪問量非常大時會引起負載不均衡,部分節點訪問量超大,影響業務使用

1.4 Haproxy安裝與啟動

在負載均衡器上安裝Haproxy
安裝步驟:
● 安裝基礎軟體包
● 編譯安裝haproxy
● 要注意作業系統版本,是32位系統還是64位
建立Haproxy的配置檔案
● 建立配置檔案目錄/etc/haproxy
● 將原始碼包提供的配置檔案樣例haproxy.cfg複製到配置檔案目錄中

1.5 Haproxy配置檔案詳解

Haproxy配置檔案通常分為三個部分
● global:全域性配置
● defaults:預設配置
● listen:應用元件配置

1.51 global配置引數

log127.0.0.1 lcal0:配置日誌記錄,local0為日誌裝置,預設存放到系統日誌
log127.0.0.1 loca1 notice: notice為日誌級別,通常有24個級別
maxconn4096:最大連線數
uid 99:使用者 uid
gid 99:使用者 gid

1.52 defaults配置項配置預設引數

一般會被應用元件繼承,如果在應用元件中沒有特別宣告,將安裝預設配置引數設定
log global:定義日誌為global配置中的日誌定義
mode http:模式為http option
httplog:採用http日誌格式記錄日誌
retries 3:檢查節點伺服器失敗連續達到三次則認為節點不可用
maxconn2000:最大連線數
contimeout5000:連線超時時間
clitimeout50000:客戶端超時時間
srvtimeout50000:伺服器超時時間

1.53 listen配置專案一般為配置應用模組引數

listen appli4- backup 0.0.0.0:10004:定義一個appli4- backup的應用
option httpchk /index.html檢查伺服器的index.html檔案
option persist:強制將請求傳送到已經down掉的伺服器(註釋掉,否則起服務會報錯)
balance roundrobin:負載均衡排程演算法使用輪詢演算法
server inst1 192.168.114.56:80 check inter 2000 fall 3:定義線上節點
server inst2 192.168 114.56:81 check inter 2000 fall 3 backup:定義備份節點

1.6 Haproxy引數優化

隨著企業網站負載增加,haproxy引數優化相當重要
● maxconn:最大連線數,根據應用實際情況進行調整,推薦使用10240
● daemon:守護程式模式,Haproxy可以使用非守護程式模式啟動,建議使用守護程式模式啟動
● nbproc:負載均衡的併發程式數,建議與當前伺服器CPU核數相等或為其2倍

  • retries:重試次數,主要用於對叢集節點的檢查,如果節點多,且併發量大,設定為2次或3次

● option http-server-close:主動關閉http請求選項,建議在生產環境中使用此選項
● timeout http-keep-alive:長連線超時時間,設定長連線超時時間,可以設定為10s
● timeout http-request: http請求超時時間,建議將此時間設定為5~10s,增加http連線釋放速度
● timeout client:客戶端超時時間,如果訪問量過大,節點響應慢,可以將此時間設定短一些,建議設定為1min左右就可以了

二、haproxy+keepalived叢集配置

2.1 haproxy+keepalived優點

1.可靠性和穩定性非常好,可以和硬體級的負載均衡裝置F5相媲美。

2.最高可同時維護40000-50000個併發連線,單位時間內處理的最大請求數為20000個。

3.支援8種負載均衡演算法,支援回話保持;支援虛擬主機功能;支援連線拒絕,全透明代理並且有一個功能強大的伺服器狀態監控介面。

4.擁有功能強大的ACL支援。

5.用haproxy構建群集的時候,比如後方代理兩個http,如果haproxy當機,後方的http正常執行網站也是癱瘓狀態,這就造成了單點故障。
這時keepalived就登場了,keepalived基於vrrp協議,兩臺主機之間生成一個虛擬的ip,我們稱漂移ip,漂移ip由主伺服器承擔,一但主伺服器當機,備份伺服器就會搶佔漂移ip,繼續工作,有效的解決了群集中的單點故障。兩者相結合,可靠穩定。

2.2 專案環境

在這裡插入圖片描述

2.3 主伺服器配置

2.31 haproxy配置

放入haproxy-1.4.24.tar軟體包

[root@server1 ~]# systemctl stop firewalld
[root@server1 ~]# setenforce 0
[root@server1 ~]# yum -y install gcc gcc-c++ make pcre-devel bzip2-devel
[root@server1 ~]# tar zxvf haproxy-1.4.24.tar.gz
[root@server1 ~]# cd haproxy-1.4.24/
[root@server1 haproxy-1.4.24]# make TARGET=linux26  #核心版本大於2.6的使用,指定核心
[root@server1 haproxy-1.4.24]# make install     #安裝
[root@server1 haproxy-1.4.24]# mkdir /etc/haproxy    #建立haproxy目錄
[root@server1 haproxy-1.4.24]# cp examples/haproxy.cfg /etc/haproxy/  #將軟體包中的配置檔案模板複製到haproxy目錄中
[root@server1 haproxy-1.4.24]# cd
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg  #修改haproxy.cfg配置引數
修改:
        maxconn 10240     #最大連線數

下面兩項前面加上註釋
#chroot /usr/share/haproxy     #固有目錄,可註釋掉
#redispatch       #當使用了cookie時,haproxy將會將其請求的後端伺服器的serverID插入到cookie中,以保證會話的SESSION永續性;而此時,如果後端的伺服器宕掉了,但是客戶端的cookie是不會重新整理的,如果設定此引數,將會將客戶的請求強制定向到另外一個後端server上,以保證服務的正常。需要註釋掉

將原來的所有listen配置項刪除,新增新配置:
listen webcluster 0.0.0.0:80      #監聽物件webcluster,監聽地址為所有地址,目標埠80
          option httpchk GET /index.html    #檢查網頁內容為站點下/index.html主頁
          balance roundrobin     #排程的演算法,rr輪詢
          server nginx1 192.168.100.30:80 check inter 2000 fall 3    #定義的節點nginx1,間隔時間及次數
          server nginx2 192.168.100.40:80 check inter 2000 fall 3    #定義的節點nginx1


優化服務啟動:
[root@server1 ~]# cp haproxy-1.4.24/examples/haproxy.init /etc/init.d/haproxy  #啟動指令碼檔案cp到/etc/init.d/目錄下生成haproxy檔案
[root@server1 ~]# vi /etc/init.d/haproxy   #配置檔案
修改:
# chkconfig: 35 85 15


[root@server1 ~]# chmod 755 /etc/init.d/haproxy    #給予執行許可權
[root@server1 ~]# chkconfig --add /etc/init.d/haproxy
[root@server1 ~]# chkconfig --list     #檢查haproxy35是否開啟
[root@server1 ~]# systemctl enable haproxy   #設定自啟動
[root@server1 ~]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy   #把命令連結出來方便使用
[root@server1 ~]# systemctl start haproxy     #啟動

在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述

2.32 keepalived配置

放入keepalived-2.0.13.tar軟體包

[root@server1 ~]# yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel   #安裝依賴包
[root@server1 ~]# tar zxvf keepalived-2.0.13.tar.gz      #解壓縮keepalived軟體包
[root@server1 ~]# cd keepalived-2.0.13/
[root@server1 keepalived-2.0.13]# ./configure --prefix=/    #配置
[root@server1 keepalived-2.0.13]# make && make install   #編譯與安裝
[root@server1 keepalived-2.0.13]# cp keepalived/etc/init.d/keepalived /etc/init.d     #把keepalived加入系統管理服務
[root@server1 keepalived-2.0.13]# cd
[root@server1 ~]# systemctl enable keepalived.service     #設定開機自啟
[root@server1 ~]# vim /etc/keepalived/keepalived.conf     #刪除所有配置,重新新增
! Configuration File for keepalived
global_defs {
     router_id lvs_01                               #本伺服器的名稱
}
vrrp_instance vi_1 {                              #定義VRRP熱備例項
    state MASTER                                  #熱備狀態,MASTER(主伺服器)
    interface ens33                                #承載VIP地址的物理介面
    virtual_router_id 51                          #虛擬路由器的ID號,每個熱備組保持一致
    priority 110                                       #優先順序,數值越大優先順序越高
    advert_int 1                                      #通告間隔秒數
    authentication {                                #熱備認證資訊,每個熱備組保持一致
          auth_type PASS                        #認證型別
          auth_pass 6666                        #密碼字串
    }
     virtual_ipaddress {                         #指定漂移地址(VIP192.168.100.100
}
}

[root@server1 ~]# systemctl start keepalived.service    #啟動服務
[root@server1 ~]# ip addr

在這裡插入圖片描述

2.4 備伺服器配置

2.41 haproxy配置(與主伺服器配置相同)

放入haproxy-1.4.24.tar軟體包

[root@server2 ~]# systemctl stop firewalld
[root@server2 ~]# setenforce 0
[root@server2 ~]# yum -y install gcc gcc-c++ make pcre-devel bzip2-devel
[root@server2 ~]# tar zxvf haproxy-1.4.24.tar.gz
[root@server2 ~]# cd haproxy-1.4.24/
[root@server2 haproxy-1.4.24]# make TARGET=linux26  #核心版本大於2.6的使用,指定核心
[root@server2 haproxy-1.4.24]# make install     #安裝
[root@server2 haproxy-1.4.24]# mkdir /etc/haproxy    #建立haproxy目錄
[root@server2 haproxy-1.4.24]# cp examples/haproxy.cfg /etc/haproxy/  #將軟體包中的配置檔案模板複製到haproxy目錄中
[root@server2 haproxy-1.4.24]# cd
[root@server2 ~]# vim /etc/haproxy/haproxy.cfg  #修改haproxy.cfg配置引數
修改:
        maxconn 10240     #最大連線數

下面兩項前面加上註釋
#chroot /usr/share/haproxy     #固有目錄,可註釋掉
#redispatch       #當使用了cookie時,haproxy將會將其請求的後端伺服器的serverID插入到cookie中,以保證會話的SESSION永續性;而此時,如果後端的伺服器宕掉了,但是客戶端的cookie是不會重新整理的,如果設定此引數,將會將客戶的請求強制定向到另外一個後端server上,以保證服務的正常。需要註釋掉

將原來的所有listen配置項刪除,新增新配置:
listen webcluster 0.0.0.0:80      #監聽物件webcluster,監聽地址為所有地址,目標埠80
       option httpchk GET /index.html    #檢查網頁內容為站點下/index.html主頁
       balance roundrobin     #排程的演算法,rr輪詢
       server nginx1 192.168.100.30:80 check inter 2000 fall 3    #定義的節點nginx1,間隔時間及次數
       server nginx2 192.168.100.40:80 check inter 2000 fall 3    #定義的節點nginx1


優化服務啟動:
[root@server2 ~]# cp haproxy-1.4.24/examples/haproxy.init /etc/init.d/haproxy  #啟動指令碼檔案cp到/etc/init.d/目錄下生成haproxy檔案
[root@server2 ~]# vi /etc/init.d/haproxy   #配置檔案
修改:
# chkconfig: 35 85 15


[root@server2 ~]# chmod 755 /etc/init.d/haproxy    #給予執行許可權
[root@server2 ~]# chkconfig --add /etc/init.d/haproxy
[root@server2 ~]# chkconfig --list     #檢查haproxy35是否開啟
[root@server2 ~]# systemctl enable haproxy   #設定自啟動
[root@server2 ~]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy   #把命令連結出來方便使用
[root@server2 ~]# systemctl start haproxy     #啟動

2.42 keepalived配置

放入keepalived-2.0.13.tar軟體包

[root@server2 ~]# yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel   #安裝依賴包
[root@server2 ~]# tar zxvf keepalived-2.0.13.tar.gz      #解壓縮keepalived軟體包
[root@server2 ~]# cd keepalived-2.0.13/
[root@server2 keepalived-2.0.13]# ./configure --prefix=/    #配置
[root@server2 keepalived-2.0.13]# make && make install   #編譯與安裝
[root@server2 keepalived-2.0.13]# cp keepalived/etc/init.d/keepalived /etc/init.d     #把keepalived加入系統管理服務
[root@server2 keepalived-2.0.13]# cd
[root@server2 ~]# systemctl enable keepalived.service     #設定開機自啟
[root@server2 ~]# vim /etc/keepalived/keepalived.conf     #刪除所有配置,重新新增
! Configuration File for keepalived
global_defs {
     router_id lvs_02                               #本伺服器的名稱
}
vrrp_instance vi_1 {                              #定義VRRP熱備例項
    state BACKUP                                  #熱備狀態,MASTER(主伺服器)
    interface ens33                                #承載VIP地址的物理介面
    virtual_router_id 51                          #虛擬路由器的ID號,每個熱備組保持一致
    priority 105                                       #優先順序,數值越大優先順序越高
    advert_int 1                                      #通告間隔秒數
    authentication {                                #熱備認證資訊,每個熱備組保持一致
          auth_type PASS                        #認證型別
          auth_pass 6666                        #密碼字串
    }
     virtual_ipaddress {                         #指定漂移地址(VIP192.168.100.100
}
}

[root@server2 ~]# systemctl start keepalived.service    #啟動服務
[root@server2 ~]# ip addr

在這裡插入圖片描述

2.5 nginx1伺服器配置

放入nginx-1.12.2.tar軟體包

[root@server3 ~]# systemctl stop firewalld
[root@server3 ~]# setenforce 0
[root@server3 ~]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel
[root@server3 ~]# tar zxvf nginx-1.12.2.tar.gz
[root@server3 ~]# useradd -M -s /sbin/nologin nginx  #建立不帶宿主,不可登入nginx使用者
[root@server3 ~]# cd nginx-1.12.2
[root@server3 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx  --user=nginx --group=nginx
[root@server3 nginx-1.12.2]# make && make install  #編譯安裝nginx
[root@server3 nginx-1.12.2]# cd
[root@server3 ~]# echo "<h1>Nginx1</h1>" > /usr/local/nginx/html/index.html    #建立首頁內容
[root@server3 ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin    #命令連結,方便使用
[root@server3 ~]# nginx     #開啟
[root@server3 ~]# netstat -anpt | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      57499/nginx: master 

2.6 nginx2伺服器配置

放入nginx-1.12.2.tar軟體包

[root@server4 ~]# systemctl stop firewalld
[root@server4 ~]# setenforce 0
[root@server4 ~]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel
[root@server4 ~]# tar zxvf nginx-1.12.2.tar.gz
[root@server4 ~]# useradd -M -s /sbin/nologin nginx  #建立不帶宿主,不可登入nginx使用者
[root@server4 ~]# cd nginx-1.12.2
[root@server4 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx  --user=nginx --group=nginx
[root@server4 nginx-1.12.2]# make && make install  #編譯安裝nginx
[root@server4 nginx-1.12.2]# cd
[root@server4 ~]# echo "<h1>Nginx2</h1>" > /usr/local/nginx/html/index.html    #建立首頁內容
[root@server4 ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin    #命令連結,方便使用
[root@server4 ~]# nginx     #開啟
[root@server4 ~]# netstat -anpt | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      59567/nginx: master

2.7 訪問測試

瀏覽器輸入:http://192.168.100.100
在這裡插入圖片描述

等待後重新整理
在這裡插入圖片描述

客戶機解析
在這裡插入圖片描述

三、haproxy日誌管理(主備伺服器都配置)

[root@server1 ~]# vi /etc/haproxy/haproxy.cfg
修改:
global
        log /dev/log    local0 info    #啟用本地日誌,級別info
        log /dev/log    local0 notice

[root@server1 ~]# systemctl restart haproxy      #重啟服務,記錄日誌
[root@server1 ~]# vi /etc/rsyslog.d/haproxy.conf

新增:
if ($programname == 'haproxy' and $syslogseverity-text == 'info')    #如果程式是haproxy,並且日誌型別是info
then -/var/log/haproxy/haproxy-info.log    #則建立一個日誌
&~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~

[root@server1 ~]# systemctl restart rsyslog
[root@server1 ~]# systemctl restart haproxy
[root@server1 ~]# cd /var/log/haproxy/
[root@server1 haproxy]# ll   #檢視
總用量 8
-rw-------. 1 root root 329 1211 02:52 haproxy-info.log    #haproxy排程資訊
-rw-------. 1 root root 132 1211 02:52 haproxy-notice.log   #haproxy啟動資訊

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

關閉主伺服器後,漂移ip由備份伺服器承擔 ,繼續工作
[root@server1 ~]# systemctl stop keepalived
在這裡插入圖片描述
在這裡插入圖片描述

在備伺服器上檢視日誌
[root@server2 ~]# cd /var/log/haproxy/
[root@server2 haproxy]# tail -100 /var/log/messages
在這裡插入圖片描述
[root@server2 haproxy]# cat haproxy-info.log
[root@server2 haproxy]# cat haproxy-notice.log
在這裡插入圖片描述
在這裡插入圖片描述

相關文章