本文系统Centos 6.5 x64

共四台主机,

192.168.100.128 Aries.lansgg.com               存储共享服务器

192.168.100.129 node1.lansgg.com             测试客户端
192.168.100.130 node2.lansgg.com             测试客户端

192.168.100.131 node3.lansgg.com             测试客户端

目的:存储server通过iscsi共享,node 1 2 3 三台主机挂载存储,达到高可用,灵活性机制。利用RHCS搭建GFS2高可用集群文件系统,且保证3个节点对存储设备能够同时读写访问

1、GFS2

是一个基于GFS的先进的集群文件系统,能够同步每台主机的集群文件系统的metadata,能够进行文件锁的管理,并且必须要redhat cluster suite(RHCS)支持,GFS2可以grow,进行容量的调整,不过这是在LVM基础上。

GFS是Redhat公司开发的一款集群文件系统,目前的最新版本是GFS2,GFS文件系统允许多个服务同时读写一个磁盘分区,通过GFS可以实现数据的集中管理,免去了数据同步和拷贝的麻烦,但GFS并不能孤立的存在,安装GFS需要RHCS的底层组件支持

2、CLVM (Cluster Logical Volume Manager )

Cluster逻辑卷管理,即CLVM,是LVM的扩展,这种扩展允许cluster中的机器使用LVM来管理共享存储

3、iSCSI

 iSCSI是一种在Internet协议上,特别是以太网上进行数据块传输的标准,它是一种基于IP Storage理论的新型存储技术,RHCS可以通过ISCSI技术来导出和分配共享存储的使用。

4、CMAN (Cluster Manager,简称CMAN)

是一个分布式集群管理工具,它运行在集群的各个节点上,为RHCS提供集群管理任务。
CMAN用于管理集群成员、消息和通知。它通过监控每个节点的运行状态来了解节点成员之间的关系,当集群中某个节点出现故障,节点成员关系将发生改变,CMAN及时将这种改变通知底层,进而做出相应的调整。

CMAN通过监视集群节点提供一个法定节点数(quorum),当集群 中有多于一半的节点处于活跃状态时,此时符合法定节点数,集群继续可用,当只有有一半或少于一半的节点处于活跃状态是则已达到不到法定节点数,此时整个集 群变得不可用。CMAN通过监控集群中节点来确定各节点的成员关系,当集群中的成员关系发生改变,CMAN会通架构中其它组件来进行相应的调整

5、rgmanager

RHCS通过rgmanager来管理集群服务,rgmanager运行在每个集群节点上,在服务器上对应的进程为clurgmgrd。
 在一个RHCS集群中,高可用**包含集群服务和集群资源两个方面,集群服务其实就是应用服务,例如apache、mysql等,集群资源有很多种,例如一个IP地址、一个运行脚本、ext3/GFS文件系统等

一、配置登录方式

[root@Aries ~]# ssh-keygen -t rsa

[root@Aries ~]# ssh-copy-id -i node1.lansgg.com[root@Aries ~]# ssh-copy-id -i node2.lansgg.com[root@Aries ~]# ssh-copy-id -i node3.lansgg.com

[root@Aries ~]# for i in 1 2 3; do ssh node${i}.lansgg.com 'service iptables stop';done[root@Aries ~]# for i in 1 2 3; do ssh node${i}.lansgg.com 'setenforce 0';done

二、集群插件安装

集群安装

RHCS 的核心组件为cman和rgmanager,其中cman为基于openais的“集群基础架构层”,rgmanager为资源管理器。RHCS的集群中 资源的配置需要修改其主配置文件/etc/cluster/cluster.xml实现,cman和 rgmanager需要分别安装在集群中的每个节点上。这里选择将此三个rpm包分别安装在了集群中的每个节点上

[root@Aries ~]# for i in 1 2 3; do ssh node${i}.lansgg.com 'yum -y install cman rgmanager';done

为集群创建配置文件

RHCS 的配置文件/etc/cluster/cluster.conf,其在每个节点上都必须有一份,且内容均相同,其默认不存在,因此需要事先创建,ccs_tool命令可以完成此任务。另外,每个集群通过集群ID来标识自身,因此,在创建集群配置文件时需要为其选定一个集群名称,这里假设其为 tcluster。此命令需要在集群中的节点上执行。ccs_tool命令用于在线更新CCS的配置文件

[root@Aries ~]# for i in 1 2 3; do ssh node${i}.lansgg.com 'ccs_tool create testCluster';done

查看生成的配置文件的内容

[root@node1 ~]# hostname node1.lansgg.com[root@node1 ~]# cat /etc/cluster/cluster.conf 
  
  
  
  
  
    
    
  

为集群添加节点

RHCS 集群需要配置好各节点及相关的fence设备后才能启动,因此,这里需要事先将各节点添加进集群配置文件。每个节点在添加进集群时,需要至少为其配置 node id(每个节点的id必须惟一),ccs_tool的addnode子命令可以完成节点添加。将前面规划的三个集群节点添加至集群中,可以使用如下命令实现。

[root@Aries ~]# for i in 1 2 3; do ssh node${i}.lansgg.com 'ccs_tool addnode -n 1 node1.lansgg.com';done[root@Aries ~]# for i in 1 2 3; do ssh node${i}.lansgg.com 'ccs_tool addnode -n 2 node2.lansgg.com';done[root@Aries ~]# for i in 1 2 3; do ssh node${i}.lansgg.com 'ccs_tool addnode -n 3 node3.lansgg.com';done

查看已经添加完成的节点及相关信息:

[root@Aries ~]# for i in 1 2 3; do ssh node${i}.lansgg.com ' ccs_tool lsnode';done

启动集群

RHCS集群会等待各节点都启动后方才进入正常工作状态,因此,需要把集群各节点上的cman服务同时启动起来。这分别需要在各节点上执行启动命令

[root@node1 ~]# service cman start

推荐分别在主机同时启动,可能会报错,比如:

   Waiting for quorum... Timed-out waiting for cluster
[root@Aries ~]# for i in 1 2 3; do ssh node${i}.lansgg.com 'service rgmanager start';doneStarting Cluster Service Manager: [确定]Starting Cluster Service Manager: [确定]Starting Cluster Service Manager: [确定]

查看集群状态信息

[root@Aries ~]# for i in 1 2 3; do ssh node${i}.lansgg.com 'clustat';done

cman_tool的status子命令则以当前节点为视角来显示集群的相关信息

[root@node1 ~]# cman_tool statusVersion: 6.2.0Config Version: 4Cluster Name: testClusterCluster Id: 44303Cluster Member: YesCluster Generation: 16Membership state: Cluster-MemberNodes: 3Expected votes: 3Total votes: 3Node votes: 1Quorum: 2  Active subsystems: 8Flags: Ports Bound: 0 177  Node name: node1.lansgg.comNode ID: 1Multicast addresses: 239.192.173.188 Node addresses: 192.168.100.129 [root@node1 ~]#

cman_tool的nodes子命令则可以列出集群中每个节点的相关信息

[root@node1 ~]# cman_tool nodesNode  Sts   Inc   Joined               Name   1   M      8   2015-09-08 14:36:27  node1.lansgg.com   2   M     12   2015-09-08 14:36:27  node2.lansgg.com   3   M     16   2015-09-08 14:36:30  node3.lansgg.com

cman_tool的services子命令则可以列出集群中每个服务的相关信息

[root@node1 ~]# cman_tool servicesfence domainmember count  3victim count  0victim now    0master nodeid 2wait state    nonemembers       1 2 3 dlm lockspacesname          rgmanagerid            0x5231f3ebflags         0x00000000 change        member 3 joined 1 remove 0 failed 0 seq 3,3members       1 2 3 [root@node1 ~]#

ccs_tool  相关命令

1、 首先通过ccs_tool工具创建集群:

ccs_tool create NameofCluster

2、 通过ccs_tool工具创建fence设备:

ccs_tool addfence NameofFence AgentTypeofFence -C

3、 检查已经添加的fence设备:

ccs_tool lsfence  Name             Agent fence-shared     fence_manual

4、 通过ccs_tool工具创建集群中的节点:

ccs_tool addnode NameofNode –v 1 –n 1 –f NameofFence -C

5、 检查已经添加的节点:

[root@node1 ~]# ccs_tool lsnodeCluster name: testCluster, config_version: 4Nodename                        Votes Nodeid Fencetypenode1.lansgg.com                   1    1    node2.lansgg.com                   1    2    node3.lansgg.com                   1    3

6、 检查集群健康状态:

[root@node1 ~]# clustat -i 3Cluster Status for testCluster @ Tue Sep  8 14:45:06 2015Member Status: Quorate Member Name                                                     ID   Status ------ ----                                                     ---- ------ node1.lansgg.com                                                    1 Online, Local node2.lansgg.com                                                    2 Online node3.lansgg.com                                                    3 Online

8、 更新集群配置:

ccs_tool update /etc/cluster/cluster.conf  Config file updated from version 6 to 7  Update complete.

9、 删除集群节点:

ccs_tool delnode NameofNode

10、删除集群fence设备:

ccs_tool delfence NameofFence

三、iscsi 安装配置

[root@Aries ~]# yum -y install scsi-target-utils[root@Aries ~]# for i in 1 2 3 ; do ssh node${i}.lansgg.com 'yum install iscsi-initiator* -y' ;done

编辑target配置,新增如下:

        backing-store /dev/sdb        initiator-address 192.168.100.0/24
Iqn.yyyy-mm.<reversed domain name>:[identifier]
Iqn:表示iscsi squalfled name 简称iqn
Yyyy-mmm:表示年份-月份。
Reversed domain name:表示倒过来的域名。
Identifier:标识识别代码。这里是storage.disk.sdb

backing-store:指定后端要共享的磁盘编号

initiator-address:授权客户端访问的网络地址

incominguser:设置登录用户的账号密码 (无)

启动服务,查看信息

[root@Aries ~]# /etc/init.d/tgtd start正在启动 SCSI target daemon:[确定][root@Aries ~]# tgtadm -L iscsi -m target -o showTarget 1: iqn.2015-09-08.com.lansgg:storage:disk.sdb    System information:        Driver: iscsi        State: ready    I_T nexus information:    LUN information:        LUN: 0            Type: controller            SCSI ID: IET     00010000            SCSI SN: beaf10            Size: 0 MB, Block size: 1            Online: Yes            Removable media: No            Prevent removal: No            Readonly: No            Backing store type: null            Backing store path: None            Backing store flags:         LUN: 1            Type: disk            SCSI ID: IET     00010001            SCSI SN: beaf11            Size: 10737 MB, Block size: 512            Online: Yes            Removable media: No            Prevent removal: No            Readonly: No            Backing store type: rdwr            Backing store path: /dev/sdb            Backing store flags:     Account information:    ACL information:        192.168.100.0/24

node节点发现target

[root@Aries ~]# for i in 1 2 3 ; do ssh node${i}.lansgg.com 'iscsiadm -m discovery -t sendtargets -p 192.168.100.128' ;done[确定]动 iscsid:[确定]192.168.100.128:3260,1 iqn.2015-09-08.com.lansgg:storage:disk.sdb[确定]动 iscsid:[确定]192.168.100.128:3260,1 iqn.2015-09-08.com.lansgg:storage:disk.sdb[确定]动 iscsid:[确定]192.168.100.128:3260,1 iqn.2015-09-08.com.lansgg:storage:disk.sdb

服务启动

[root@Aries ~]# for i in 1 2 3 ; do ssh node${i}.lansgg.com 'service iscsi start' ;done正在启动 iscsi:[确定]正在启动 iscsi:[确定]正在启动 iscsi:[确定][root@Aries ~]#

发现后进行登录target

[root@Aries ~]# for i in 1 2 3 ; do ssh node${i}.lansgg.com 'iscsiadm -m node -T iqn.2015-09-08.com.lansgg:storage:disk.sdb -p 192.168.100.128 -l' ;done

这里的“-T”后面跟target名称,“ip-address”是target主机的ip地址,“port”是target主机的端口号,默认是3260 -l 代表 --login

查看node节点新的磁盘信息

[root@Aries ~]# for i in 1 2 3 ; do ssh node${i}.lansgg.com 'fdisk -l /dev/sdb' ;doneDisk /dev/sdb: 10.7 GB, 10737418240 bytes64 heads, 32 sectors/track, 10240 cylindersUnits = cylinders of 2048 * 512 = 1048576 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk identifier: 0x00000000Disk /dev/sdb: 10.7 GB, 10737418240 bytes64 heads, 32 sectors/track, 10240 cylindersUnits = cylinders of 2048 * 512 = 1048576 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk identifier: 0x00000000Disk /dev/sdb: 10.7 GB, 10737418240 bytes64 heads, 32 sectors/track, 10240 cylindersUnits = cylinders of 2048 * 512 = 1048576 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk identifier: 0x00000000

在其中一个节点上格式化一个分区

 安装 gfs2 进行 gfs 分区

[root@Aries ~]# for i in 1 2 3 ; do ssh node${i}.lansgg.com 'yum -y install gfs2-utils' ;done

使用gfs2命令工具在之前创建好的/dev/sdb1上创建集群文件系统gfs2,可以使用如下命令

[root@node1 ~]# mkfs.gfs2 -j 3 -p lock_dlm -t testCluster:sdb1 /dev/sdb1

mkfs.gfs2为gfs2文件系统创建工具,其一般常用的选项有:

-b BlockSize:指定文件系统块大小,最小为512,默认为4096;

-J MegaBytes:指定gfs2日志区域大小,默认为128MB,最小值为8MB;

-j Number:指定创建gfs2文件系统时所创建的日志区域个数,一般需要为每个挂载的客户端指定一个日志区域;有几个node节点就要指定几个

-p LockProtoName:所使用的锁协议名称,通常为lock_dlm或lock_nolock之一;

-t LockTableName:锁表名称,一般来说一个集群文件系统需一个锁表名以便让集群节点在施加文件锁时得悉其所关联到的集群文件系统,锁表名称为 clustername:fsname,其中的clustername必须跟集群配置文件中的集群名称保持一致,因此,也仅有此集群内的节点可访问此集群 文件系统;此外,同一个集群内,每个文件系统的名称必须惟一。

 新建目录进行文件系统挂载

[root@Aries ~]# for i in 1 2 3 ; do ssh node${i}.lansgg.com 'mkdir /test ' ;done
[root@node1 ~]# mount /dev/sdb1 /test/[root@node1 ~]# echo "test" > /test/test.tt

如果分区无法识别,可以重启系统尝试

挂载gfs分区,查看是否存在node1上创建的text.tt

[root@Aries ~]# for i in  2 3 ; do ssh node${i}.lansgg.com 'mount /dev/sdb1 /test/ ; cat /test/test.tt ' ;donetesttest

四、配置使用CLVM(集群逻辑卷)

在RHCS集群节点上安装lvm2-cluster

[root@Aries ~]# for i in  1 2 3 ; do ssh node${i}.lansgg.com 'yum -y install lvm2-cluster ' ;done

在RHCS的各节点上,为lvm启用集群功能

[root@Aries ~]# for i in  1 2 3 ; do ssh node${i}.lansgg.com 'lvmconf --enable-cluster' ;done

为RHCS各节点启动clvmd服务

[root@Aries ~]# for i in  1 2 3 ; do ssh node${i}.lansgg.com 'service clvmd start' ;done

创建物理卷、卷组和逻辑卷

[root@node1 ~]# pvcreate /dev/sdb2  Physical volume "/dev/sdb2" successfully created[root@node1 ~]# vgcreate vgCluster /dev/sdb2   Clustered volume group "vgCluster" successfully created[root@node1 ~]#  lvcreate -L 2G -n lvCluster vgCluster  Logical volume "lvCluster" created.[root@node1 ~]#

在其他节点也能看到对应的逻辑卷

[root@Aries ~]# for i in  1 2 3 ; do ssh node${i}.lansgg.com 'lvs' ;done  LV        VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert  lv_root   VolGroup  -wi-ao----   8.54g                                                      lv_swap   VolGroup  -wi-ao---- 992.00m                                                      lvCluster vgCluster -wi-a-----   2.00g                                                      LV        VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert  lv_root   VolGroup  -wi-ao----   8.54g                                                      lv_swap   VolGroup  -wi-ao---- 992.00m                                                      lvCluster vgCluster -wi-a-----   2.00g                                                      LV        VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert  lv_root   VolGroup  -wi-ao----   8.54g                                                      lv_swap   VolGroup  -wi-ao---- 992.00m                                                      lvCluster vgCluster -wi-a-----   2.00g                                                    [root@Aries ~]#

格式化逻辑卷 为 gfs

[root@node1 ~]# mkfs.gfs2 -p lock_dlm -j 2 -t testCluster:lvCluster /dev/vgCluster/lvCluster

挂载逻辑卷 到 /testClvm

[root@Aries ~]# for i in  1 2 3 ; do ssh node${i}.lansgg.com 'mkdir /testClvm' ;done
[root@node1 ~]# mount /dev/vgCluster/lvCluster /testClvm/[root@node2 ~]# mount /dev/vgCluster/lvCluster /testClvm/[root@node3 ~]# mount /dev/vgCluster/lvCluster /testClvm/Too many nodes mounting filesystem, no free journals

# 发现node3挂载不了,因为刚才创建了2个journal,需要再添加一个

[root@node1 ~]# gfs2_jadd -j 1 /dev/vgCluster/lvClusterFilesystem:            /testClvmOld Journals           2New Journals           3

再次node3挂载

[root@node3 ~]# mount /dev/vgCluster/lvCluster /testClvm/[root@node3 ~]#

扩展逻辑卷

       扩展前

[root@node1 ~]# lvextend -L +2G /dev/vgCluster/lvCluster   Size of logical volume vgCluster/lvCluster changed from 2.00 GiB (512 extents) to 4.00 GiB (1024 extents).  Logical volume lvCluster successfully resized[root@node1 ~]# gfs2_grow /dev/vgCluster/lvCluster FS: Mount Point: /testClvmFS: Device:      /dev/dm-2FS: Size:        524288 (0x80000)FS: RG size:     65533 (0xfffd)DEV: Size:       1048576 (0x100000)The file system grew by 2048MB.gfs2_grow complete.

     扩展后