什麼是高可用HA?
HA(High Available), 高可用性群集,是保證業務連續性的有效解決方案,避免了因為單點故障帶來的風險,一般有兩個或兩個以上的節點,且分為活動節點及備用節點。通常把正在執行業務的稱為活動節點,而作為活動節點的一個備份的則稱為備用節點,各節點之間會傳遞心跳資訊确認對方是否運作正常。當活動節點出現問題,導緻正在運作的業務(任務)不能正常運作時,備用節點此時就會偵測到,并立即接續活動節點來執行業務。進而實作業務的不中斷或短暫中斷。
Messaging Layer Cluster Infrastucture 叢集的基礎架構層:提供底層的高可用服務。
Cluster Resource Manager 叢集資料總管:通過收集底層的心跳資訊來确定哪個節點依然存活,它能夠接受上層服務的委托,與底層通信,管理哪個服務運作在哪個節點上,它可以實作,想要提供高可用服務實作高可用性,但本身不具備高可用能力,也無法與基礎架構層通信的服務,都作為資源來管理。 需要在各節點轉移的,都可稱為資源,如 IP,Web服務,ftp服務等。
資源限制:
位置限制:限制資源優先運作在哪個節點上。
排列限制:用于定義資源與資源間的關系,資源之間能否運作在一起,比如限制當某個資源啟動時,另一個才可以啟動,如果它沒啟動那另一個也一定不會啟動。
順序限制:定義資源與資源間的啟動順序。
RA(Resource Agent) 資源代理:
LSB:Linux Standard Base Linux基礎标準
OCF:Open Cluster Framework 開放叢集架構
RA還會實作資源的檢測,當服務運作不正常時,會嘗試重新開機該服務,再不行會通知CRM實施轉移。
DC(Designated Coordinator):
是節點中自動推舉的協調員,負責收集心跳資訊,協調各個節點。
實驗一、使用heartbeat建構一個Web高可用叢集。
實驗規劃:
主節點:admin1.tuchao.com 192.168.18.201/24
備節點:admin2.tuchao.com 192.168.18.202/24
vip:192.168.18.222/24
myip:192.168.18.220/24
NFS伺服器:192.168.18.203/24
實驗目标:
1、主節點上面提供HTTP服務,運作着一個動态Blog站點。備節點上提供了MySQL服務。
2、當主節點故障時,備節點在運作MySQL的情況下,會自動啟動httpd服務,接續主節點提供Web服務
3、當備節點故障時,主節點會啟動MySQL服務接續工作,這就實作了兩個節點之間互為主備。
4、網站程式與MySQL資料目錄,存放至NFS伺服器上,實作共享存儲。
準備存儲,先配置NFS伺服器:
mkdir /mysqldata --用于存放MySQL資料檔案
mkdir /http --用于存放網站程式
vim /etc/exports --修改配置檔案,加入以下行。
/http 192.168.18.0/24(rw,no_root_squash)
/mysqldata 192.168.18.0/24(rw,no_root_squash)
/etc/init.d/nfs start --啟動nfs服務
useradd -r -u 300 mysql --添加mysql使用者
chown -R mysql.mysql /mysqldata --給予權限
主節點admin1.tuchao.com配置:
MySQL的安裝 略
cp support-files/mysql.server /etc/init.d/mysqld --複制服務腳本
chkconfig --add mysqld --添加到系統服務
chkconfig mysqld off --禁止開機自啟動,注意如果要作為高可用叢集的話,一定要禁止。
mkdir /mydata --建立挂載點
mount -t nfs 192.168.1.110:/mysqldata /mydata --挂載共享存儲
mkdir /mydata/data --建立資料目錄
修改/etc/my.cnf檔案,指定datadir=/mydata/data
初始化MySQL,建立庫,建立使用者,授權使用者。(給網站程式連接配接資料庫時使用)
./scripts/mysql_install_db --user=mysql --datadir=/mydata/data
service mysqld start
create database wpdb;
create user wpuser;
grant all on wpdb.* to 'wpuser'@'192.168.18.%' identified by '123456';
修改hosts檔案。
vim /etc/hosts
192.168.18.201 admin1.tuchao.com admin1
192.168.18.202 admin2.tuchao.com admin2
安裝PHP,配置httpd服務,解壓網站程式,配置接口。略
首頁可以通路到了,代表Web服務和MySQL配置是沒問題的。
<a href="http://s3.51cto.com/wyfs02/M02/41/4E/wKiom1PSJpCxnKBEAAGIUoWMR_E040.jpg" target="_blank"></a>
現在停止服務解除安裝共享存儲,安裝heartbeat,開始配置高可用叢集:
/etc/init.d/httpd stop
/etc/init.d/mysqld stop
chkconfig httpd off //這裡注意一旦打算把服務定義為叢集資源,一定不能設定開機啟動。
chkconfig mysqld off
umount /var/www/html
umount /mydata
yum install heartbeat-2.1.4-12.el6.i686.rpm heartbeat-stonith-2.1.4-12.el6.i686.rpm heartbeat-gui-2.1.4-12.el6.i686.rpm ipvsadm-1.26-2.el6.i686.rpm libnet-1.1.6-7.el6.i686.rpm heartbeat-pils-2.1.4-12.el6.i686.rpm
複制配置檔案
cd /usr/share/doc/heartbeat-2.1.4/
cp authkeys ha.cf /etc/ha.d/
生成随機數,配置authkeys檔案,用于認證。
chmod 600 authkeys
openssl rand -hex 8 >> authkeys
<a href="http://s3.51cto.com/wyfs02/M01/41/4E/wKiom1PSJ82Cz38jAACbBjRAO6I111.jpg" target="_blank"></a>
配置ha.cf檔案,啟動heartbeat服務。
crm respawn,也可以使用crm on,crm yes //用于啟動額外的crm
#下面是對傳輸的資料進行壓縮,是可選項
compression bz2
compression_threshold 2
<a href="http://s3.51cto.com/wyfs02/M00/3B/85/wKiom1O-K1jwLpziAADnsEj-V88977.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M02/3B/85/wKioL1O-Kzni3fUhAAHdHW-KF5s341.jpg" target="_blank"></a>
keepalive 2 //持久連接配接
deadtime 30 //30秒後認為節點死亡
initdead 30 //在某些配置下,重新開機後網絡需要一些時間才能正常工作。這個單獨的”initdead”選項可以處理這種情況。它的取值至少應該為通常deadtime的兩倍。
udpport 694 //偵聽的UDP端口,這個值是預設的。
bcast eth0 eth1 //廣播接口
auto_failback on //是否開啟,節點恢複後資源自動傳回原節點。
啟動heartbeat關閉selinux和防火牆。
service heartbeat start
/etc/init.d/iptables stop
chkconfig iptables off
setenforce 0
備節點admin2.tuchao.com,配置和主節點相同,隻需要安裝好程式,然後把配置檔案拷貝過去就可以了。
scp authkeys ha.cf admin2:/etc/ha.d
scp /etc/hosts admin2:/etc/hosts
scp /etc/httpd/conf/httpd.conf admin2:/etc/httpd/conf/httpd.conf
scp /etc/my.cnf admin2:/etc
scp /etc/ld.so.conf.d/mysql.conf admin2:/etc/ld.so.conf.d/mysql.conf
scp /etc/profile.d/mysql.sh admin2:/etc/profile.d/mysql.sh
ldconfig
. /etc/profile.d/mysql.sh
啟動heartbeat後,需要給hacluster使用者一個密碼,就可以使用hb_gui圖形界面來配置資源。
hb_gui &
echo 123456 |passwd --stdin hacluster
配置資源
我将資源分為以下兩組:
webserver 運作在主節點
vip:192.168.18.222 cidr_netmask 24
store device:192.168.18.203:/http directory:/var/www/html fstype:nfs
httpd //這個使用的是LSB标準類型,沒有額外參數。
mysql 運作在備節點
myip:192.168.18.220 cidr_netmask 24
mystore device:192.168.18.203:/mysqldata directory:/mydata fstype:nfs
mysqld //LSB類型
定義完成後,啟動成功如下圖:
<a href="http://s3.51cto.com/wyfs02/M00/41/5C/wKioL1PTjLGSizPqAAKIzLoT6a4358.jpg" target="_blank"></a>
我們通路vip對應解析的域名(www.tuchao.com)
可以正常通路到我們的站點
<a href="http://s3.51cto.com/wyfs02/M02/41/5E/wKioL1PUPYTynD31AAGnQ-mlM4s449.jpg" target="_blank"></a>
模拟故障,這時把我們主節點的network服務給stop。
/etc/init.d/network stop
嘗試用備節點ping 主節點,已經ping不通了。
<a href="http://s3.51cto.com/wyfs02/M01/41/5D/wKiom1PUPmOiWTv4AAHunCbO9qU937.jpg" target="_blank"></a>
這時嘗試下我們的站點還能不能正常通路。
<a href="http://s3.51cto.com/wyfs02/M00/41/5E/wKioL1PUQDmCWzxXAAHITg3cLJQ182.jpg" target="_blank"></a>
哈哈,通路正常,我們明明把提供http服務的admin1節點的網絡功能給停了呀。
我們來看看heartbeat。
<a href="http://s3.51cto.com/wyfs02/M02/41/5D/wKiom1PUQDeSkzMIAAJsT8_vKNI793.jpg" target="_blank"></a>
這裡顯示主節點已關閉,主節點的資源組已經自動切換到備節點上來了。
<a href="http://s3.51cto.com/wyfs02/M01/41/5E/wKioL1PUQ4iB57u3AAMX-kAwDQM192.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M00/41/5D/wKiom1PUQoiC0I8rAAGxBaBTlY4996.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M02/41/5E/wKioL1PUQ7_Aj1sJAAJvxH2b9n8636.jpg" target="_blank"></a>
現在我們把主節點網絡功能給恢複,因為這裡開啟了auto_failback on,資源又會自動切換回主節點了。
<a href="http://s3.51cto.com/wyfs02/M00/41/5D/wKiom1PURerhL3QFAAIlPMn4kFA742.jpg" target="_blank"></a>
我們把備節點網絡功能給關掉,主節點也會自動接替備節點的工作。
這就實作了互為主備的高可用模型。
<a href="http://s3.51cto.com/wyfs02/M01/41/5D/wKiom1PUSVTgpmcEAAHK6y-lEU4068.jpg" target="_blank"></a>
實驗二、LVS負載均衡+高可用,使用heartbeat-ldirectord對後端RealServer做健康狀況檢測。
實驗環境:
RHEL6.4
安裝ipvsadm
yum install ipvsadm -y
安裝heartbeat-ldirectord,複制配置檔案樣列。
yum install heartbeat-ldirectord -y
cp /usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf /etc/ha.d/
編輯配置檔案:
checktimeout=3 //等待逾時時間
checkinterval=1 //檢查時間間隔
#fallback=127.0.0.1:80
autoreload=yes //自動裝載配置檔案
#logfile="/var/log/ldirectord.log" //定義服務自我管理的日志
#logfile="local0" //定義日志發送給rsyslog
#emailalert="[email protected]" //管理者郵箱
#emailalertfreq=3600 //郵件發送頻率
#emailalertstatus=all
quiescent=yes //是否以靜默模式工作(當某一個Realserver故障了如何處理,yes表示把realserver權重設定為0,no表示把realserver删除。
virtual=192.168.18.100:80 //定義虛拟IP
real=192.168.18.191:80 gate //定義RealServer,gate表示DR模型。
real=192.168.18.192:80 gate 3
fallback=127.0.0.1:80 gate //當RealServer全部故障時,使用本機響應請求。
service=http //當檢測類型為協商的時候,指定檢測方式是基于什麼服務實作的。
request=".test.html"
receive="OK"
virtualhost=www.tuchao.com //虛拟主機
scheduler=wrr //指定排程算法
#persistent=600
#netmask=255.255.255.255
protocol=tcp
checktype=negotiate //檢查類型為協商
checkport=80
配置檔案寫好以後,複制一份到備節點。
啟動圖像界面定義資源
vip
<a href="http://s3.51cto.com/wyfs02/M01/41/60/wKioL1PUiVbSHXxsAAJdsS7jLpc009.jpg" target="_blank"></a>
ldirectord
<a href="http://s3.51cto.com/wyfs02/M00/41/60/wKiom1PUiFvR1YFgAAJWcPWuclc684.jpg" target="_blank"></a>
配置好兩台realserver分别是192.168.18.191,192.168.18.192。
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:0 192.168.18.100 broadcast 192.168.18.100 netmask 255.255.255.255 up
route add -host 192.168.18.100 dev lo:0
建立首頁檔案 略
建立檢測檔案
echo "OK" > /var/www/html/.test.hmtl
啟動httpd服務
service httpd start
第二台RealServer配置相同。
啟動資源
<a href="http://s3.51cto.com/wyfs02/M01/41/60/wKioL1PUiwOSkfeSAAF1gow8KQg690.jpg" target="_blank"></a>
資源運作在了節點二上
<a href="http://s3.51cto.com/wyfs02/M01/41/60/wKiom1PUitiBzEXWAAGvEPmKnBM819.jpg" target="_blank"></a>
我們通路下director試試。
<a href="http://s3.51cto.com/wyfs02/M00/41/60/wKiom1PUiv-S6LKmAAEahW23W5A686.jpg" target="_blank"></a>
重新整理一下,這裡為了更好的分别有沒有生效,設定了兩個不同的網頁内容。
<a href="http://s3.51cto.com/wyfs02/M01/41/60/wKiom1PUi0qBjoT6AAEbM2ihwC4880.jpg" target="_blank"></a>
現在模拟節點二故障,在節點二上執行halt。
資源已經自動切換到節點一上來了,負載均衡正常運作。
<a href="http://s3.51cto.com/wyfs02/M00/41/60/wKioL1PUjeDDa9zMAAFTrdwS69Q491.jpg" target="_blank"></a>
配置節點一與節點二httpd服務,實作fallback功能。
echo “Server is repairing”>/var/www/html/index.html
這時候模拟realserver全部都故障了,ldirectord會自動把故障的realserver權重标記為0。
<a href="http://s3.51cto.com/wyfs02/M00/41/60/wKioL1PUkK3w0xrbAAGChzWrdDQ312.jpg" target="_blank"></a>
嘗試下通路,這時director就響應我們了。
<a href="http://s3.51cto.com/wyfs02/M02/41/60/wKiom1PUj9jzYdSCAADKeymUd9g143.jpg" target="_blank"></a>
HA高可用實驗完成,這裡提一個小細節,實際工作中配置heartbeat還是不要啟用auto_failback,當損壞的節點突然好了以後,資源切回來有時會出錯,要手動到clearup一下資源就可以了。
有更好的建議歡迎大家與我多多交流QQ:1183710107
本文轉自qw87112 51CTO部落格,原文連結:http://blog.51cto.com/tchuairen/1436086