RHCS基于RHEL6.0 x86_64(详解)

RHCS基于RHEL6.0 x86_64(实验教程


实验说明:所用的RHEL版本均为6.0 x86_64,宿主机支持虚拟化,内存不小于4G。

实验拓扑如下:


在本实验中,为了节省资源将ISCSI-Target也放到manager一个机器上了。

vmware创建一个虚拟机,内存3G,按下图设置使得虚拟机也支持虚拟化,vmware workstation版本不低于7:


在这个虚拟机中装好rhel6,ip192.168.0.200,作为RHCS的管理端,继续在其上安装kvm,kvm的安装请查看我之前写的关于kvm文档,kvm安装好后,创建两个vm(virtual machine),桥接到192.168.0.200的物理网卡上,vm上安装好rhel6,ip分别为192.168.0.201和192.168.0.202,作为RHCS的节点,这样的拓扑设计的原因是我们可以在RHCS中使用fence-virsh来fence掉kvm管理的RHCS故障节点。

使用hostname指令设置主机名,想重启之后生效别忘了/etc/sysconfig/network,因为本环境中没有使用DNS,所以在manager上设置/etc/hosts添加如下三行,再scp到web1和web2。

[root@manager ~]# vim /etc/hosts

127.0.0.1       localhost.localdomain   localhost

::1             localhost6.localdomain6 localhost6

192.168.0.200   manager.sswans.com manager

192.168.0.201   web1.sswans.com web1

192.168.0.202   web2.sswans.com web2

manager、web1、web2均关闭selinux、iptables。

在manager上建1个target,2个lun,用作导出iscsi存储给节点使用。 主要步骤及指令如下:

fdisk分出来两个分区sda5、6,大小为1G、10M,fdisk之后使用partx -a /dev/sda重读分区,可以不用重启系统。

[root@manager ~]# yum install scsi-target-utils -y 安装iscsi-target端

[root@manager ~]# chkconfig tgtd on ; /etc/init.d/tgtd start 随机启动;启动服务

[root@manager ~]# tgtadm -L iscsi -m target -o new -t 1 -T iqn.2011-01.com.sswans:disk1 创建target

[root@manager ~]# tgtadm -L iscsi -m logicalunit -o new -t 1 -l 1 -b /dev/sda5 创建lun1,对应sda5分区

[root@manager ~]# tgtadm -L iscsi -m logicalunit -o new -t 1 -l 2 -b /dev/sda6 创建lun2,对应sda6分区

[root@manager ~]# tgtadm -L iscsi -m target -o bind -t 1 -I ALL 设置ACL访问控制,ALL为任意访问

[root@manager ~]# tgt-admin --dump > /etc/tgt/targets.conf dump保存配置,以后每次重启都会生效

安装luci工具,RHCS管理端,请配置好yum仓库,RHCS相关的包在iso镜像中的HighAvailability和ResilientStroage中

[root@manager ~]# yum install luci -y

[root@manager ~]# chkconfig luci on ; /etc/init.d/luci start

Point your web browser to https://manager.sswans.com:8084 to access luci 等节点安装好ricci后,可以使用这个url对节点进行管理和配置

节点web1、web2上都执行如下动作,以web1为例:

[root@web1 ~]# yum install rgmanager -y 会自动安装ricci、cman等包

[root@web1 ~]# chkconfig ricci on ; /etc/init.d/ricci start

[root@web1 ~]# chkconfig NetworkManager off ; /etc/init.d/NetworkManager stop

[root@web1 ~]# chkconfig cman on ; chkconfig rgmanager on ; chkconfig modclusterd on

[root@web1 ~]# /etc/init.d/cman start ; /etc/init.d/rgmanager start;/etc/init.d/modclusterd start

使用浏览器打开luci的url,新建一个集群,名为sSWans,添加两个节点,一个名为web1,另一个名为web2,因为之前在两个节点上都安装了ricci、cman等包,所以单选use locally installed packages,enable shared storage support选项其实就是指的gfs,我们在后面手动装包来实施,这里不勾选。

检查节点的服务状态,确定cman、rgmanager、ricci、modcluster服务处于running状态。如有问题,请注意查看节点的/var/log/message日志进行排错。

点击菜单中的Failover Domains,添加一个热备切换域,名为web_FD,勾选no Failback,勾选web1,web2两个节点。

点击菜单中的Resources,添加一个ip address资源,ip为192.168.0.252,这个ip就是提供服务的虚拟ip,再添加一个script,名为http,脚本路径/etc/init.d/httpd。

点击菜单中的Services,添加一个服务,名为apache,选择刚创建的热备切换域web_FD,添加资源,把刚创建的ip资源和脚本资源添加进来,如果服务需要使用的资源具有先后关系,那么需要将前提资源以子资源(add a child resource)的形式添加。

在两个节点上针对httpd写一个index.html的页面,web1上 [root@web1 ~]# echo web1 > /var/www/html/index.html ,web2的index.html内容为web2,这样待会服务启动后,我们去访问这个apache服务,可以通过访问到的内容来检测集群提供的服务是由哪个节点完成的。

在两个节点上都监控日志tail -f /var/log/message,启动这个apache服务,查看服务启动时节点的信息,有助于更好的理解rhcs和增加排错经验。如无意外,此时应该可以看到apache服务会在其中一个节点上启动,我的启动在web1上,在Services菜单可以看到,在任意节点上用指令clustat查看更快更方便。

做到这里,我们完成了一个rhcs的最小部署,也是一个特殊情况,也就是two_node两节点模式,此时的集群可以提供设定的web服务,在节点web1使用init指令关机或重启,apache服务都能正常迁移到节点web2,但是,如果提供服务的web1节点网卡故障,我们可以使用指令模拟网卡故障 [root@web1 ~]# ifdown eth0 ,那么集群无法将web服务迁移到web2节点上,从日志可以看到web2要fence掉web1,但是没有fence method,此时,我们在正常节点web2上使用指令

[root@web2 ~]# fence_ack_manual web1

About to override fencing for web1.

Improper use of this command can cause severe file system damage.

Continue [NO/absolutely]? absolutely

Done

意思是告诉正常节点web2,已经成功fence掉故障节点web1,web2可以抢夺原本运行在web1上的apache服务了,注意看日志,这原本就是fence设计的原理。如果你没有使用fence_ack_manual而将web1的网卡重新开启或者重启web1,那么web2的cman服务会被停止掉,留意web2的日志,这种情况下,web2的cman服务重启不了啦,你只能选择重启系统。

因此,我们的集群是需要fence设备的,下面开始添加fence设备,在节点web1和web2上做如下动作:

[root@web1 ~]# mv /usr/sbin/fence_apc{,.bak}

[root@web1 ~]# ln -s /usr/sbin/fence_virsh /usr/sbin/fence_apc

因为在luci的Fence Devices菜单中,添加fence设备,下拉菜单中并没有fence_virsh项,所以上面的动作就是用fence_virsh替换fence_apc。

偷龙转凤之后,我们选择下拉菜单中的fence_apc,其实这时候调用的是fence_virsh,name填virsh_fence,ip填192.168.0.200,login填root,password填上对应的密码,这样子,我们就成功添加了一个可以fence kvm节点的fence设备,接下来,将这个fence设备应用到节点上,web1为例,luci中点击web1节点,添加fence_method,名为web_fence,再添加fence instance,选择刚创建的virsh_fence,port填web1,此处的web1不是web1的hostname,而是kvm上的vm名;节点web2上port换成web2,其他跟web1设置一样。

很有必要解释一下fence工作原理,当web1网卡故障的时候,web1是与外部网络断开连接的,但web1会认为web2挂掉了,web1使用fence设备去fence  web2,因为web1的网卡故障,所以web1  fence  web2是不会成功的,同时web2也会发现web1挂掉了,web2使用fence设备去fence  web1,web2的网卡是正常的,所以web2的fence指令能正常发送到fence设备上,fence掉web1,并且会把原来由web1提供的apache服务及资源抢夺过来,由web2对外提供apache服务。

以上fence设置的默认action为reboot,如果要换成off关机,需修改/etc/cluster/cluster.conf文件,添加红字部分,<device name="virsh_fence" port="web1" action="off"/>,如果web1、web2及manager相互之间ssh是以密钥进行认证的,那么我们需要在cluster.conf中对fence设备添加私钥的位置及指明用加密的模式,红字部分,<fencedevice agent="fence_apc" identity_file="/root/.ssh/id_rsa" ipaddr="192.168.0.200" login="root" name="virsh_fence" passwd="redhat"/>,如果是使用用户名和密码进行ssh认证,则上面的红字部分不需要添加。在kvm虚拟化环境,并且有高安全需求的情况下,显然这是很不错的选择。请注意,在任意节点上修改cluster.conf之后,需要增加config_version的值,再使用指令scp或者ccs_sync将cluster.conf传播到其他节点。

配置好fence之后,回到services菜单,看到web服务是运行在web1上的,我们再次将web1的网卡故障掉,你会发现web1会自动重启,并且web2抢夺到原本运行在web1上的apache服务,作为集群提供服务的节点。这个过程依然不要忘记多看日志。

接下来,我们再体验GFS,之前不是在manager上导出了iscsi的存储吗,现在有用武之地了,在两个节点上使用如下动作挂载iscsi存储:

[root@web1 ~]# yum install iscsi-initiator-utils -y 挂载iscsi存储需要安装的包

[root@web1 ~]# chkconfig iscsi on

[root@web1 ~]# iscsiadm -m discovery -t sendtargets -p 192.168.0.200

[root@web1 ~]# /etc/init.d/iscsi start 启动iscsi服务,发现/dev下多了两个盘,sdb,sdc

[root@web1 ~]# udevadm info -q all -n /dev/sdb 查看sdb设备在被内核识别时候的信息,用作写udev规则,用来固定iscsi设备在本机的设备名称。

从上条指令结果中提取这条用作书写udev规则的条件,ID_SCSI_SERIAL=beaf11

[root@web1 ~]# vim /etc/udev/rules.d/99-iscsi.rules

KERNEL=="sd[b-z]",ENV{ID_SCSI_SERIAL}=="beaf11",NAME="disk_gfs"

KERNEL=="sd[b-z]",ENV{ID_SCSI_SERIAL}=="beaf12",NAME="qdisk

[root@web1 ~]# udevadm trigger 触发刚写的udev规则,查看/dev下,sdb,sdc已经不见了,出现了disk_gfs和qdisk两个块设备

[root@web1 ~]# yum install lvm2-cluster gfs2-utils -y 安装gfs需要的包

[root@web1 ~]# chkconfig clvmd on

clvm信息是自动在集群节点上同步的,所以以下动作只需在任意节点上做一次,在此之前,修改lvm2支持集群,使用指令

[root@web1 ~]# lvmconf --enable-cluster

确保各个上的clvmd服务是启动的。

[root@web1 ~]# pvcreate /dev/disk_gfs      创建物理卷

[root@web1 ~]# vgcreate gfs /dev/disk_gfs 创建卷组

[root@web1 ~]# vgdisplay gfs | grep Cluster 可以看到 Clustered    yes表示是clvm,在其他节点也可以看到相同信息

[root@web1 ~]# lvcreate -l 100%free -n gfslv gfs 创建名为gfslv的逻辑卷,使用gfs卷组100%的剩余空间

[root@web1 ~]# mkfs.gfs2 -j 2 -t sSWans:gfslv -p lock_dlm /dev/gfs/gfslv

格式化为gfs2,设定锁机制及2份journal,-t分两部分,集群名:设备名,格式化的时间有点长,耐心等待。

[root@web1 ~]# mount -t gfs2 /dev/gfs/gfslv /var/www/html

[root@web1 ~]# echo web-service > /var/www/html/index.html 设置index.html页面的内容

[root@web1 ~]# echo "/dev/gfs/gfslv /var/www/html gfs2 defaults 0 0" >> /etc/fstab 设置启动自动挂载,两个>>,别写成>

在luci的Resources菜单添加一个gfs2资源,name为web_data,mount point为/var/www/html,filesystem type为gfs2。打开Services菜单,点击apache服务,添加一个资源,选择刚创建的web_data。

这时候已经是个完整的两节点RHCS应用了。附上cluster.conf

<?xml version="1.0"?>

<cluster config_version="33" name="sSWans">

        <fence_daemon clean_start="0" post_fail_delay="0" post_join_delay="3"/>

        <clusternodes>

                <clusternode name="web1" nodeid="1" votes="1">

                        <fence>

                                <method name="web_fence">

                                        <device action="reboot" name="virsh_fence" port="web1"/>

                                </method>

                        </fence>

                </clusternode>

                <clusternode name="web2" nodeid="2" votes="1">

                        <fence>

                                <method name="web_fence">

                                        <device action="reboot" name="virsh_fence" port="web2"/>

                                </method>

                        </fence>

                </clusternode>

        </clusternodes>

        <cman expected_votes="1" two_node="1"/>

        <fencedevices>

                <fencedevice agent="fence_apc" identity_file="/root/.ssh/id_rsa" ipaddr="192.168.0.200" login="root" name="virsh_fence" passw

d="redhat"/>

        </fencedevices>

        <rm>

                <failoverdomains>

                        <failoverdomain name="web_FD" nofailback="1" ordered="0" restricted="0">

                                <failoverdomainnode name="web1" priority="1"/>

                                <failoverdomainnode name="web2" priority="1"/>

                        </failoverdomain>

                </failoverdomains>

                <resources>

                        <ip address="192.168.0.252/24" monitor_link="on" sleeptime="10"/>

                        <script file="/etc/init.d/httpd" name="http"/>

                        <clusterfs device="/dev/gfs/gfslv" fsid="65174" fstype="gfs2" mountpoint="/var/www/html" name="web_data"/>

                </resources>

                <service autostart="0" domain="web_FD" exclusive="0" name="apache" recovery="relocate">

                        <ip ref="192.168.0.252/24"/>

                        <script ref="http"/>

                        <clusterfs ref="web_data"/>

                </service>

        </rm>

</cluster>

 

接下来,我们继续讨论一个问题,当节点超过两个的时候,比如说四节点,如果1、2节点通信正常,3、4节点通信正常,但是1、2和3、4之间通信不正常,那么1、2形成一个组,3、4形成一个组,互不相让,争夺服务和资源,形成split-brain,这是我们不希望出现的状况,我们怎么去解决这个问题呢?答案就是使用quorum disk仲裁磁盘。这种机制是这样的,集群的每个节点都分配一个投票数,一般情况下票数为1,票数如果不一样通常是因为节点性能不同、电源或者网络或者存储是否有冗余等因素,qdisk是一个共享存储,一般10M大小就够了,所有节点周期性地在qdisk上进行签到(目前RHCS最多支持16个节点签到)。qdisk也设置成具有一定的票数,签到成功的节点可以赢得qdisk的投票,当票数超过票数总和的一半时,集群才能启动。那之前的两节点没有使用qdisk,节点之间通信故障,为什么没有形成split-brain呢,那是因为two-node是一个特殊情况,所以在前面的cluster.conf中<cman expected_votes="1" two_node="1"/>已经声明了两节点模式,所以RHCS避免了split-brain。

还记得之前在manager上导出了一个1G和一个10M的iscsi存储吗?并且都在节点上挂载了的,挂载成/dev/disk_gfs的做了gfs存储,另一个挂载成什么?对了,          /dev/qdisk,我们就利用它来做quorum disk。在任意节点上对共享存储分区进行qdisk格式化,标签为qdiskWeb,完成后可以在其他节点使用mkqdisk -L来查看qdisk信息。嗯,在做qdisk之前,我们先把之前two_node模式的集群状态用指令显示出来,等下和非two_node模式做比较用。

[root@web2 ~]# cman_tool status > status 将集群信息重定向到主目录下的status文件,稍后做比较

[root@web2 ~]# mkqdisk -c /dev/qdisk -l qdiskWeb 格式化qdisk

然后在luci的Configure菜单里选择Qdisk Configuration,设置Interval、Votes、Minimum Score都为1,TKO(原本为拳击术语,技术性击倒,在这可以理解为失败次数上限)为10,单选By device label,值为qdiskWeb,设置Heuristics,Path to Program为ping -c1 192.168.0.200,Interval为2,Score为1,TKO为3,Heuristics是qdisk的一个增强机制,试想一下,如果web1和web2之间的网络连接断开了,但是都和qdisk有连接,那么qdisk还能起到原本该有的作用吗?显然是不能的,所以我们可以使用heuristics,增加一些其他的检测手段,来确定到底是哪个节点有问题应该被fence掉。在默认情况下,expected_votes是等于total_votes的,集群启动的条件为获得的票数>expected_votes/2,也就是说quorum值 = expected/2 + 1。

细心的同学应该已经发现cluster.conf中<cman expected_votes="1" two_node="1"/>已经变成<cman expected_votes="3"/>,two_node不显式写出来的话,默认值为0,可以得出一个结论,two_node模式是不需要qdisk的,而开启qdisk之后,two_node模式会自动关闭,并且期待票数由1票变为3票了。

配置好后,在各节点上/etc/init.d/cman start启动qdisk,很可能会失败,查看messages日志,发现需要将token timeout调到不低于某个值,在Configure菜单里有个Network Configuration,点击show advanced properties,修改token timeout值,并修改consensus timeout为token timeout+2000,再启动cman就可以了。

在任意节点使用clustat可以看到qdisk开始工作了,再使用cman_tool status查看信息,与之前的status文件进行比较,相信你应该可以自己得出结论了。

那么到这,RHCS就跟大家讲完了,超过两节点的RHCS大家自己做做吧。

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值