一、RHCS簡介
RHCS是Red Hat Cluster Suite的縮寫,也就是紅帽子集羣套件,RHCS是一個能夠提供高可用性、高可靠性、負載均衡、存儲共享且經濟廉價的集羣工具集合,它將集羣系統中三大集羣架構融合一體,可以給web應用、數據庫應用等提供安全、穩定的運行環境。
更確切的說,RHCS是一個功能完備的集羣應用解決方案,它從應用的前端訪問到後端的數據存儲都提供了一個行之有效的集羣架構實現,通過RHCS提供的這種解決方案,不但能保證前端應用持久、穩定的提供服務,同時也保證了後端數據存儲的安全。
RHCS提供了集羣系統中三種集羣構架,分別是高可用性集羣、負載均衡集羣、存儲集羣。
二、RHCS集羣的功能和組成
RHCS的核心功能就是提供高可用集羣,當其中的節點出現故障的時候,RHCS可以通過高可用性服務管理組件自動、快速從一個節點切換到另一個節點,從而保證應用持續、不間斷的對外提供服務,從而實現RHCS高可用集羣實現的功能。
RHCS通過LVS來提供負載均衡集羣,當一個請求進來時,LVS通過負載均衡調度算法將請求進行分配,來達到負載均衡,而當一個節點出現故障的時候,LVS通過服務節點的故障轉移功能自動屏蔽此節點,並其故障節點踢出去,同時將此節點的服務轉移給其他節點。然後當此節點重新恢復服務後LVS會自動把其加到服務中來,從而來保證服務的穩定運行!
RHCS通過GFS(Global File System)文件系統來提供存儲集羣功能,GFS是集羣文件系統,它允許多個服務器同時讀寫同一個共享存儲文件系統,存儲集羣通過將數據放在一個共享存儲上來保證數據的一致性,同時GFS通過鎖管理機制來實現對數據讀寫的隔離,從而來保證了數據的安全性!
RHCS是一個集羣套件,其主要包括以下幾部分:
1、集羣構架管理器:RHCS的基礎套件,提供集羣的基本功能,主要包括布式集羣管理器(CMAN)、鎖管理(DLM)、配置文件管理(CCS)、柵設備(FENCE)
2、rgmanager高可用服務管理器
提供節點服務監控和服務故障轉移功能,當一個節點服務出現故障時,將服務轉移到另一個健康節點。
3、集羣管理工具
RHCS通過system-config-cluster來進行配置,這是一個基於圖形界面的工具,可以很簡單、明瞭的進行配置
4、負載均衡工具
RHCS通過LVS實現服務之間的負載均衡,LVS是系統內核中的套件,所有性能比較好。
5、GFS
集羣文件系統,這是由RedHat公司開發的,GFS文件系統允許多個服務同時讀寫一個磁盤分區,通過GFS可以實現數據的集中管理,免去了數據同步和拷貝的麻煩,但GFS並不能孤立的存在,安裝GFS需要RHCS的底層組件支持。
6、Cluster Logical Volume Manager
Cluster邏輯卷管理,即CLVM,是LVM的擴展,這種擴展允許cluster中的機器使用LVM來管理共享存儲,但是配置之前需要開啓lvm支持集羣功能。
7、ISCSI
iSCSI是一種在Internet協議上,利用tcp/ip機制對fc、fc-xx等進行封裝後在網絡中進行傳輸。isici是基於C/S架構的,數據首先被封裝成scsi報文,在封裝成iscsi報文,最後封裝tcp/ip報文進行傳輸!iscsi是基於tcp的,監聽在3260上,通過3260端口向外提供tcp/ip的服務的,isisc的會話是一直保存建立的,知道會話介紹再斷開。RHCS可以通過ISCSI技術來導出和分配共享存儲的使用。
三、RHCS的架構環境和架構圖
RedHat Enterprise Linux 5.8
資源分配:
node2:192.168.0.11 <--->RS-web1<--->hostname node1.example.com node2:192.168.0.12 <--->RS-web2<--->hostname node2.example.com node3:192.168.0.13 <--->RS-web3<--->hostname node3.example.com node4:192.168.0.14 <--->Target+NtpServer<--->hostname node4.example.com VIP : 192.168.0.100 stepping:192.168.0.15 跳板機,此處利用在跳板機上利用循環語句一次性部署多個服務器。
其架構圖如下
四、搭建RHCS的高可用集羣
4.1、配置Stepping主機上的NtpServer和主機名、以及ssh與其他各個幾點的ssh互信和NtpServer、配置hostname
4.1.1、配置hosts文件
[root@stepping ~]# vim /etc/hosts 192.168.0.11 node1.example.com node1 192.168.0.12 node2.example.com node2 192.168.0.13 node3.example.com node3 192.168.0.14 node4.example.com node4 192.168.0.15 stepping.example.com stepping
4.1.2、配置雙機互信
[root@stepping ~]#ssh-keygen -t rsa [root@stepping ~]#ssh-copy-id -i ~/.ssh/id_rsa.pub node1 [root@stepping ~]#ssh-copy-id -i ~/.ssh/id_rsa.pub node2 [root@stepping ~]#ssh-copy-id -i ~/.ssh/id_rsa.pub node3 [root@stepping ~]#ssh-copy-id -i ~/.ssh/id_rsa.pub node4
4.1.3、配置本地yum源
配置之前先把本地磁盤做成yum,需要在每個節點上都配置,把本地磁盤掛載到mnt/cdrom目錄下
[root@stepping ~]#mkdir /mnt/cdrom [root@stepping ~]# mount /dev/cdrom /mnt/cdrom 掛載光盤 vim /etc/yum.repos.d/server.repo,添加如下內容 # repos on instructor for cla***oom use # Main rhel5 server [base] name=Instructor Server Repository baseurl=file:///mnt/cdrom/Server gpgcheck=0 # This one is needed for xen packages [VT] name=Instructor VT Repository baseurl=file:///mnt/cdrom/VT gpgcheck=0 # This one is needed for clustering packages [Cluster] name=Instructor Cluster Repository baseurl=file:///mnt/cdrom/Cluster gpgcheck=0 # This one is needed for cluster storage (GFS, iSCSI target, etc...) packages [ClusterStorage] name=Instructor ClusterStorage Repository baseurl=file:///mnt/cdrom/ClusterStorage gpgcheck=0
4.1.4、安裝NtpServer服務器,修改配置文件
[root@stepping ~]#yum –y install ntp [root@stepping ~]#vim /etc/ntp.conf restrict default kod nomodify notrap nopeer noquery #默認禁止所有客戶端請求時間同步 restrict -6 default kod nomodify notrap nopeer noquery #IPv6的定義 # Permit all access over the loopback interface. This could # be tightened as well, but to do so would effect some of # the administrative functions. restrict 127.0.0.1 restrict -6 ::1 restrict 192.168.0.0 mask 255.255.0.0 nomodify #restrict 定義允許同步的網段 # Hosts on local network are less restricted. #restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap # Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). server 127.0.0.1 #本地上層的ntp服務器,這個必須定義的,指向本地就行 [root@stepping ~]#chkconfig ntpd on [root@stepping ~]#service ntpd start
4.1.5、通過stepping主機做跳板機配置其他節點的配置
首先定義一個命令別名,方便下面的多個服務器上部署操作:
[root@stepping ~]#alias hap='for I in {1..4}; do' 配置包括Target在內的主機的命令別名 [root@stepping ~]#alias hcp='for I in {1..3}; do' 配置不包括Target在內的主機的命令別名
4.1.6、配置node1-node4節點、同步各個節點的時間、複製hosts文件、關閉iptables和selinux、複製stepping的yum源文件server.repo
1.配置node1-node4節點主機名
[root@stepping ~]#hap ssh node$I "hostname node$I.example.com" ; done 注意此處由於命令中有變量,使用雙引號
2.同步各個節點時間
[root@stepping ~]#hap ssh node$I 'ntpdate 192.168.0.15' ; done
3.複製hosts文件到各個節點
[root@stepping ~]#hap scp /etc/hosts node$I:/etc/ ; done
4.關閉各個節點的selinux設置、關閉iptables
[root@stepping ~]#hap ssh node$I 'setenforce 0' ; done [root@stepping ~]#hap ssh node$I 'iptables -F;service iptables save;service iptables stop' ; done
5.配置各個節點上的yum
[root@stepping ~]#hap ssh node$I 'mount /dev/cdrom /mnt/cdrom' ; done [root@stepping ~]#hap scp /etc/yum.repos.d/server.repo node$I:/etc/yum.repos.d/ ; done
4.2、在node1、node2、node3上安裝apache的httpd服務,並進行相關的測試
4.2.1、安裝http服務,並配置index.html
[root@stepping ~]#hcp ssh node$I 'yum -y install httpd' ; done #安裝httpd服務,注意只需在node1-3,所以使用hcp
[root@stepping ~]#hcp ssh node$I "echo node$I.example.com > /var/www/html/index.html"; done #設置節點上的各個主頁內容,分別爲node1.example.com、node2.example.com、node3.example.com 注意:要重新編輯各個節點的index.html
4.2.2、啓動httpd服務並通過curl進行測試
[root@stepping ~]#hcp ssh node$I "service httpd start"; done [root@stepping ~]#hcp curl node$I ; done [root@stepping ~]#hcp ssh node$I "service httpd stop"; done [root@stepping ~]#hcp ssh node$I "chkconfig httpd off"; done
4.3、安裝配置RHCS套件:cmam、rgmanager、system-config-cluster
說明:RHCS的核心組件爲cman和rgmanager,其中cman爲基於openais的“集羣基礎架構層”,rgmanager爲資源管理器。RHCS的集羣中資源的配置需要修改其主配置文件/etc/cluster/cluster.xml實現,這對於很多用戶來說是比較有挑戰性的,因此,RHEL提供了system-config-cluster這個GUI工具,其僅安裝在集羣中的某一節點上即可,而cman和rgmanager需要分別安裝在集羣中的每個節點上。這裏選擇將此三個rpm包分別安裝在了集羣中的每個節點上,這可以在跳板機上執行如下命令實現;RHCS的配置文件/etc/cluster/cluster.conf,其在每個節點上都必須有一份,且內容均相同,其默認不存在,因此需要事先創建,ccs_tool命令可以完成此任務。另外,每個集羣通過集羣ID來標識自身,因此,在創建集羣配置文件時需要爲其選定一個集羣名稱,這裏假設其爲tcluster。此命令需要在集羣中的某個節點上執行。
此在node1上配置
4.3.1、安裝RHCS套件:cmam、rgmanager、system-config-cluster
[root@stepping ~]# hcp ssh node$I "yum -y install cman rgmanager system-config-cluster"; done
說明:以下操作都是在node1.example.com節點上操作
4.3.2建立集羣tcluster
[root@node1 ~]#ccs_tool create tcluster ##會在/etc/cluster中生成cluster.conf集羣的配置文件(xml格式)
4.3.3添加fence設備
說明:一個RHCS集羣至少需要一個fence設備,正常環境中,可以選擇將其配置到集羣中來。這裏爲演示環境,沒有可用的fence設備,因此,選擇使用“manual fence”,即手動fence。創建fence設備也需要使用ccs_tool命令進行,其需要在集羣中的某節點上執行,而且需要與前面創建集羣配置文件時所執行的命令在同一個節點上進行。
查看fence代理的名稱,可以通過查看cman安裝生成文件來實現。
[root@node1 ~]# rpm -ql cman | grep /sbin/fence
命令行添加集羣,但是不能添加資源。
這裏爲tcluster添加名爲meatware的fence設備,其fence代理爲fence-manual。
[root@node1 ~]# ccs_tool addfence meatware fence-manaual ##RHCS需要先定義隔離設備 接着可以使用ccs_tool lsfence查看fence設備: [root@node1 ~]# ccs_tool lsfence
4.3.4爲集羣tcluster添加節點
說明:RHCS集羣需要配置好各節點及相關的fence設備後才能啓動,因此,這裏需要事先將各節點添加進集羣配置文件。每個節點在添加進集羣時,需要至少爲其配置node id(每個節點的id必須惟一)及相關的fence設備兩個屬性。ccs_tool的addnode子命令可以完成節點添加。例如將前面規劃的三個集羣節點添加至集羣中,可以使用如下命令實現。
[root@node1 html]# ccs_tool addnode -n 1 -f meatware node1.example.com running ccs_tool update... [root@node1 html]# ccs_tool addnode -n 2 -f meatware node2.example.com running ccs_tool update... [root@node1 html]# ccs_tool addnode -n 3 -f meatware node3.example.com running ccs_tool update... -n 指定節點ID -f 指定fence設備
ok這些添加完成就可以啓動集羣了,必須在每個節點啓動,這個不能在stepping主機上進行操作,因爲此服務需要一個節點一個節點的進行啓動,當所有服務器的服務都啓動起來以後才能完成配置文件的複製才能啓動完成
4.3.5、各個節點上分別啓動cman服務
[root@node1 ~]#service cman start [root@node2 ~]#service cman start [root@node3 ~]#service cman start
4.3.6、在stepping上啓動rgmanager服務,
[root@stepping ~]# hcp ssh node$I "service rgmanager start"; done [root@stepping ~]# hcp ssh node$I "cman_tool status"; done cman_tool的nodes子命令則可以列出集羣中每個節點的相關信息。 [root@stepping ~]# hcp ssh node$I "cman_tool nodes"; done
4.3.7、配置集羣服務涉及到配置故障轉移域、服務及資源,這些需要手動修改集羣配置文件,或使用system-config-cluster這個GUI程序完成。這裏使用GUI的方式進行
[root@node1 ~]#system-config-cluster &
1.添加Resources內的IP資源
2.定義httpd資源
3.定義服務。
4.配置好以後點擊右上角的按鈕“send to cluster”提交給服務器
5.然後進入節點查看節點狀態:
[root@node1 ~]# clustat [root@node1 ~]# clustat luster Status for tcluster @ Wed Nov 28 18:38:19 2012 Member Status: Quorate Member Name ID Status ------ ---- ---- ------ node1.example.com 1 Online, rgmanager node2.example.com 2 Online, rgmanager node3.example.com 3 Online, Local, rgmanager Service Name Owner (Last) State ------- ---- ----- ------ ----- service:WebService node1.example.com started
6.利用clusvcadm –r webservice –m node1.example.com可以把服務遷移到節點node1上去
五、安裝target並配置
5.1、安裝scsi-target-utils的rpm包
[root@node4 ~]# yum install scsi-target-utils
5.2、建立一2G分區,我建的是/dev/sda5 ##不要格式化,記得partprobe
5.3 編輯配置文件/etc/tgt/targets.conf,添加一個target,如下
<target iqn.2014-08.com.example.dengyw:tcluster.disk1> backing-store /dev/sda5 ##後備存儲,一般指一個分區,或lvm設備 initiator-address 192.168.0.0/24 ##指定intiaor只能是這個地址範圍 #direct-store /dev/sdb ##直接存儲,通常指一個磁盤如/dev/sda5 #incominguser redhat redhat ##定義基於賬戶認證Initiator,後面的是賬號與密碼 #outgoinguser userA secretpassA ##Initiator也可以驗證target,這個target的賬號密碼 </target> ##targetname 格式 iqn-name: iqn.yyyy-mm.<reversed domain name>[identifer] -------------------------------不是很華麗的分隔線------------------------------------- 我們也可以有命令行來配置,只不過重啓後會失效哦 用法:tgtadm --lld [driver] --op [operation] --mode [mode] [OPTION].. 新增target: tgtadm --lld iscsi --op new --mode target --tid 1 --targetname \ iqn.2014-08.com.example.dengyw:tcluster.disk1 顯示新增的target: tgtadm --lld iscsi --op show --mode target 新增一localunit: tgtadm --lld -iscsi --op new --mode localunit --tid 1 --lun 1 --backing-store /dev/sda5 新增ACL允許192.168.0.0/24網段使用: tgtadm --lld iscsi --op bind --tid 1 --initiator-address 192.168.0.0/24 新增賬戶認證: 建立賬戶: tgtadm --lld iscsi --op new --mode account --user redhat --password redhat 查看新建賬戶: tgtadm --lld iscsi --op show --mode account 綁定賬戶到target: tgtadm --lld iscsi --op bind --mode account --tid 1 --user hadoop 查看target信息: tgtadm --lld iscsi --op show --mode target
5.4 啓動tgtd服務,驗證target是否分享出去
service tgtd start tgtadm --lld iscsi --op show --mode target Target 1: iqn.2014-08.com.example.dengyw:tcluster.disk1:sda5 System information: Driver: iscsi State: ready I_T nexus information: LUN information: LUN: 0 Type: controller SCSI ID: IET 0000000 SCSI SN: beaf0 Size: 0 MB, Block size: 1 Online: Yes Removable media: No Readonly: No Backing store type: null Backing store path: None Backing store flags: LUN: 1 Type: disk SCSI ID: IET 0000001 SCSI SN: beaf11 Size: 012 MB, Block size: 512 Online: Yes Removable media: No Readonly: No Backing store type: rdwr Backing store path: /dev/sda5 Backing store flags: Account information: ACL information: 192.168.0.0/24
設置訪問控制列表,允許此網段內的主機使用
5.5設置開機自動啓動
[root@node4 ~]#chkconfig tgtd on
六、安裝配置scis的客戶端並讓其發現使用SCSI
6.1在node1、node2、node3上分別安裝iscsi-initiator-utils,此命令在stepping上執行如下命令
[root@stepping ~]# hcp ssh node$I "yum install -y iscsi-initiator-utils"; done #redhat上可能已經安裝過了
6.2分別設置各個節點的名稱
[root@stepping ~]# hcp ssh node$I "echo "InitiatorName=iqn.2014-08.com.example.dengyw" > /etc/iscsi/initiatorname.iscsi"; done
6.3啓動iscsi服務並設置成開機啓動
[root@stepping ~]# hcp ssh node$I 'service iscsi start' ; done [root@stepping ~]# hcp ssh node$I 'chkconfig iscsi on' ; done
6.4發現target並進行登錄
[root@stepping ~]# hcp ssh node$I 'iscsiadm -m discovery -t st -p 192.168.0.14' ; done [root@stepping ~]# hcp ssh node$I 'iscsiadm -m node -T iqn.2014-08.com.example.dengyw:tcluster.disk1 -p 192.168.0.14 -l' ; done -m 指定模式 man 一下 -t sendtargets 在discovery模式下使用 -p portal 指定target的IP與端口,如果是默認端口3260可省略 -l login 登錄 -u logout 個爲登出
6.5在node1、node2、node3上分別安裝gfs2-utils、lvm2-cluster
[root@stepping ~]# hcp ssh node$I "yum install -y gfs2-utils lvm2-cluster"; done #安裝服務 [root@stepping ~]# hcp ssh node$I "lvmconf --enable-cluster"; done #開啓lvm支持clvm,也可以在/etc/lvm/lvm.conf內設置locking_type = 3 即可 [root@stepping ~]# hap ssh node$I "service clvmd start"; done #啓動服務
6.6下面在node1上進行配置集羣邏輯卷
[root@node1 ~]# pvcreate /dev/sdb [root@node1 ~]# vgcreate myvg /dev/sdb [root@node1 ~]# lvcreate -L 500M -n mydata myvg
此時在其他節點上查看,就可以看到我們創建的邏輯捲了
[root@node2 ~]# lvs
6.7格式化上面新建的邏輯卷
[root@node1 ~]# mkfs.gfs2 -p lock_dlm -t tcluster:ltb1 -j 3 /dev/myvg/mydata mkfs.gfs2 -j #: 指定日誌區域的個數,有幾個就能夠被幾個節點所掛載; -J #: 指定日誌區域的大小,默認爲128MB; -p {lock_dlm|lock_nolock}: -t <name>: 鎖表的名稱,格式爲clustername:locktablename, clustername爲當前節點所在的集羣的名稱,locktablename要在當前集羣惟一
6.8下面進行掛載文件系統,需要在每個節點上都掛載
[root@node1 ~]# mount -t gfs2 /dev/myvg/mydata /var/www/html/ [root@node2 ~]# mount -t gfs2 /dev/myvg/mydata /var/www/html/ [root@node3 ~]# mount -t gfs2 /dev/myvg/mydata /var/www/html/
6.9在node1上創建index.html
[root@node1 ~]# cd /var/www/html/ [root@node1 html]# vim index.html 添加如下 gfs2.example.com
在節點一上增加的內容其會自動同步到其他節點上的
現再訪問vip,其主頁內容如下,已經變成了我們共享存儲上的主頁了
下面把服務前移到node1上去並進行測試