本文系统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 <?xml version="1.0"?> <cluster name="testCluster" config_version="1"> <clusternodes> </clusternodes> <fencedevices> </fencedevices> <rm> <failoverdomains/> <resources/> </rm> </cluster>
为集群添加节点
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';done Starting 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 status Version: 6.2.0 Config Version: 4 Cluster Name: testCluster Cluster Id: 44303 Cluster Member: Yes Cluster Generation: 16 Membership state: Cluster-Member Nodes: 3 Expected votes: 3 Total votes: 3 Node votes: 1 Quorum: 2 Active subsystems: 8 Flags: Ports Bound: 0 177 Node name: node1.lansgg.com Node ID: 1 Multicast addresses: 239.192.173.188 Node addresses: 192.168.100.129 [root@node1 ~]#
cman_tool的nodes子命令则可以列出集群中每个节点的相关信息
[root@node1 ~]# cman_tool nodes Node 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 services fence domain member count 3 victim count 0 victim now 0 master nodeid 2 wait state none members 1 2 3 dlm lockspaces name rgmanager id 0x5231f3eb flags 0x00000000 change member 3 joined 1 remove 0 failed 0 seq 3,3 members 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 �Cv 1 �Cn 1 �Cf NameofFence -C
5、 检查已经添加的节点:
[root@node1 ~]# ccs_tool lsnode Cluster name: testCluster, config_version: 4 Nodename Votes Nodeid Fencetype node1.lansgg.com 1 1 node2.lansgg.com 1 2 node3.lansgg.com 1 3
6、 检查集群健康状态:
[root@node1 ~]# clustat -i 3 Cluster Status for testCluster @ Tue Sep 8 14:45:06 2015 Member 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配置,新增如下:
<target iqn.2015-09-08.com.lansgg:storage:disk.sdb> backing-store /dev/sdb initiator-address 192.168.100.0/24 </target>
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 show Target 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' ;done Disk /dev/sdb: 10.7 GB, 10737418240 bytes 64 heads, 32 sectors/track, 10240 cylinders Units = cylinders of 2048 * 512 = 1048576 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/sdb: 10.7 GB, 10737418240 bytes 64 heads, 32 sectors/track, 10240 cylinders Units = cylinders of 2048 * 512 = 1048576 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/sdb: 10.7 GB, 10737418240 bytes 64 heads, 32 sectors/track, 10240 cylinders Units = cylinders of 2048 * 512 = 1048576 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk 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 ' ;done test test
四、配置使用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/lvCluster Filesystem: /testClvm Old Journals 2 New 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: /testClvm FS: Device: /dev/dm-2 FS: Size: 524288 (0x80000) FS: RG size: 65533 (0xfffd) DEV: Size: 1048576 (0x100000) The file system grew by 2048MB. gfs2_grow complete.
扩展后