天天看點

高可用群集Haproxy+keepalived1.Haproxy2.Haproxy+keepalived實驗

文章目錄

  • 1.Haproxy
    • 1.1Haproxy與LVS比較
    • 1.2Haproxy排程算法及原理
  • 2.Haproxy+keepalived實驗
    • 2.1 NFS共享存儲伺服器配置
    • 2.2節點伺服器配置
    • 2.3排程伺服器配置
      • 2.3.1主排程伺服器
      • 2.3.2備排程伺服器
    • 2.4測試效果
      • 2.4.1正常狀态
      • 2.4.2當主排程器關閉haproxy服務時
      • 2.4.3當主排程器故障時
      • 2.4.4測試期間,web服務通路情況

1.Haproxy

1.1Haproxy與LVS比較

LVS在企業應用中抗負載能力很強,但存在不足

  • LVS不支援正則處理,不能實作動靜分離
  • 對于大型網站,LVS的實施配置複雜,維護成本相對較高

    Haproxy是一款提供高可用性、負載均衡、及基于TCP和HTTP應用的代理的軟體

  • 适用于負載大的Web站點
  • 運作在硬體上可支援數以萬計的并發連接配接的連接配接請求

1.2Haproxy排程算法及原理

1.RR

RR算法是最簡單最常用的一種算法,即輪詢排程

了解舉例

有三個節點A、B、C

第一個使用者通路會被指派到節點A

第二個使用者通路會被指派到節點B

第三個使用者通路會被指派到節點C

第四個使用者通路繼續指派到節點A,輪詢配置設定通路請求實作負載均衡效果

2.LC

最小連接配接數算法,根據後端的節點連接配接數大小動态配置設定前端請求

了解舉例

有三個節點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算法有很大改進,是目前用到比較多的一種算法

3.SH

基于來源通路排程算法,用于一些Session會話記錄在伺服器端的場景,可以基于來源的IP、Cookie等做叢集排程

了解舉例

有三個節點A、B、C,第一個使用者第一次通路被指派到了A,第二個使用者第一次通路被指派到了B

當第一個使用者第二次通路時會被繼續指派到A,第二個使用者第二次通路時依舊會被指派到B,隻要負載均衡排程器不重新開機,第一個使用者通路都會被指派到A,第二個使用者通路都會被指派到B,實作群集的排程

此排程算法好處是實作會話保持,但某些IP通路量非常大時會引起負載不均衡,部分節點通路量超大,影響業務使用

2.Haproxy+keepalived實驗

環境:

兩台排程伺服器:

主排程器:真實IP:192.168.20.80,虛拟IP:192.168.20.220

備排程器:真實IP:192.168.20.20,虛拟IP:192.168.20.220

兩台節點伺服器:

真實IP:192.168.20.100,192.168.20.40

一台NFS共享存儲伺服器:

位址192.168.20.10

一台客戶機

2.1 NFS共享存儲伺服器配置

yum -y install nfs-utils rpcbind
mkdir -p /opt/web1
mkdir -p /opt/web2
vi /etc/exports
/opt/web1 192.168.20.100/32(ro)
/opt/web2 192.168.20.40/32(ro)

systemctl start nfs
showmount -e	#檢視本機共享存儲釋出情況
           

2.2節點伺服器配置

web1

yum -y install gcc gcc-c++ pcre-devel zlib-devel
useradd -M -s /sbin/nologin nginx
tar -zxvf nginx-1.12.2.tar.gz
cd nginx-1.12.2/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
nginx		#啟動nginx
netstats -napt | grep nginx	#檢查80号端口是否開啟
showmount -e 192.168.20.10		#檢視nfs共享目錄釋出情況
mount 192.168.20.10:/opt/web1 /usr/local/nginx/html/
           

web2

yum -y install gcc gcc-c++ pcre-devel zlib-devel
useradd -M -s /sbin/nologin nginx
tar -zxvf nginx-1.12.2.tar.gz
cd nginx-1.12.2/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
nginx		#啟動nginx
netstats -napt | grep nginx	#檢查80号端口是否開啟
showmount -e 192.168.20.10		#檢視nfs共享目錄釋出情況
mount 192.168.20.10:/opt/web2 /usr/local/nginx/html/
           

2.3排程伺服器配置

2.3.1主排程伺服器

安裝依賴包

yum -y install gcc gcc-c++ make pcre-devel bzip2-devel
           

編譯安裝haproxy

tar -zxvf haproxy-1.4.24.tar.gz
cd haproxy-1.4.24
make TARGET=linux26		#定義核心
make install
           

編輯主配置檔案

mkdir /etc/haproxy
cp examples/haproxy.cfg /etc/haproxy/
vi /etc/haproxy/haproxy.cfg
# this config needs haproxy-1.1.28 or haproxy-1.2.1

global
        log /dev/log    local0 info
        log /dev/log    local0 notice
        #log loghost    local0 info
        maxconn 4096
        #chroot /usr/share/haproxy		#注釋此項
        uid 99
        gid 99
        daemon		#守護程序模式
        #debug
        #quiet
        #nbproc 2		#負載均衡并發連接配接數

defaults
        log     global		#定義日志為global配置中的日志定義
        mode    http		#模式為http
        option  httplog		#采用http日志格式記錄日志
        option  dontlognull		#
        #option http-server-close	#主動關閉http請求選項,建議在生産環境中使用
        retries 3	#重試次數,用于對群集節點的檢查
        #redispatch			#注釋此項
        maxconn 2000		#最大連接配接數,根據應用實際情況進行調整
        contimeout      5000	#連接配接逾時時間(ms)
        clitimeout      50000	#用戶端逾時時間(ms)
        srvtimeout      50000	#伺服器逾時時間(ms)

listen webcluster 0.0.0.0:80	#定義一個應用為webcluster
        option httpchk GET /index.html	#檢查伺服器的index.html檔案
        balance roundrobin		#負載均衡排程算法為輪詢rr
        server web1 192.168.20.100:80 check inter 2000 fall 3	#定義節點1
        server web2 192.168.20.40:80 check inter 2000 fall 3	#定義節點2
           

配置haproxy服務啟動

cd haproxy-1.4.24
cp examples/haproxy.init /etc/init.d/haproxy
vi /etc/init.d/haproxy
# chkconfig: 35 85 15

chmod +x /etc/init.d/haproxy
chkconfig --add haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
systemctl start haproxy
           

日志定義

vi /etc/haproxy/haproxy.cfg
log /dev/log    local0 notice
log /dev/log    local0 info

touch /etc/rsyslog.d/haproxy.conf
vi /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~

/var/log/haproxy/haproxy-info.log		#排程資訊日志
/var/log/haproxy/haproxy-notice.log		#啟動資訊日志
           

配置統計頁面

vi /etc/haproxy/haproxy.cfg
##最後添加
listen admin_stats		
	bind 0.0.0.0:1080	##設定Frontend和Backend的組合體,監控組的名稱,按需要自定義名稱
	mode http		#http7層模式
	option httplog		#采用http日志格式
	#log 127.0.0.1 local0 err		#錯誤日志記錄
	maxconn 10		#預設最大連接配接數
	stats refresh 30s		#統計頁面自動重新整理時間
	stats uri /stats		#統計頁面url
	stats realm XingCloud\ Haproxy		#統計頁面密碼框上提示文本		
	stats auth admin:admin			#設定監控頁面的使用者名和密碼:admin,可以設定多個使用者名
	stats auth Frank:Frank		#設定監控頁面的使用者和密碼:Frank
	stats hide-version		#隐藏統計頁面上haproxy的版本資訊
	stats admin if TRUE		#設定手工啟動/禁用,後端伺服器

浏覽器通路http://192.168.20.80:1080/stats
使用者名admin,密碼admin
           

配置keepalived

yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel
tar -zxvf keepalived-1.4.2.tar.gz
cd keepalived-1.4.2/
./configure --prefix=/
make && make install
cp keepalived/etc/init.d/keepalived /etc/init.d/
##将keepalived加入系統服務,可用systemctl管理
vi /etc/keepalived/keepalived.conf		#編輯配置檔案
! Configuration File for keepalived

vrrp_script chk_http_port {		#定義排程服務檢查腳本
script "/etc/keepalived/check_haproxy.sh"	#定義檢測haproxy排程服務腳本路徑
interval 2
weight -10	#當腳本生效時将優先級降10
}

global_defs {
   router_id LVS_1
}

vrrp_instance v1 {
    state MASTER
    interface ens33
    virtual_router_id 1
    priority 105
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {		#健康檢查使用的腳本
        chk_http_port		
    }
    virtual_ipaddress {
        192.168.20.220
    }
}
           

配置keepalived服務健康檢查腳本

#!/bin/bash
A=`ps -C haproxy --no-header |wc -l`
if [ $A -eq 0 ]		#如果haproxy程序數小于等于0
then	
haproxy -f /etc/haproxy/haproxy.cfg		
sleep 3			#則執行重新開機haproxy
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ]	#再次檢查haproxy程序數如果小于等于0
then
/etc/init.d/keepalived stop		#則關閉keepalived服務
fi
fi
           

2.3.2備排程伺服器

與主排程伺服器不同點:

修改keepalived主配置檔案

router_id LVS_2
state BACKUP
 priority 100
           

2.4測試效果

2.4.1正常狀态

主排程器獲得虛拟位址,備排程器未獲得虛拟位址

ip addr ##檢視ip位址資訊
           

高可用群集Haproxy+keepalived1.Haproxy2.Haproxy+keepalived實驗

高可用群集Haproxy+keepalived1.Haproxy2.Haproxy+keepalived實驗

2.4.2當主排程器關閉haproxy服務時

檢視keepalived日志資訊
tail -f /var/log/messages
           

keepalived利用腳本持續健康檢查檢測到haproxy程序小于等于0,即主排程器haproxy服務關閉,先将優先級下調,再繼續執行腳本重新開機haproxy,腳本執行成功,将優先級恢複,主排程器繼續承載服務

高可用群集Haproxy+keepalived1.Haproxy2.Haproxy+keepalived實驗

2.4.3當主排程器故障時

主排程器關閉網絡,模拟主排程器故障時,虛拟位址漂移,備排程伺服器獲得虛拟位址

高可用群集Haproxy+keepalived1.Haproxy2.Haproxy+keepalived實驗

2.4.4測試期間,web服務通路情況

客戶機通路虛拟位址192.168.20.220,web服務正常運作,無間斷及異常情況

高可用群集Haproxy+keepalived1.Haproxy2.Haproxy+keepalived實驗

客戶機再次通路(測試排程輪詢rr算法)

高可用群集Haproxy+keepalived1.Haproxy2.Haproxy+keepalived實驗

繼續閱讀