18.1 叢集介紹

叢集或者說是群集:其目的是為了實作将多台計算機組合以來完成特定的任務,比如天氣預報,大型網絡遊戲,這些都需要很大的運算量,單台計算機實作成本太高,而且不現實。那麼就需要通過叢集的方式,将閑置的或者正在使用的計算機聯合起來,結合整體的力量來解決這些問題,其實就是多個計算機組合成一個大的計算機罷了。
叢集的類型大緻分為三類:
1.LB Load Balancing(負載均衡叢集)
2.HA High Availability(高可用性叢集)
3.HP High Performance(高性能叢集)
簡單說明下這三種類型的叢集:
1. 負載均衡型的叢集目的是為了提高服務的并發能力,比如三台WEB伺服器組合成一個叢集,我們就需要用這種類型的叢集來實作負載均衡,既讓這三台WEB伺服器的負載平均一些,不至于有很空閑的伺服器。
2. 高可用性的叢集目的是為了提供7*24小時服務的能力,通過提供備援伺服器,來防止宏機造成的服務中斷
3. 高性能叢集目的是為了在短期内解決大量複雜的計算,常見的天氣預報系統,科學勘探,人口普查等等
同時,叢集提供了非常好的擴充/縮減性非常,可以友善的增加或者減少伺服器。
18.2 keepalived介紹
Keepalived是Linux下一個輕量級别的高可用解決方案。高可用(High Avalilability,HA),其實兩種不同的含義:廣義來講,是指整個系統的高可用行,狹義的來講就是之主機的備援和接管,
它與HeartBeat RoseHA 實作相同類似的功能,都可以實作服務或者網絡的高可用,但是又有差别,HeartBeat是一個專業的、功能完善的高可用軟體,它提供了HA 軟體所需的基本功能,比如:心跳檢測、資源接管,檢測叢集中的服務,在叢集節點轉移共享IP位址的所有者等等。HeartBeat功能強大,但是部署和使用相對比較麻煩,
與HeartBeat相比,Keepalived主要是通過虛拟路由備援來實作高可用功能,雖然它沒有HeartBeat功能強大,但是Keepalived部署和使用非常的簡單,所有配置隻需要一個配置檔案即可以完成,
Keepalived起初是為LVS設計的,專門用來監控叢集系統中各個服務節點的狀态,它根據TCP/IP參考模型的第三、第四層、第五層交換機制檢測每個服務節點的狀态,如果某個伺服器節點出現異常,或者工作出現故障,Keepalived将檢測到,并将出現的故障的伺服器節點從叢集系統中剔除,這些工作全部是自動完成的,不需要人工幹涉,需要人工完成的隻是修複出現故障的服務節點。
後來Keepalived又加入了VRRP的功能,VRRP(Vritrual Router Redundancy Protocol,虛拟路由備援協定)出現的目的是解決靜态路由出現的單點故障問題,通過VRRP可以實作網絡不間斷穩定運作,是以Keepalvied 一方面具有伺服器狀态檢測和故障隔離功能,另外一方面也有HA cluster功能。
Keepalived體系結構圖:
18.3 用keepalived配置高可用叢集(上)
想要使用Keepalived做這個叢集的實驗,需要準備兩台機器,一台作為master,另一台作為backup。
我這裡示例使用的master機器的IP是192.168.77.130
backup機器的IP是192.168.77.128
1. 并且兩台機器都需要安裝Keepalived,安裝指令如下:
yum install -y keepalived
2. 然後就是安裝Nginx(兩台機器都需要安裝),在這裡我使用Nginx作為一個負載均衡器,因為在許多的企業中用Nginx作為負載均衡的也不少,是以使用Nginx來作為示範會更接近在企業中的應用。安裝指令如下:
yum install -y nginx
提示:我這裡為了減少步驟和降低搭建過程的複雜度,是以使用yum來安裝,一般在企業中是使用二進制或者源碼包來安裝Nginx的。
如果你的機器沒有安裝epel擴充源,需要先安裝擴充源,指令如下:
yum install -y epel-release
- 編輯master機器上的keepalived配置檔案,配置檔案模闆可以從以下網址獲得:
https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_keepalived.conf
或者直接從這裡複制(但是要記得把注釋去掉):
global_defs { //定義全局參數
notification_email { //定義出現問題的時候,給這個郵箱發送郵件
}
notification_email_from [email protected] //定義問題郵件由哪一個郵箱發出去
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx { //檢測服務是否正常
script "/usr/local/sbin/check_ng.sh"
interval 3 //檢測的間斷為3秒鐘
}
vrrp_instance VI_1 { //定義master相關的資訊
state MASTER //定義角色為master
interface ens33 //定義網卡名稱(你機器上能夠正常通信的網卡名稱)
virtual_router_id 51 //定義路由器的id
priority 100 //定義權重,主角色和從角色的權重是不一樣的
advert_int 1 //
authentication { //定義認證相關的資訊
auth_type PASS //定義認證的形式為使用密碼認證
auth_pass 123456 //定義密碼
}
virtual_ipaddress { //定義vip,這是一公有ip,也就是從和主都共同使用這個ip
192.168.77.100
}
track_script { //加載檢測腳本
chk_nginx
}
}
使用以下指令清空keepalived的配置檔案裡的内容:
> /etc/keepalived/keepalived.conf
然後編輯keepalived配置檔案:
vim /etc/keepalived/keepalived.conf
把模闆内容複制粘貼進去,注意:最好是檢查一下粘貼後的内容和模闆的内容是否一緻,確定沒有複制少了,如果這個配置檔案有問題的話,keepalived就啟動不起來了。粘貼完了之後,要修改一下,将幾個配置修改為你機器上的資訊:
- 網卡名稱,要定義你自己的網卡名稱。
- global_defs那一段可以自定義,可以自己根據實際情況修改
- 可以定義一個自己的密碼
- vip位址,最好是你虛拟機的ip段的位址
- 在master機器上定義監控腳本,腳本的内容可以從以下網址獲得:
https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_check_ng.sh
或者直接從這裡複制:
#!/bin/bash
#時間變量,用于記錄日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#計算nginx程序數量
n=`ps -C nginx --no-heading|wc -l`
#如果程序為0,則啟動nginx,并且再次檢測nginx程序數量,
#如果還為0,說明nginx無法啟動,此時需要關閉keepalived
if [ $n -eq "0" ]; then
/etc/init.d/nginx start
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
這是檢查Nginx是否正常的一個shell腳本。
編輯腳本檔案(這個腳本檔案的路徑是可以在keepalived.conf檔案中自定義的):
vim /usr/local/sbin/check_ng.sh
将複制的内容粘貼進去:
注意: 如果你的nginx是yum安裝的,那麼就要把/etc/init.d/nginx start那行,改為systemctl start nginx。
- 編輯完腳本後,給這個腳本檔案設定755權限(不設定這個權限的話,就無法自動加載這個腳本):
chmod 755 /usr/local/sbin/check_ng.sh
18.4 用keepalived配置高可用叢集(中)
上一部分我們就已經在master機器上配置好了keepalived,配置好之後就是啟動keepalived服務,并且需要檢視一下程序是否存在:
systemctl start keepalived
ps aux |grep keepalived
如圖,則是沒有問題,服務啟動成功了。
如果你的機器上啟動了nginx服務的話,先關閉nginx:
service nginx stop
然後再檢視nginx的程序:
ps aux |grep nginx
會發現nginx自動啟動了,這就證明檢測腳本沒問題。
關于keepalived的日志記錄,我們可以在/var/log/messages日志檔案中檢視:
使用ip add 指令檢視vip是否存在:
使用ifconfig指令是檢視不到vip的,需要使用ip add 指令。
在搭建叢集的時候,需要先把selinux給關閉,防火牆的規則也要清空,兩台機器都需要關閉和清空規則:
清空防火牆規則:
iptables -F
關閉selinux:
setenforce 0
配置backup機器:
master機器配置完後,就需要到backup機器上進行配置了。同樣的在backup機器上第一件要做的事情就是配置keepalived配置檔案:
1. 清空keepalived.conf檔案:
> /etc/keepalived/keepalived.conf
2. 然後編輯keepalived配置檔案:
vim /etc/keepalived/keepalived.conf
- 複制模闆内容(模闆内容同樣的在上面那個網址獲得),粘貼進去。然後修改以下幾個地方:
- 網卡名稱,要定義你自己的網卡名稱。
- state參數要改為backup
- priority(權重)參數改為90
- global_defs那一段可以自定義,可以自己根據實際情況修改
- 可以定義一個自己的密碼
- virtual_ipaddress(vip位址)參數,定義和master機器同樣的位址
4. 同樣的要編輯檢測腳本,腳本的内容可以從以下網址獲得,我這裡的腳本和master機器的配置有些差别,因為我backup機器的nginx是yum安裝的,而master機器的nginx則是源碼包安裝的,是以在啟動指令上不一樣,可以根據實際情況更改啟動方式:
https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/backup_check_ng.sh
編輯腳本檔案:
vim /usr/local/sbin/check_ng.sh
将複制的内容粘貼進去:
5. 編輯完腳本後,給這個腳本檔案設定755權限(不設定這個權限的話,就無法自動加載這個腳本):
chmod 755 /usr/local/sbin/check_ng.sh
- 啟動keepalived服務,并檢視程序:
systemctl start keepalived
ps aux |grep keepalived
- 修改一下master機器的nginx的預設通路頁的内容(預設頁的路徑在nginx的預設虛拟主機配置檔案中檢視):
vim /data/wwwroot/default/index.html
修改内容如下:
- 使用浏覽器通路master機器的ip位址,看看是否會顯示修改後的内容:
如圖,則是沒問題。
- 這次修改backup機器的nginx預設通路頁内容,因為是yum安裝的,是以路徑不一樣:
vim /usr/share/nginx/html/index.html
因為是yum安裝的,是以會自帶有内容,需要先清空一下:
> /usr/share/nginx/html/index.html
接着修改内容如下:
10.使用浏覽器通路backup機器的ip位址,看看是否會顯示修改後的内容:
如圖,則是沒問題。
以上這幾個步驟是為了确認nginx能夠被正常通路。
接下來我們需要通路vip,确認vip也能夠被通路:
如圖,可以看到能夠被正常通路,而且預設就是通路master機器的。
18.5 用keepalived配置高可用叢集(下)
完成上述步驟之後,我們的高可用叢集就搭建好來了,接下來我們需要測試一下這個高可用叢集:
測試1:關閉master上的nginx服務
關閉之後任然會被keepalived服務啟動,代表沒問題。
測試2:在master機器上增加iptabls規則:
iptables -I OUTPUT -p vrrp -j DROP
依舊能夠被通路,這種情況就不屬于master當機:
測試完之後清空規則:
iptables -F
測試3:關閉master機器上的keepalived服務
systemctl stop keepalived
然後可以看到master機器上的vip被釋放了,不存在了:
這時vip被backup機器所監聽了,這就類似于生産環境中,master機器當機了,然後backup機器就會頂替master機器:
現在再去通路vip位址,會發現變成了backup機器上預設頁裡的内容:
這種情況就是master當機了,這一步測試就是為了模拟master當機的情況。
測試4:啟動master上的keepalived服務
systemctl start keepalived
同樣的去浏覽器通路vip,通路頁面的内容恢複成master上的預設頁内容就沒問題了: