一,概述
Cluster manager 簡稱CMAN,是一個分佈式集羣管理工具,運行在集羣的各個節點上,爲RHCS提供集羣管理任務。它用於管理集羣成員、消息和通知。它通過監控每個節點的運行狀態來了解節點成員之間的有關係。當集羣中某個節點出現故障時,節點成員關係將發生改變,CMAN及時將這種改變通知底層,進而做出相應的調整。
CMAN根據每個節點的運行狀態,統計出一個法定節點數,作爲集羣是否存活的依據。當整個集羣中有多於一半的節點處於激活狀態時,表示達到了法定節點數,此集羣可以正常運行,當集羣中有一半或少於一半的節點處於激活狀態時,表示沒有達到法定的節點數,此時整個集羣系統將變得不可用。CMAN依賴於CCS,並且CMAN通過CCS讀取cluster.conf文件。
rgmanager主要用來監督、啓動、停止集羣的應用、服務和資源。當一個節點的服務失敗時,高可用集羣服務管理進程可以將服務從這個失敗節點轉移至其點健康節點上,這種服務轉移能力是自動動,透明的。RHCS通過rgmanager來管理集羣服務,rgmanager運行在每個集羣節點上,在服務器上對應的進程爲clurgmgrd。
在RHCS集羣中,高可用生服務包括集羣服務和集羣資源兩個方面。集羣服務其實就是應用,如APACHE,MYSQL等。集羣資源有IP地址,腳本,EXT3/GFS文件系統等。
在RHCS集羣中,高可用性服務是和一個失敗轉移域結合在一起的。由幾個節點負責一個特定的服務的集合叫失敗轉移域,在失敗遷移域中可以設置節點的優先級,主節點失效,服務會遷移至次節點,如果沒有設置優先,集羣高可用服務將在任意節點間轉移。
RHCS包括的組件:
下面說一下CMAN在 RHEL4到RHEL6的各組件工作模式的變化:
RHEL 4系列:
RHEL 5系列:
RHEL 6系列:
發現CMAN在RHEL6中各組功能已經大部分被轉移到用戶空間實現,大大簡化了工作流程。
集羣配置和管理工具
RHCS提供了多種集羣配置和管理工具,常用有基於GUI的system-config-cluster,conga等,還提供了基於命令行的管理工具。
System-config-cluster由集羣節點配置和集羣管理兩個部分組成,分別用於創建集羣節點配置文件和維護節點運行狀態,一般用於早期的RHCS版本中。
Conga是新的基於網絡的集羣配置工具。它是web界面管理的,由luci和ricci組成,luci可以安裝在一臺獨立的計算機上,也可安裝在節點上,用於配置和管理集羣,ricci是一個代理,安裝在每個集羣節點上,luci通過ricci和集羣中的每個節點通信。
二,下面我準備了一個實驗環境,使用Conga配置工具來創建和管理集羣:
IP:192.168.30.115 Host:admin.luojianlong.com OS:Centos6.4 x86_64 用於管理和配置集羣
IP:192.168.30.116 Host:node1.luojianlong.com OS:Centos6.4 x86_64 集羣節點1
IP:192.168.30.117 Host:node1.luojianlong.com OS:Centos6.4 x86_64 集羣節點2
IP:192.168.30.119 Host:node1.luojianlong.com OS:Centos6.4 x86_64 集羣節點3
首先配置4臺server的主機名,ssh無密碼互信和hosts文件:
[root@localhost ~]# hostname admin.luojianlong.com [root@localhost ~]# sed -i 's@\(HOSTNAME=\).*@\1admin.luojianlong.com@g' /etc/sysconfig/network [root@localhost ~]# bash [root@localhost ~]# hostname node1.luojianlong.com [root@localhost ~]# sed -i 's@\(HOSTNAME=\).*@\1node1.luojianlong.com@g' /etc/sysconfig/network [root@localhost ~]# bash [root@localhost ~]# hostname node2.luojianlong.com [root@localhost ~]# sed -i 's@\(HOSTNAME=\).*@\1node2.luojianlong.com@g' /etc/sysconfig/network [root@localhost ~]# bash [root@localhost ~]# hostname node3.luojianlong.com [root@localhost ~]# sed -i 's@\(HOSTNAME=\).*@\1node3.luojianlong.com@g' /etc/sysconfig/network [root@localhost ~]# bash [root@localhost ~]# vi /etc/hosts 192.168.30.115 admin.luojianlong.com admin 192.168.30.116 node1.luojianlong.com node1 192.168.30.117 node2.luojianlong.com node2 192.168.30.119 node3.luojianlong.com node3 [root@admin ~]# ssh-keygen -t rsa [root@admin ~]# ssh-copy-id -i node1 [root@admin ~]# ssh-copy-id -i node2 [root@admin ~]# ssh-copy-id -i node3 [root@admin ~]# scp /etc/hosts node1:/etc [root@admin ~]# scp /etc/hosts node2:/etc [root@admin ~]# scp /etc/hosts node3:/etc
下面在admin上面安裝luci
[root@admin ~]# yum -y install luci --disablerepo=epel
啓動luci服務
[root@admin ~]# service luci start Adding following auto-detected host IDs (IP addresses/domain names), corresponding to `admin.luojianlong.com' address, to the configuration of self-managed certificate `/var/lib/luci/etc/cacert.config' (you can change them by editing `/var/lib/luci/etc/cacert.config', removing the generated certificate `/var/lib/luci/certs/host.pem' and restarting luci): (none suitable found, you can still do it manually as mentioned above) Generating a 2048 bit RSA private key writing new private key to '/var/lib/luci/certs/host.pem' Starting saslauthd: [ OK ] Start luci... [ OK ] Point your web browser to https://admin.luojianlong.com:8084 (or equivalent) to access luci
以上信息看出啓動luci後會自動生成2048位ras加密的密鑰,啓動成功,監聽在套接字的8084
注意,這裏是基於https的,所有通過web訪問luci管理頁面,要通過https://IP來訪問
[root@admin ~]# ss -antpl | grep :8084 LISTEN 0 5 *:8084 *:* users:(("python",17785,5))
打開瀏覽器訪問:https://192.168.30.115:8084
輸入服務器的賬號密碼登錄:
在其他3個節點上分別安裝ricci
[root@node1 ~]# yum -y install ricci [root@node2 ~]# yum -y install ricci [root@node3 ~]# yum -y install ricci
安裝好riccic後,會在3個節點上分別自動建立用戶ricci,下面分別給ricci設置密碼,用來在luci裏面添加集羣節點
[root@node1 ~]# echo mypass | passwd --stdin ricci Changing password for user ricci. passwd: all authentication tokens updated successfully. [root@node2 ~]# echo mypass | passwd --stdin ricci Changing password for user ricci. passwd: all authentication tokens updated successfully. [root@node3 ~]# echo mypass | passwd --stdin ricci Changing password for user ricci. passwd: all authentication tokens updated successfully.
啓動ricci
[root@node1 ~]# service ricci start Starting oddjobd: [ OK ] generating SSL certificates... done Generating NSS database... done Starting ricci: [ OK ] [root@node1 ~]# chkconfig ricci on [root@node2 ~]# service ricci start Starting oddjobd: [ OK ] generating SSL certificates... done Generating NSS database... done Starting ricci: [ OK ] [root@node2 ~]# chkconfig ricci on [root@node3 ~]# service ricci start Starting oddjobd: [ OK ] generating SSL certificates... done Generating NSS database... done Starting ricci: [ OK ] [root@node3 ~]# chkconfig ricci on
在luci創建集羣,並添加集羣節點
選擇Download Packages,node1,node2,node3會自動安裝rgmanager等所需要的軟件包
以上信息發現,正在創建集羣
創建完成
隨便登錄到一個節點上面,觀察集羣狀態
[root@node1 ~]# cman_tool nodes Node Sts Inc Joined Name 1 M 4 2014-03-30 15:49:14 node1.luojianlong.com 2 M 12 2014-03-30 15:49:14 node2.luojianlong.com 3 M 12 2014-03-30 15:49:14 node3.luojianlong.com [root@node1 ~]# clustat Cluster Status for tcluster @ Sun Mar 30 15:53:40 2014 Member Status: Quorate Member Name ID Status ------ ---- ---- ------ node1.luojianlong.com 1 Online, Local node2.luojianlong.com 2 Online node3.luojianlong.com 3 Online
發現3個節點都已經在線
下來創建集羣資源,首先創建集羣VIP
以上信息:
IP Address:定義IP地址
Netmask Bits (optional):掩碼長度
Monitor Link:是否監控資源,發生故障後可以自動重啓資源
Disable Updates to Static Routes:禁止跟新靜態路由
Number of Seconds to Sleep After Removing an IP Address:故障轉移等待的時間
設置完成,點submit提交
發現一個IP資源已經創建好了
下面開始創建service groups
定義:
Service Name:服務名稱
Automatically Start This Service:服務是否自動啓動
Failover Domain:選擇故障轉移域
Recovery Policy:故障轉移策略,包括Relocate,Restart,Restart-Disable,Disable
下面選擇資源:
選擇剛纔創建的IP資源
選擇自定義script資源,我們這裏選擇httpd,請確保3臺node上面已經安裝httpd
然後submit
下來點擊start,啓動資源
發現剛纔定義的IP資源已經被使用
登錄node1,查看集羣狀態
[root@node1 ~]# clustat Cluster Status for tcluster @ Sun Mar 30 16:26:40 2014 Member Status: Quorate Member Name ID Status ------ ---- ---- ------ node1.luojianlong.com 1 Online, Local, rgmanager node2.luojianlong.com 2 Online, rgmanager node3.luojianlong.com 3 Online, rgmanager Service Name Owner (Last) State ------- ---- ----- ------ ----- service:webservice node1.luojianlong.com started [root@node1 ~]# ss -anptl | grep :80 LISTEN 0 128 :::80 :::* users:(("httpd",31177,5),("httpd",31179,5),("httpd",31180,5),("httpd",31181,5),("httpd",31182,5),("httpd",31183,5),("httpd",31184,5),("httpd",31185,5),("httpd",31186,5))
發現httpd已經在node1運行了
接着,將webservice轉移到node2上面
[root@node1 ~]# clusvcadm -r webservice -m node2.luojianlong.com Trying to relocate service:webservice to node2.luojianlong.com...Success service:webservice is now running on node2.luojianlong.com [root@node1 ~]# clustat Cluster Status for tcluster @ Sun Mar 30 16:29:25 2014 Member Status: Quorate Member Name ID Status ------ ---- ---- ------ node1.luojianlong.com 1 Online, Local, rgmanager node2.luojianlong.com 2 Online, rgmanager node3.luojianlong.com 3 Online, rgmanager Service Name Owner (Last) State ------- ---- ----- ------ ----- service:webservice node2.luojianlong.com started
登錄node2
[root@node2 ~]# ss -anptl | grep :80 LISTEN 0 128 :::80 :::* users:(("httpd",11601,5),("httpd",11603,5),("httpd",11604,5),("httpd",11605,5),("httpd",11606,5),("httpd",11607,5),("httpd",11608,5),("httpd",11609,5),("httpd",11610,5)) [root@node2 ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:5b:50:f9 brd ff:ff:ff:ff:ff:ff inet 192.168.30.117/24 brd 192.168.30.255 scope global eth0 inet 192.168.30.230/24 scope global secondary eth0 inet6 fe80::20c:29ff:fe5b:50f9/64 scope link valid_lft forever preferred_lft forever
發現httpd和VIP已經在node2上面了。