基於RHEL6.3-kvm三節點虛擬機命令行搭建HA

html

        從本年度的五月份開始到如今,一直在實驗RedHat5版本與6版本的HA。在網上找到了6版本的HA手冊,發現雖然項目中關於HA最多使用的是雙節點模式,其實若只針對HA來講,雙節點模式只是一種特殊環境,三節點或者更多的狀況下須要配仲裁盤。還有就是作HA項目通常使用圖形界面,像5版本的system-config-cluster;6版本的LUCI,以命令行爲王道的Linux天然也有命令行的搭建方式,HA手冊中就記錄了6版本的CCS命令行。node

        用了一個週末的時間,實驗了節點環境下使用命令行搭建HA。由於我沒有合適地設備,因此想用虛擬機實現,虛擬機環境下最大的問題就是fence設備。在網上找了好久,發現若是是vmware-workstation彷佛對fence功能支持不是很好(9版本的不知道行不行),幾乎沒有成功案例,有也是手動fence。除非是ESXvmware-server這類產品,我的認爲有多是由於若是要實現fence功能,虛擬化層必須實質是一個操做系統而並不是應用軟件。一籌末展的時候在CSDN發現一篇博客給了我很大的幫助。使用RHEL的KVM虛擬機來實現,現將兩天的實驗結果查記錄下來。
linux


web

先說說環境:apache

用個人筆記本運行vmware-workstation8.0,建立一個虛擬機RHEL6.3-x64;內存4GB;硬盤50GB與10GB,單網卡,主機名是server6。還好筆記本的內存夠大(8GB),否則還真就懸了:)虛擬機系統的CPU必需要支持虛擬化技術,這在開始選擇虛擬機硬件配置的時候要作設置。在虛擬機的CPU項中會有虛擬化引擎選項,配置以下圖瀏覽器

安裝好系統後先搭建底層應用:網絡

配置網絡,IP地址是192.168.0.10,這個其實愛怎麼設怎麼設,只是與我本地(筆記本)鏈接ssh方便;負載均衡

主名是server6,root密碼是123456dom

FTP組件,到安裝光盤下的Packages目錄用rpm命令安裝vsftpd組件與ftp組件,裝ftp組件是由於我發現配YUM爲ftp方式的話,若是不裝ftp組件,其它機器使用本機的YUM是能夠的,但本機什麼也安裝不了,哈哈。ssh

YUM源(vsftp),若是隻是通常應用,yum的repo文件能夠寫的很簡單,但若是要使用大組件或套件的話需配置全面,以下爲個人配置文件rhel-server.repo

[rhel-main]
name=Red Hat Enterprise Linux $Main
baseurl=ftp://192.168.122.1/pub/
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[rhel-Server]
name=Server
baseurl=ftp://192.168.122.1/pub/Server
enabled=1
gpgcheck=0
[HighAvailability]
name=HighAvailability
baseurl=ftp://192.168.122.1/pub/HighAvailability
enabled=1
gpgcheck=0
[LoadBalancer]
name=LoadBalancer
baseurl=ftp://192.168.122.1/pub/LoadBalancer
enabled=1
gpgcheck=0
[ScalableFileSystem]
name=ScalableFileSystem
baseurl=ftp://192.168.122.1/pub/ScalableFileSystem
enabled=1
gpgcheck=0
[ResilientStorage]
name=ResilientStorage
baseurl=ftp://192.168.122.1/pub/ResilientStorage
enabled=1
gpgcheck=0

 

能夠看到IP地址是192.168.122.1,這個IP是安裝KVM後虛擬網卡默認的IP地址,由於作這個YUM要給搭建的三臺虛擬機提供安裝源,因此IP地址這樣寫;

scsi-target組件,裝它是由於要劃一塊10GB的iscsi盤給虛擬機使用(本地虛機配置有兩塊硬盤);

kvm組件,yum install kvm virt-manager libvirt,除此以外還要運行yum install qemu\*。否則包裝不全,啓動KVM會報錯;

luci組件,萬一命令行配很差還能夠從web界面進去看看狀況,也能夠比較二者區別找出正確的路走,在兩天的實驗中我感受這個決定非常英明;

最後關閉防火牆與selinux,網上也有列出集羣全部服務的端口號而後配iptables,我想這是第一次用命令行搭建三節點服務,能夠先作成功之後有時候再配防火牆。

全部底層搭建完成後(特別是kvm),啓動kvm服務且開機自啓

/etc/init.d/libvirtd start & chkconfig libvirtd on

這時要查看KVM運行狀況lsmod | grep kvm*

kvm_intel              52570  0

kvm                   314739  1 kvm_intel

若出現上述結果表明kvm運行正常

在使用KVM建立虛擬機以前,要將rhel6.3的鏡像放入本地虛擬機光驅裏,這樣KVM能自動認到安裝源。安裝過程再也不詳述,畢竟這篇的主題是HA不是KVM。

再來運行虛擬機命令virsh -c qemu:///system list

 Id    Name                           State

----------------------------------------------------

 1     RHEL6.3-HA1                    running

 2     RHEL6.3-HA2                    running

 3     RHEL6.3-HA3                    running

看到三臺虛擬機都已是運行狀態,KVM也提供圖形界面,運行virt-manager

安裝完成後,開始配置三臺虛機的底層組件與服務

主機名:s1.example.com s2.example.com s3.example.com

IP地址:192.168.122.2    192.168.122.3    192.168.122.4

三節點連帶本地虛擬機的hosts內容以下:

192.168.122.2   s1.example.com s1
192.168.122.3   s2.example.com s2
192.168.122.4   s3.example.com s3
192.168.122.1   server6

三節點的root密碼都是123456

YUM源與本地虛擬機的同樣,關閉防火牆與SELINUX。

安裝iscsi組件與apache2,本次實驗HA啓動的服務就是apache2,而站點文件都在iscsi盤上。

先在s1上操做,iscsi盤認到後是 /dev/sda,須要分紅兩個區,一個是存站點文件;另外一個作仲裁盤用

 最後的結果是:

 Device Boot      Start         End      Blocks   Id  System

/dev/sda1               1         955      977904   83  Linux

/dev/sda2             956       10240     9507840   83  Linux

sda1作仲裁盤用,暫時放着無論;

sda2格式化,掛載到/mnt下。建立www目錄與目錄下的index.html,爲看實驗結果方便,寫了句話放到index.html文件裏,echo "The page for HA in ccs" > /mnt/www/index.html

安裝apache2,將默認站點路徑指向/mnt/www/,驗證apache配置是否成功。以後將sda2卸載,在s2s3兩節點分別將sda2掛載將apache2配好,再卸載sda2,apache2服務開機不自啓。

安裝HA組件,按照個人YUM源配置文件,安裝很簡單,yum groupinstall High*


接下來開始作關於HA的配置

        我是在實驗中途建立的仲裁,這裏先將仲裁盤的建立記錄下來。仲裁的做用裁定兩個以上節點到底由誰來接管服務,以投票的形式來決定最終服務節點,算是一種較民主地概念在IT環境的應用。當某個提供服務的節點出現問題時,其它兩個節點由配置好的仲裁探測法來測試另外哪一個節點的性能更好,票數也就更多,就由該節點來接管服務。我在配以前還在想若是設定不一樣的故障域是否是就不用配了,後爲發現若是是雙節點以上不配仲裁的話,cman服務根本起不來,呵呵(看來不能太天真)。

在三節點的任意一個節點均可以,就用s1吧。格式化仲裁盤

mkqdisk -c /dev/sda1 -l qdiskWeb        //qdiskWeb是仲裁盤的標識,這個十分重要


若是怕sda1在某些狀況下會變,能夠固定盤符

udevadm info -q all -n /dev/sda1        //查看sda1設備在被內核識別時候的信息

從衆多信息中找到ID_SCSI_SERIAL=beaf11,修改 /etc/udev/rules.d/99-iscsi.rules文件,添加信息

KERNEL=="sd[a-z]",ENV{ID_SCSI_SERIAL}=="beaf11",NAME="disk_fs"

上述的NAME功能是,設置生效後,會發現/dev/sda1變成了/dev/disk_fs

保存退出,使設置生效udevadm trigger不過這個我沒作,就是說說方法而已。


格式化完仲裁盤後,能夠在三節點上均可以查看仲裁盤信息

mkqdisk -L

再有就是在配HA以前要爲fence設備作些準備,若是要在KVM使用fence設備,必需要用虛擬化層去執行每次的fence動做。RHCS對虛擬機默認的fence設備是fence_virtsh,經過實驗發現使用KVM對虛擬機fence失敗,根據開始提到的CSDN博客的指導,我將fence設備「偷龍轉鳳」

mv /usr/sbin/fence_apc /usr/sbin/fence_apc.bak

 ln -s /usr/sbin/fence_virsh /usr/sbin/fence_apc        //其實就作個軟連接

從這裏能夠看出,是三節點共用一個fence設備

接下來將三個節點的ricci服務啓用,並設置爲開機自啓,建立ricci用戶密碼

/etc/init.d/ricci start & chkconfig ricci on

passwd ricci        //密碼我填的是123456


s1上用命令行正式建立HA(其它節點也行)

ccs -h s1 --createcluster web_cluster      //建立集羣,名字是web_cluster

ccs -h s1 --addnode s1.example.com        //添加集羣節點

ccs -h s1 --addnode s2.example.com

ccs -h s1 --addnode s3.example.com

ccs -h s1 --lsnodes        //查看建立的節點

s1.example.com: nodeid=1

s2.example.com: nodeid=2

s3.example.com: nodeid=3

//nodeid是建立時集羣爲每一個節點建立的ID號

 ccs -h s1 --addfencedev virsh_fence agent=fence_apc ipaddr=192.168.122.1 login=root passwd=123456

//fence_apc就是"偷龍轉鳳"所作的fence設備,IP填寫server6的地址,用戶名填root,密碼填root用戶密碼,其實這裏有個默認參數action,即fence動做,默認是重啓

ccs -h s1 --addmethod fence_01 s1.example.com    //爲三節點建立fence設備,fence_0x爲節點fence設備名稱

ccs -h s1 --addmethod fence_02 s2.example.com

ccs -h s1 --addmethod fence_03 s3.example.com

將節點與fence設備作關聯

ccs -h s1 --addfenceinst virsh_fence s1.example.com fence_01 port=RHEL6.3-HA1

ccs -h s1 --addfenceinst virsh_fence s2.example.com fence_02 port=RHEL6.3-HA2

ccs -h s1 --addfenceinst virsh_fence s3.example.com fence_03 port=RHEL6.3-HA3

//這裏要注意的是port參數內容要填KVM建立的虛擬機名稱

ccs -h s1 --lsfenceinst        //查看剛剛建立的fence設備

s1.example.com

  fence_01

    virsh_fence: port=RHEL6.3-HA1

s2.example.com

  fence_02

    virsh_fence: port=RHEL6.3-HA2

s3.example.com

  fence_03

    virsh_fence: port=RHEL6.3-HA3

ccs -h s1 --addfailoverdomain web_doamin restricted ordered=0 nofailback

//建立故障域web_doamin,有限制無序,且失效節點從新加入集羣后服務無需返回該節點

ccs -h s1 --addfailoverdomainnode web_doamin s1.example.com 1

ccs -h s1 --addfailoverdomainnode web_doamin s2.example.com 1

ccs -h s1 --addfailoverdomainnode web_doamin s3.example.com 1

//建立故障域節點,由於是無序,因此後邊的排序號碼都是1

ccs -h s1 --lsfailoverdomain        //查看建立的故障域

web_domain: restricted=1, ordered=0, nofailback=1

  s1.example.com: priority=1

  s2.example.com: priority=1

  s3.example.com: priority=1

ccs -h s1 --addresource ip address=192.168.122.253 monitor_link=1    //建立VIP資源,且需監控資源

ccs -h s1 --addresource fs name=web_share fstype=ext4 device=/dev/sda2 mountpoint=/mnt force_unmount=1 self_fence=1

//建立文件系統資源,即掛載含有站點文件的ISCSI盤,force_unmount表示節點失效後強制卸載,self_fence表示強制卸載無效後對該節點作fence動做

ccs -h s1 --addresource script name=web_script file=/etc/init.d/httpd

//建立apache2服務的啓動腳本資源

ccs -h s1 --addservice web_service domain=web_doamin recovery=relocate  

//web_service表示服務名稱,relocate表示若節點失效先嚐試在該節點重啓服務再切換節點重啓服務

ccs -h s1 --addsubservice web_service ip ref=192.168.122.253        //建立服務的子服務

ccs -h s1 --addsubservice web_service ip:fs ref=web_share        //建立子服務的子服務

ccs -h s1 --addsubservice web_service ip:fs:script ref=web_script        //同上

最後的結構是web_service服務先啓VIP,再掛載iscsi,最後啓動apache2

ccs -h s1 --lsservices        //查看建立的全部服務與資源

service: name=web_service

  ip: ref=192.168.122.253

    fs: ref=web_share

      script: ref=web_script

resources:

  ip: monitor_link=1, address=192.168.122.253

  fs: name=web_share, self_fence=1, force_unmount=1, fstype=ext4, device=/dev/sda2, mountpoint=/mnt

  script: name=web_script, file=/etc/init.d/httpd

ccs -h s1 --setquorumd label=qdiskWeb        

//設置仲裁盤,這裏要多說一句,RHEL到了6.3版本,簡化了仲裁盤的配置,我用Luci看了一眼,只要設定仲裁盤的卷標。其它參數會根據集羣節點數的多少來自動生成默認值,保證集羣能在最少節點狀況下正常運行

ccs -h s1 --addheuristic interval=1 program="ping -c 1 192.168.122.1" tko=3 

//建立仲裁探測法,以每秒ping 本地虛擬機爲探測方法,每1秒執行一次,最多3次ping不通節點失效;探測法票數默認爲1

ccs -h s1 --lsquorum //查看建立的仲裁盤與仲裁探測法

Quorumd: label=qdiskWeb

  heuristic: program=ping -c 1 192.168.122.1, interval=1, tko=3

原本覺得到這裏算是設置成功,結果發現少了同樣

ccs -h s1 --setcman expected_votes=5

//總票數爲5,三節點在啓動後各佔一票,如有節點失效,哪一個節點的得票數能超過5的一半即啓動服務

按本身理解的說的,有可能不對,呵呵

ccs -h s1 --sync --activate        //將HA的配置文件同步到集羣的每一個節點

全部配置完成,三臺節點一塊兒啓動cman服務。注意,是一塊兒

/etc/init.d/cman start

查看集羣狀態

clustat

看到三臺與仲裁盤啓動成功,如果不配仲裁,CMAN服務啓動會報錯

再啓動服務

/etc/init.d/rgmanager start

能夠看到,如今服務是在s3節點啓動的。如今來看看頁面可否正常顯示

頁面顯示正常,這個瀏覽器我是在server6 虛擬機上打開的。如今來將s3的網卡當掉,看看fence與服務切換狀況

ssh到s3上ifdown eth0

s3已是離線狀態,正在重啓。再來看看服務

我截圖速度較慢,能夠看到服務已經切到s2上,而s3這時已經重啓完了,這時再次瀏覽VIP可以成功看到頁面內容。以後我試過將兩個節點fence,發現可以繼續工做,證實仲裁盤在起做用。再以後試過停apache2服務,發現只要節點不重啓,就會在原節點從新啓動服務。因爲只有一個網卡,心跳即業務線,因此測試到此結束!


實驗算是基本作完,這其中發現了不少問題沒有解決:

一是對KVM的配置還不是太熟悉,原本我是想兩塊虛擬網卡,一塊心跳一塊業務,這樣可以測試的更全面;

二是對仲裁盤的理解還不夠透徹,在實驗中我解釋關於仲裁的有關參數,有些是看了手冊,有些是照本身理解的來;

三是其實ccs的命令還有不少,本次只記載過程,之後再作實驗有可能會再發部分其它命令上來。

下次再作實驗有可能會專門針對KVM或RHEV虛擬化產品;也有多是在vmware-ESX或vmware-server或其它相關虛擬環境下搭建集羣;亦有可能會搭建LVS-負載均衡集羣玩玩。總之,技術之路仍遠亦無邊界;我輩同道中人仍需努力~!有不對的地方歡迎指正,謝謝。


cluster.conf內容:

<?xml version="1.0"?>
<cluster config_version="47" name="web_cluster">
<clusternodes>
<clusternode name="s1.example.com" nodeid="1">
<fence>
<method name="fence_01">
<device name="virsh_fence" port="RHEL6.3-HA1"/>
</method>
</fence>
</clusternode>
<clusternode name="s2.example.com" nodeid="2">
<fence>
<method name="fence_02">
<device name="virsh_fence" port="RHEL6.3-HA2"/>
</method>
</fence>
</clusternode>
<clusternode name="s3.example.com" nodeid="3">
<fence>
<method name="fence_03">
<device name="virsh_fence" port="RHEL6.3-HA3"/>
</method>
</fence>
</clusternode>
</clusternodes>
<cman expected_votes="5"/>
<fencedevices>
<fencedevice agent="fence_apc" ipaddr="192.168.122.1" login="root" name="virsh_fence" passwd="123456"/>
</fencedevices>
<rm>
<failoverdomains>
<failoverdomain name="web_domain" nofailback="1" ordered="0" restricted="1">
<failoverdomainnode name="s1.example.com" priority="1"/>
<failoverdomainnode name="s2.example.com" priority="1"/>
<failoverdomainnode name="s3.example.com" priority="1"/>
</failoverdomain>
</failoverdomains>
<resources>
<ip address="192.168.122.253" monitor_link="1"/>
<fs device="/dev/sda2" force_unmount="1" fstype="ext4" mountpoint="/mnt" name="web_share" self_fence="1"/>
<script file="/etc/init.d/httpd" name="web_script"/>
</resources>
<service name="web_service">
<ip ref="192.168.122.253">
<fs ref="web_share">
<script ref="web_script"/>
</fs>
</ip>
</service>
</rm>
<quorumd label="qdiskWeb">
<heuristic interval="1" program="ping -c 1 192.168.122.1" tko="3"/>
</quorumd>
</cluster>
相關文章
相關標籤/搜索