一、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      跳板机,此处利用在跳板机上利用循环语句一次性部署多个服务器。

其架构图如下

wKioL1P2u33TALrRAAQWorRNHOw012.jpg

四、搭建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资源

wKioL1P2vKqS7EZTAAI1A54JFcs680.jpg

wKiom1P2u5KRfxxKAAHYKwv3mh8131.jpg

wKioL1P2vPHDpu04AALl1ue1xKM151.jpg

2.定义httpd资源


wKioL1P2vROAHsP7AALgMGBI8yM269.jpg



3.定义服务。


wKiom1P2u_zT-gfdAAKpCWdD0Iw787.jpg

wKioL1P2vRSDCMnqAAPcHO6qopY932.jpg

4.配置好以后点击右上角的按钮“send to cluster”提交给服务器

wKiom1P2vDyyUG4_AAVMcSPM5Dw077.jpg

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上去并进行测试