sgdfh 发表于 2015-9-10 09:02:36

gfs2共享集群存储

本文系统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文件系统等
一、配置登录方式

1
# ssh-keygen -t rsa







1
2
3
# ssh-copy-id -i node1.lansgg.com
# ssh-copy-id -i node2.lansgg.com
# ssh-copy-id -i node3.lansgg.com







1
2
# for i in 1 2 3; do ssh node${i}.lansgg.com 'service iptables stop';done
# 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包分别安装在了集群中的每个节点上

1
# 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的配置文件

1
# for i in 1 2 3; do ssh node${i}.lansgg.com 'ccs_tool create testCluster';done




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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# hostname
node1.lansgg.com
# 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子命令可以完成节点添加。将前面规划的三个集群节点添加至集群中,可以使用如下命令实现。

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




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

1
# for i in 1 2 3; do ssh node${i}.lansgg.com ' ccs_tool lsnode';done






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

1
# service cman start




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

1
   Waiting for quorum... Timed-out waiting for cluster





1
2
3
4
# 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: [确定]




查看集群状态信息:

1
# for i in 1 2 3; do ssh node${i}.lansgg.com 'clustat';done






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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 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
#




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

1
2
3
4
5
# cman_tool nodes
NodeSts   Inc   Joined               Name
   1   M      8   2015-09-08 14:36:27node1.lansgg.com
   2   M   12   2015-09-08 14:36:27node2.lansgg.com
   3   M   16   2015-09-08 14:36:30node3.lansgg.com




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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# cman_tool services
fence domain
member count3
victim count0
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

#




ccs_tool相关命令
1、 首先通过ccs_tool工具创建集群:


1
ccs_tool create NameofCluster




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


1
ccs_tool addfence NameofFence AgentTypeofFence -C




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


1
2
ccs_tool lsfence
Name             Agent fence-shared   fence_manual




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


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




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


1
2
3
4
5
6
7
8
# 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、 检查集群健康状态:


1
2
3
4
5
6
7
8
9
# clustat -i 3
Cluster Status for testCluster @ Tue Sep8 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、 更新集群配置:


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




9、 删除集群节点:


1
ccs_tool delnode NameofNode




10、删除集群fence设备:


1
ccs_tool delfence NameofFence




三、iscsi 安装配置

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




编辑target配置,新增如下:

1
2
3
4
<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>:
Iqn:表示iscsi squalfled name 简称iqn
Yyyy-mmm:表示年份-月份。
Reversed domain name:表示倒过来的域名。
Identifier:标识识别代码。这里是storage.disk.sdb
backing-store:指定后端要共享的磁盘编号initiator-address:授权客户端访问的网络地址incominguser:设置登录用户的账号密码 (无)启动服务,查看信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# /etc/init.d/tgtd start
正在启动 SCSI target daemon:[确定]
# 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

1
2
3
4
5
6
7
# 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




服务启动

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




发现后进行登录target

1
# 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节点新的磁盘信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 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 分区

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




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

1
# 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必须跟集群配置文件中的集群名称保持一致,因此,也仅有此集群内的节点可访问此集群文件系统;此外,同一个集群内,每个文件系统的名称必须惟一。


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

1
# for i in 1 2 3 ; do ssh node${i}.lansgg.com 'mkdir /test ' ;done





1
2
# mount /dev/sdb1 /test/
# echo "test" > /test/test.tt




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

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

1
2
3
# for i in2 3 ; do ssh node${i}.lansgg.com 'mount /dev/sdb1 /test/ ; cat /test/test.tt ' ;done
test
test




四、配置使用CLVM(集群逻辑卷)
在RHCS集群节点上安装lvm2-cluster

1
# for i in1 2 3 ; do ssh node${i}.lansgg.com 'yum -y install lvm2-cluster ' ;done




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


1
# for i in1 2 3 ; do ssh node${i}.lansgg.com 'lvmconf --enable-cluster' ;done




为RHCS各节点启动clvmd服务

1
# for i in1 2 3 ; do ssh node${i}.lansgg.com 'service clvmd start' ;done






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

1
2
3
4
5
6
7
# pvcreate /dev/sdb2
Physical volume "/dev/sdb2" successfully created
# vgcreate vgCluster /dev/sdb2
Clustered volume group "vgCluster" successfully created
#lvcreate -L 2G -n lvCluster vgCluster
Logical volume "lvCluster" created.
#




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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# for i in1 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                                                   
#




格式化逻辑卷 为 gfs

1
# mkfs.gfs2 -p lock_dlm -j 2 -t testCluster:lvCluster /dev/vgCluster/lvCluster






挂载逻辑卷 到 /testClvm

1
# for i in1 2 3 ; do ssh node${i}.lansgg.com 'mkdir /testClvm' ;done





1
2
3
4
# mount /dev/vgCluster/lvCluster /testClvm/
# mount /dev/vgCluster/lvCluster /testClvm/
# mount /dev/vgCluster/lvCluster /testClvm/
Too many nodes mounting filesystem, no free journals





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

1
2
3
4
# gfs2_jadd -j 1 /dev/vgCluster/lvCluster
Filesystem:            /testClvm
Old Journals         2
New Journals         3




再次node3挂载

1
2
# mount /dev/vgCluster/lvCluster /testClvm/
#




扩展逻辑卷
       扩展前




1
2
3
4
5
6
7
8
9
10
11
# 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
# 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.




   扩展后


页: [1]
查看完整版本: gfs2共享集群存储