HA 四個層次:
1.message layer / infrastructure
心跳
2.ccm 控制檯
3.resources allocated 資源分配
4.resources agent 資源代理
第一層 message layer 主要可以由heartbest keepalived corosync/openais 來實現
第三層: 由pacemaker crm 來提供資源分配
案例:
實現兩個節點的高可用性羣集,用corosync/openais 來實現。
Node1 ip地址:192.168.1.15
Node2 ip地址:192.168.1.20
Vip :192.168.1.100
步驟:
1.在做該案例之前,首先確保自己的yum倉庫是否完整,由於在這個案例中牽扯到羣集,所以要安裝cluster倉庫。
各項都要確保時鐘同步: hwclock -s
[root@node1 ~]# hwclock -s
2.無障礙密碼通訊方式:
[root@node1 ~]# ssh-keygen -t rsa
[root@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node2 //將node1的鑰匙傳給node2
比如我們將node1中的/etc/hosts文件 拷貝到 node2中的/etc下:
[root@node1 ~]# scp /etc/hosts node2:/etc
查看node2中的hosts文件內容:
[root@node2 ~]# vim /etc/hosts
這樣就實現了兩節點之間無障礙密碼傳送文件和執行一些指令。
3.安裝corosync軟件包:
紅色的都是要安裝的。
[root@node1 ~]# yum localinstall *.rpm --nogpgcheck //將本地紅色軟件包全部安裝
4.首先來設置node1這個節點:
安裝完成後切換到corosync目錄下
[root@node1 ~]# cd /etc/corosync/ 會看到corosync的樣本文件
[root@node1 corosync]# cp corosync.conf.example corosync.conf //將樣本文件變成正式配置文件
[root@node1 corosync]# vim corosync.conf //編譯該文件
需要額外補充一點東西,在下面空白行加入以下內容:
[root@node1 corosync]# mkdir /var/log/cluster //創建該目錄
在另外的一個節點上,也就是node2上創建日誌目錄
[root@node1 corosync]# ssh node2 'mkdir /var/log/cluster'
爲了便其他主機加入該集羣,需要認證,生成一個authkey
[root@node1 corosync]# corosync-keygen
將上圖中的文件連同權限一起遠程拷貝到node2中:
[root@node1 corosync]# scp -p authkey corosync.conf node2:/etc/corosync/
[root@node1 corosync]# service corosync start //在node1上啓動corosync服務
[root@node1 corosync]# ssh node2 '/etc/init.d/corosync start'
Starting Corosync Cluster Engine (corosync): [ OK ] //在node1上啓動node2的該服務
下面來驗證corosync引擎是否正常啓動了:
[root@node1 corosync]# grep -i -e "corosync cluster engine" -e "configuration file" /var/log/messages
查看初始化成員節點通知是否發出:
[root@node1 corosync]# grep -i totem /var/log/messages
檢查過程中是否有錯誤產生:
[root@node1 corosync]# grep -i error: /var/log/messages |grep -v unpack_resources
(爲了檢查stonith的錯誤,因爲我們在這裏沒有安裝stonith,所以得將stonith去掉,不去掉的話會報錯)
檢查pacemaker時候已經啓動了:
[root@node1 corosync]# grep -i pcmk_startup /var/log/messages
在節點2上同樣做以上相同的驗證.
5.在node1節點上查看集羣的成員狀態:
[root@node1 corosync]# crm status
下面來提供高可用服務:
在corosync中,定義服務可以用兩種接口
(1)圖形接口 (使用hb——gui)
(2)crm (pacemaker 提供,是一個shell)
查看配置信息:
如何驗證該文件的語法錯誤:
[root@node1 corosync]# crm_verify -L
上述出錯時由於stonith,因爲我們沒有stonith,在高可用的環境裏面,會禁止使用任何支援,所以我們得禁用掉stonith。
[root@node1 corosync]# crm //進入crm界面
crm(live)# configure //進入配置模式
crm(live)configure# property stonith-enabled=false //禁用stonith
crm(live)configure# commit //提交上述修改內容
6.下面來定義資源:
集羣的資源類型有4種
primitive 本地主資源 (只能運行在一個節點上)
group 把多個資源軌道一個組裏面,便於管理
clone 需要在多個節點上同時啓用的 (如ocfs2 ,stonith ,沒有主次之分)
master 有主次之分,如drbd
我們來提供三種資源: ip地址 httpd服務 共享存儲
[root@node1 corosync]# crm
crm(live)# configure
crm(live)configure# ra
crm(live)configure ra# classes
heartbeat
lsb
ocf / heartbeat pacemaker
Stonith 1//查看資源代理
crm(live)configure ra# list heartbeat //列出heartbeat這個資源代理所管轄的資源
配置ip地址資源:
crm(live)configure# primitive webip ocf:heartbeat:IPaddr params ip=192.168.1.100
在這裏看看你兩個節點的虛擬機上是否安裝httpd,沒安裝的話分別安裝。
下面分別在每個節點上設置一個簡單的web網頁:
[root@node1 corosync]# echo "hello" >/var/www/html/index.html
[root@node2 corosync]# echo "hahaaha" >/var/www/html/index.html
接下來定義web服務資源:
crm(live)configure# primitive webserver lsb:httpd
查看狀態:
大家仔細看上圖,就會發現存在一個問題:就是ip地址資源在node1上啓動,但是web服務卻是在node2上啓動的,這樣一來兩個資源分別在兩個節點上,這樣顯然是不行的。出現這樣的原因就是在高可用羣集中資源比較多,這樣是爲了將資源平衡到每一個節點上。
看下圖來證實這樣的問題:
爲了解決這樣的問題,就用到了我們上面所說的羣集資源類型中group的概念:
定義組:
crm(live)configure# group web webip webserver
再次查看羣集狀態:
此時我們就可以來訪問192.168.1.100來查看結果:
能夠成功訪問。
如果此時我們把node1節點停掉,那麼各種資源應該流轉到node2上。注意我們在停掉node1節點時,停用corosync服務,不要停用httpd服務。
[root@node1 corosync]# service corosync stop
Signaling Corosync Cluster Engine (corosync) to terminate: [ OK ]
Waiting for corosync services to unload:......... [ OK ]
[root@node1 corosync]# crm status
Connection to cluster failed: connection failed
然後我們在節點node2上查看信息狀態:
可以看到node1已經offline,但是node2仍然沒有運行,原因是沒有票數了(without quorum)
所以我們關閉quorum:
關閉 quorum
可選的參數有如下:ignore (忽略)
freeze (凍結,表示已經啓用的資源繼續實用,沒有啓用的資源不能
啓用))
stop(默認)
suicide (所有的資源殺掉)
那我們將節點node1的corosync服務啓動起來, 改變quorum。
[root@node1 corosync]# crm
crm(live)# configure
crm(live)configure# property no-quorum-policy=ignore
接下來我們停用node1的corosync,查看node2的狀態:
[root@node1 corosync]# service corosync stop
可見資源已經流轉到node2節點上,現在登錄http://192.168.1.100上查看網頁狀態:
變成了node2節點上web頁面的內容。
如果此時將node1節點上的corosync服務開啓,此時資源不會自動流轉到node1上,還是在node2上。