1. 程式人生 > >利用RHCS套件實現nginx高可用叢集

利用RHCS套件實現nginx高可用叢集

RHCS

簡介

RHCS即 RedHat Cluster Suite ,中文意思即紅帽叢集套件。
紅帽叢集套件(RedHat Cluter Suite, RHCS)是一套綜合的軟體元件,可以通過在部署時採用不同的配置,以滿足你的對高可用性,負載均衡,可擴充套件性,檔案共享和節約成本的需要。
它提供有如下兩種不同型別的叢集:
1、高可用性:應用/服務故障切換-通過建立n個節點的伺服器叢集來實現關鍵應用和服務的故障切換
2、負載均衡:IP 負載均衡-對一群伺服器上收到的 IP 網路請求進行負載均衡

特點

1、最多支援128個節點(紅帽企業Linux 3 和紅帽企業Linux 4 支援 16 個節點)。
2、可同時為多個應用提供高可用性。
3、NFS/CIFS 故障切換:支援 Unix 和 Windows 環境下使用的高可用性檔案。
4、完全共享的儲存子系統:所有叢集成員都可以訪問同一個儲存子系統。
5、綜合資料完整性:使用最新的 I/O 屏障(barrier)技術,如可程式設計的嵌入式和外部電源開關裝置(power switches)。
6、服務故障切換:紅帽叢集套件可以確保及時發現硬體停止執行或故障的發生並自動恢復系統,同時,它還可以通過監控應用來確保應用的正確執行並在其發生故障時進行自動重啟。

實現nginx的高可用

實驗環境

1、作業系統版本:RHEL6.5
2、主機:172.25.66.250,後面作為fence主機使用,暫時不用
server1:172.25.66.1,作為主節點,下載luci(提供Conga配置使用者介面),ricci,配置好nginx
server4:172.25.66.4,作為備用節點,下載ricci,配置好nginx
3、在server1與server4中配置高可用yum源

[source6.5]
name=source6.5
baseurl=http://172.25.66.250/source6.5
gpgcheck=0

[HighAvailability]
name=HighAvailability
baseurl=http://172.25.66.250/source6.5/HighAvailability
gpgcheck=0

[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.66.250/source6.5/LoadBalancer
gpgcheck=0

[ResilientStorage]
name=ResilientStorage
baseurl=http://172.25.66.250/source6.5/ResilientStorage
gpgcheck=0

[ScalableFileSystem]
name=ScalableFileSystem
baseurl=http://172.25.66.250/source6.5/ScalableFileSystem
gpgcheck=0

在這裡插入圖片描述
4、在物理及172.25.66.250做好虛擬機器的解析
vim /etc/hosts
在這裡插入圖片描述

實驗操作

一、開啟網頁luci管理介面
1:在server1上面下載 ricci(luci介面下的叢集管理) 和 luci ,在server4上面下載 ricci
在這裡插入圖片描述
2:下載好後,將所有服務設定為開機自啟動並開啟服務
在這裡插入圖片描述
在這裡插入圖片描述
3:在server1和server4中給ricci設定密碼
在這裡插入圖片描述
4:到物理機瀏覽器中輸入:https://172.25.66.4:8084,進入後點擊advance會出現以下介面(新增證書)
在這裡插入圖片描述
上圖所示,點選左下角Add Exception會彈出以下介面:
在這裡插入圖片描述
繼續點選上圖左下角的Confirm Security Exception 即可進入luci登陸介面:
在這裡插入圖片描述


使用server1的root使用者與密碼登陸,進入後彈出提示,點選OK即可
在這裡插入圖片描述
二、在luci介面中配置nginx的高可用
1:進入luci介面後,選擇manage Cluster一項後,點選右邊的create選項建立叢集
在這裡插入圖片描述
我們來建立一個名為gd_HA的叢集,並將叢集節點(server1與server4)新增進叢集

在這裡插入圖片描述
然後點選左下方的create cluster建立叢集,接下來需要等待一段時間,因為要下載所需要的包,我們在server1中使用ps ax檢視下載包的程序
在這裡插入圖片描述
下載完成後就會成功建立叢集並將節點加進叢集中
在這裡插入圖片描述
我們可以在server1和server4中使用叢集管理器clustat檢視節點狀態
在這裡插入圖片描述
在這裡插入圖片描述
2:建立錯誤恢復域,將sever1和server4新增在域中,即server1或server4出現故障時,切換到正常的那一個上,叢集開啟後,服務落在優先順序高的節點上。
點選選單第三個Failover Domain,然後點選Add
在這裡插入圖片描述
1和2表示優先順序,和keepalived相反,數字越小優先順序越高
點選create:
在這裡插入圖片描述
3:新增服務中所要用到的資源(以nginx高可用為例,新增VIP(叢集對外虛擬IP),啟動nginx服務的指令碼)
新增IP:
點選選單第四個resource,點選Add,選擇IP Address:(做這一步時,server1和4中一定要沒有100(下面設定的)這個ip)
在這裡插入圖片描述
點選Submit
新增nginx啟動指令碼:
我們系統中並沒有開啟,關閉nginx的指令碼,所以我們可以模仿httpd服務的指令碼,自己編寫nginx的指令碼,放在server1和server4的/etc/init.d/下並且給指令碼一個可執行許可權,編寫的指令碼如下:

#!/bin/bash
# nginx Startup script for the Nginx HTTP Server
# it is v.0.0.2 version.
# chkconfig: - 85 15
# description: Nginx is a high-performance web and proxy server.
#              It has a lot of features, but it's not for everyone.
# processname: nginx
# pidfile: /var/run/nginx.pid
# config: /usr/local/nginx/conf/nginx.conf
nginxd=/usr/local/nginx/sbin/nginx
nginx_config=/usr/local/nginx/conf/nginx.conf
nginx_pid=/var/run/nginx.pid
RETVAL=0
prog="nginx"
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x $nginxd ] || exit 0
# Start nginx daemons functions.
start() {
if [ -e $nginx_pid ];then
   echo "nginx already running...."
   exit 1
fi
   echo -n $"Starting $prog: "
   daemon $nginxd -c ${nginx_config}
   RETVAL=$?
   echo
   [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
   return $RETVAL
}
# Stop nginx daemons functions.
stop() {
        echo -n $"Stopping $prog: "
        killproc $nginxd
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid
}
# reload nginx service functions.
reload() {
    echo -n $"Reloading $prog: "
    #kill -HUP `cat ${nginx_pid}`
    killproc $nginxd -HUP
    RETVAL=$?
    echo
}
# See how we were called.
case "$1" in
start)
        start
        ;;
stop)
        stop
        ;;
reload)
        reload
        ;;
restart)
        stop
        start
        ;;
status)
        status $prog
        RETVAL=$?
        ;;
*)
        echo $"Usage: $prog {start|stop|restart|reload|status|help}"
        exit 1
esac
exit $RETVAL

做好上面的操作後,再次點選Add,選擇 script:
在這裡插入圖片描述
點選submit提交
4:最後,點選選單倒數第二個Service Groups,向叢集中新增上一部新增的資源。第一步是建立一個資源組(服務中要用到資源的集合)nginx,接著將資源新增進去。
點選Add:
在這裡插入圖片描述
然後點選上圖中左下方的Add Resource新增IP和指令碼(nginx):(先新增IP再新增指令碼)
在這裡插入圖片描述
在這裡插入圖片描述
點選submit提交,執行後server1和server4會出現100這個ip
在這裡插入圖片描述
在這裡插入圖片描述
5:此時我們的nginx高可用已經做好了,在server1或4中使用clustat可以檢視狀態
在這裡插入圖片描述
可以看到,此時正在工作的節點是server1,因為之前設定的優先順序server1高於server4
6:我們可以在瀏覽器訪問VIP
在這裡插入圖片描述
7:停掉server1上nginx的服務會發現server4取代了server1,繼續提供server1上有的服務,叢集處於高可用狀態
在這裡插入圖片描述
在這裡插入圖片描述
8:我們再次在瀏覽器中訪問VIP,因為高可用的作用,依然可以訪問成功
在這裡插入圖片描述
做到這一步,只是一個結點的nginx服務停了之後,另一個節點才順利頂替,如果網路掛掉或者電源關閉,則高可用模式會出現問題,如此,我們就要使用fence來進行電源管理

FENCE裝置與nginx高可用的結合

當意外原因導致主機異常或宕機時(而不是簡單的停掉服務時),備用機會首先呼叫fence裝置,然後通過fence裝置將異常的主機重啟或從網路上隔離,釋放異常主機佔據的資源,當隔離操作成功後,返回資訊給備用機,備用機在接到資訊後,開始接管主機的服務和資源。

fence

FENCE的原理:通過柵裝置可以從叢集共享儲存中斷開一個節點,切斷I/O以保證資料的完整性。當CMAN確定一個節點失敗後,它在叢集結構中通告這個失敗的節點,fenced程序將失敗的節點隔離,以保證失敗節點不破壞共享資料。它可以避免因出現不可預知的情況而造成的“腦裂”(split-brain)現象。“腦裂”是指當兩個節點之間的心跳線中斷時,兩臺主機都無法獲取對方的資訊,此時兩臺主機都認為自己是主節點,於是對叢集資源(共享儲存,公共IP地址)進行爭用,搶奪。
RHCS的Fence裝置可以分為兩種:內部Fence和外部Fence。內部fence有IBM
RSAII卡,HP的ILO卡,以及IPMI裝置等;外部FENCE裝置有UPS,SAN switch ,Network switch等。
當節點A上的柵過程發現C節點失效時,它通過柵代理通知光纖通道交換機將C節點隔離,從而釋放佔用的共享儲存。
當A上的柵過程發現C節點失效時,它通過柵代理直接對伺服器做電源power on/off,而不是去執行作業系統的開關機指令。

配置

在物理機(真機)裡面安裝fence_virtd 服務:
1、使用yum search fence來查詢安裝包:再找到的包中安裝下面3個
在這裡插入圖片描述
yum install fence-virtd.x86_64 fence-virtd-libvirt.x86_64 fence-virtd-multicast.x86_64 -y
2、編輯fence的配置檔案
fence_virtd -c
一直按回車,到Interface以行,在後面輸入br0回車,最後一項輸入y回車
3、如果沒有金鑰目錄,自己建立一個,並擷取金鑰
mkdir /etc/cluster
dd if=/dev/urandom of=fence_xvm.key bs=128 count=1
在這裡插入圖片描述
4、將修改好的金鑰檔案傳送給高可用節點server1和server4,保證server1和server4利用的是同一個金鑰
scp /etc/cluster/fence_xvm.key [email protected]:/etc/cluster
scp /etc/cluster/fence_xvm.key [email protected]:/etc/cluster
在這裡插入圖片描述
5、systemctl restart fence_virtd
6、在網頁管理luci中新增FENCE,保證叢集的高可用
(1)新增物理機的FENCE
add 選擇 fence virt(multcast)起個名字
在這裡插入圖片描述
(2)在node中新增已有fence裝置,分別起名為vmfence1和vmfence2
點選server1後拉到下面就會看見新增fence的地方
在這裡插入圖片描述
點選後輸入名稱vmfence1然後提交
在這裡插入圖片描述
接著在vmfence1中點選Add fence instance
檢視server1的UUID,填入domain中,提交
在這裡插入圖片描述
在這裡插入圖片描述
點選server4後,做同樣操作,名稱為vmfence2
7、在server1中執行fence_node server4,檢視server1和server4是否連線成功
在這裡插入圖片描述
連線成功
8、現在,有了fence進行電源管理,我們在將一個節點斷網或者斷電之後,另一個節點就會順利接替,在另一個節點開啟後,不會因為優先順序而改變正在使用的節點,必須是一個節點掛了之後另一個節點才會接替
測試:檢視正在使用的節點:clustat
在這裡插入圖片描述
接下來我們將server4的網路關閉:
在這裡插入圖片描述
到server1中檢視叢集節點狀態
在這裡插入圖片描述
可以看到,serevr1已經接替server4的工作,並且server4也已經自動重啟並加入叢集,這樣我們就利用fence真正的實現了nginx的高可用叢集。