gfs文件系统
一、GFS技术特征
● 主要应用于大文件和文件系统
● 支持最大300个节点
● 支持CLVM,实现卷管理
● 支持多种锁管理机制
● 每个节点都具有数据和元数据日志
● 支持x86/EM64T/AMD64/IA64
● POSIX兼容
● 在线文件系统管理 可以动态扩充 可以动态调整inodes
● 完全的读/写缓存
● 直接I/O能力
● CDPN支持(Context Dependent Path Names)
● 支持磁盘配额
● ACL支持
● 连贯的共享mmap()支持
● 避免中心数据结构存储
● 支持SAN/GNBD/ISCSI
锁管理器
GFS支持三种锁管理机制DLM、GULM、nolock。DLM是默认最优的锁管理器。
● DLM锁管理器
DLM(Distributed Lock Manager)是最优的锁管理器,它避免了GULM锁管理方式中必须提供GULM 锁管理服务器的缺点,不再需要设定锁管理服务器,而是采用对等的锁管理方式,大大提供处理性能,DLM避免了当单个节点失败需要整个恢复的性能瓶颈,DLM的请求是本地的,不需要网络请求,立即生效,通锁分层机制,DLM实现多个锁空间,并行锁模式。
● GULM锁管理器
GULM是GFS6.1以前的锁管理器,它必须要设置一个锁管理服务器,是一种client/Server的锁管理方式,显示易见,所有的锁请求必须要与锁管理服务器通讯。而且当节点增大的一定数量的时候,可能会出现磁盘的交换,降低了整个GFS系统的性能。
● nolock锁管理器 nolock实际并不是一个集群管理锁机制,它只能用于单个节点的GFS系统。一般用来测试和实验用。
二、配置lvm,开启gf支持
[root@node1 ~]# lvmconf –enable-cluster
[root@node1 ~]# cat /etc/lvm/lvm.conf | grep locking_type
locking_type = 3
# NB. This option only affects locking_type = 1 viz. local file-based
# The external locking library to load if locking_type is set to 2.
#开启分布式lvm服务以支持gfs选项,locking_type = 3,可手动修改/etc/lvm/lvm.conf,所有节点都需修改。
[root@node1 ~]# pvcreate /dev/sdd
Physical volume “/dev/sdd” successfully created
[root@node1 ~]# vgcreate vg01 /dev/sdd
Clustered volume group “vg01” successfully created
[root@node1 ~]# lvcreate -L 1024 -n lv01 vg01
Logical volume “lv01” created
[root@node1 ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv00 vg00 -wi-ao 49.97G
lv01 vg01 -wi-a- 1.00G
三、gfs组件安装
[root@node1 ~]# yum list | grep gfs
This system is not registered with RHN.
RHN support will be disabled.
gfs-utils.i386 0.1.20-7.el5 installed
gfs2-utils.i386 0.1.62-20.el5 installed
kmod-gfs.i686 0.1.34-12.el5 installed
kmod-gfs-PAE.i686 0.1.34-12.el5 ClusterStorage_32
kmod-gfs-xen.i686 0.1.34-12.el5 ClusterStorage_32
[root@node1 ~]# uname -a
Linux node1 2.6.18-194.el5PAE #1 SMP Tue Mar 16 22:00:21 EDT 2010 i686 i686 i386 GNU/Linux
[root@node1 ~]# yum install kmod-gfs-PAE.i686
#kmod-gfs必须与系统kernel版本相对应
[root@node1 ~]# lsmod | grep gfs
gfs2 349833 1 lock_dlm
configfs 28753 2 dlm
#查看内核是否加载gfs模块
[root@node1 ~]# service gfs start
[root@node1 ~]# service clvmd start #开启分布式lvm服务以支持gfs
Activating VGs: 1 logical volume(s) in volume group “vg01” now active
1 logical volume(s) in volume group “vg00” now active
[确定]
[root@node1 ~]# chkconfig clvmd on
[root@node1 ~]# chkconfig gfs on
四、创建gfs文件系统
1、创建gfs文件系统所需信息(Required information):
Lock manager type
lock_nolock :用于单机支持gfs
lock_dlm :多节点集群
Lock file name
cluster_name:fs_name :指定集群名
Number of journals
One per cluster node accessing the GFS is required
Extras are useful to have prepared in advance
Size of journals
File system block size
2、格式:gfs_mkfs -p LockProtoName -t LockTableName -j Number BlockDevice
[root@node1 ~]# gfs_mkfs -b 4096 -j 4 -p lock_dlm -t cluster8:gfslv01 /dev/vg01/lv01
This will destroy any data on /dev/vg01/lv01.
Are you sure you want to proceed? [y/n] y
Device: /dev/vg01/lv01
Blocksize: 4096
Filesystem Size: 131028
Journals: 4
Resource Groups: 8
Locking Protocol: lock_dlm
Lock Table: cluster8:gfslv01
Syncing…
All Done
#-j:指定日志区数量,大于等于节点数,一般为:nodes+1
#-p:指定lock协议,单机可用lock_nolock,lock_nolock多用cluster故障单机加载gfs文件系统
#-t:指定支持的集群名和文件系统名
1、可挂载gfs文件系统节点的必要条件
节点必须是gfs所在cluster的一个节点,须防止非gfs所在cluster节点挂载gfs文件系统
检查挂载节点的cluster是否就是gfs的cluter,可以查看gfs的superblock内容
[root@node1 ~]# gfs_tool df /var/www/html
/var/www/html:
SB lock proto = “lock_dlm”
SB lock table = “cluster8:gfslv01” #gfs所属cluster
SB ondisk format = 1309
SB multihost format = 1401
Block size = 4096
Journals = 4
Resource Groups = 14
Mounted lock proto = “lock_dlm”
Mounted lock table = “cluster8:gfslv01”
Mounted host data = “jid=1:id=196611:first=0”
Journal number = 1
Lock module flags = 0
Local flocks = FALSE
Local caching = FALSE
Oopses OK = FALSE
Type Total Blocks Used Blocks Free Blocks use%
————————————————————————
inodes 5 5 0 100%
metadata 192 0 192 0%
data 1441471 0 1441471 0%
2、mount选项
格式:mount -o StdMountOpts,GFSOptions -t gfs Device Mountpoint
#支持标准选项和gfs特定选项
lockproto=[lock_dlm,lock_nolock]:锁机制,lock_dlm用于cluster,lock_nolock用于单机
locktable=clustername:fsname :cluster和文件系统名
upgrade : 提升,多用新gfs版本挂载
acl :开启访问控制列表
[root@node1 ~]# mount -o lockproto=lock_dlm /dev/vg01/lv01 /var/www/html
[root@node1 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/vg00-lv00 49G 2.9G 44G 7% /
/dev/sda1 251M 23M 216M 10% /boot
tmpfs 2.0G 0 2.0G 0% /dev/shm
/dev/mapper/vg01-lv01 5.5G 24K 5.5G 1% /var/www/html
[root@node1 ~]# umount /var/www/html #卸载文件系统
六、Journals日志管理
1、查看superblock信息
[root@node1 ~]# gfs_tool df /var/www/html
/var/www/html:
SB lock proto = “lock_dlm” #锁机制
SB lock table = “cluster8:gfslv01” #cluster
SB ondisk format = 1309
SB multihost format = 1401
Block size = 4096 #块大小,gfs_mkfs -b指定块大小
Journals = 4 #日志数量
Resource Groups = 14
Mounted lock proto = “lock_dlm”
Mounted lock table = “cluster8:gfslv01”
Mounted host data = “jid=2:id=196611:first=0”
Journal number = 2
Lock module flags = 0
Local flocks = FALSE
Local caching = FALSE
Oopses OK = FALSE
Type Total Blocks Used Blocks Free Blocks use%
————————————————————————
inodes 5 5 0 100%
metadata 192 0 192 0%
data 1441471 0 1441471 0%
2、检查日志数量
[root@node1 ~]# gfs_tool jindex /var/www/html | grep Journal
Journal 0:
Journal 1:
Journal 2:
Journal 3:
3、增加日志数量
要求:lv有足够的空间支持日志数量的增加
必须在拉升gfs文件系统前前增加日志数量
[root@node1 ~]# gfs_jadd -Tv -j 2 /var/www/html #增加日志数前测试,确保磁盘空间足够
Requested size (65536 blocks) greater than available space (0 blocks)
[root@node1 ~]# gfs_jadd -j 2 /var/www/html #增加2个日志
Requested size (65536 blocks) greater than available space (0 blocks)
七、GFS系统的扩展
1、扩展逻辑卷
[root@node1 ~]# pvcreate /dev/sde
Physical volume “/dev/sde” successfully created
[root@node1 ~]# vgextend vg01 /dev/sde
Volume group “vg01” successfully extended
[root@node1 ~]# lvextend -L +5120M /dev/vg01/lv01 #扩展逻辑卷
Extending logical volume lv01 to 6.00 GB
Logical volume lv01 successfully resized
2、扩展gfs(gfs_grow -v Device|Mount_point)
[root@node1 ~]# gfs_grow -v /dev/vg01/lv01 #扩展gfs
FS: Mount Point: /var/www/html
FS: Device: /dev/mapper/vg01-lv01
FS: Options: rw,hostdata=jid=1:id=196611:first=0
FS: Size: 262142
RGRP: Current Resource Group List:
RI: Addr 245760, RgLen 2, Start 245762, DataLen 16380, BmapLen 4095
RI: Addr 229376, RgLen 2, Start 229378, DataLen 16380, BmapLen 4095
RI: Addr 212992, RgLen 2, Start 212994, DataLen 16380, BmapLen 4095
RI: Addr 196608, RgLen 2, Start 196610, DataLen 16380, BmapLen 4095
RI: Addr 49157, RgLen 2, Start 49159, DataLen 16376, BmapLen 4094
RI: Addr 32778, RgLen 2, Start 32780, DataLen 16376, BmapLen 4094
RI: Addr 16399, RgLen 2, Start 16401, DataLen 16376, BmapLen 4094
RI: Addr 17, RgLen 2, Start 19, DataLen 16380, BmapLen 4095
RGRP: 8 Resource groups in total
JRNL: Current Journal List:
JI: Addr 163840 NumSeg 2048 SegSize 16
JI: Addr 131072 NumSeg 2048 SegSize 16
JI: Addr 98304 NumSeg 2048 SegSize 16
JI: Addr 65536 NumSeg 2048 SegSize 16
JRNL: 4 Journals in total
DEV: Size: 1572864
RGRP: New Resource Group List:
RI: Addr 262142, RgLen 6, Start 262148, DataLen 91120, BmapLen 22780
RI: Addr 353269, RgLen 15, Start 353284, DataLen 243904, BmapLen 60976
RI: Addr 597188, RgLen 15, Start 597203, DataLen 243904, BmapLen 60976
RI: Addr 841107, RgLen 15, Start 841122, DataLen 243904, BmapLen 60976
RI: Addr 1085026, RgLen 15, Start 1085041, DataLen 243904, BmapLen 60976
RI: Addr 1328945, RgLen 15, Start 1328960, DataLen 243904, BmapLen 60976
RGRP: 6 Resource groups in total
Preparing to write new FS information…
Done.
[root@node1 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/vg00-lv00
49G 2.9G 44G 7% /
/dev/sda1 251M 23M 216M 10% /boot
tmpfs 2.0G 0 2.0G 0% /dev/shm
/dev/mapper/vg01-lv01
5.5G 20K 5.5G 1% /var/www/html
八、gfs文件系统inode节点的动态分配
1、GFS有inode节点空间自动分配的能力(就是说不用为inode预先分配磁盘空间,GFS自己会去动态分配);
2、GFS的inode有4K(默认)一个块那么大(普通的fs在2K左右),为了增进效率,如果文件内容足够小,会被直接存放在inode内;
3、手动回收无用的inode所占空间:gfs_tool reclaim <mountpoint>
[root@node1 ~]# gfs_tool reclaim /var/www/html
Don’t do this if this file system is being exported by NFS (on any machine).
Are you sure you want to proceed? [y/n] y
Reclaimed:
version 0
inodes 0
metadata 192九、gfs参数调优
1、查看gfs参数
[root@node1 ~]# gfs_tool gettune /var/www/html
ilimit1 = 100
ilimit1_tries = 3
ilimit1_min = 1
ilimit2 = 500
ilimit2_tries = 10
ilimit2_min = 3
demote_secs = 300
incore_log_blocks = 1024
jindex_refresh_secs = 60
depend_secs = 60
scand_secs = 5
recoverd_secs = 60
logd_secs = 1
quotad_secs = 5
inoded_secs = 15
glock_purge = 0
quota_simul_sync = 64
quota_warn_period = 10
atime_quantum = 3600
quota_quantum = 60
quota_scale = 1.0000 (1, 1)
quota_enforce = 1
quota_account = 1
new_files_jdata = 0
new_files_directio = 0
max_atomic_write = 4194304
max_readahead = 262144
lockdump_size = 131072
stall_secs = 600
complain_secs = 10
reclaim_limit = 5000
entries_per_readdir = 32
prefetch_secs = 10
statfs_slots = 64
max_mhc = 10000
greedy_default = 100
greedy_quantum = 25
greedy_max = 250
rgrp_try_threshold = 100
statfs_fast = 0
2、参数调整
[root@node1 ~]# gfs_tool settune /var/www/html atime_quantum 86400
#调整文件atime(访问时间)更新频率,默认gfs每小时更新一次,ext3文件系统是每访问一次atime时间更新一次
#重启生效要求:参数调整需写入到自启动脚本/etc/rc.d/rc.local中
[root@node1 ~]# gfs_tool settune /var/www/html statfs_fast 1
#开启文件系统状态快速查询功能,要消耗系统资源。
#开启自启动,须写入到/etc/init.d/gfs脚本中,写入到/etc/rc.d/rc.local中不生效。
十、GFS Quotas(磁盘配额)
1、开启quotas支持
[root@node1 ~]# gfs_tool settune /var/www/html quota_enforce = 1
[root@node1 ~]# gfs_tool settune /var/www/html quota_account = 1
#开启配额,系统挂载前开启,自启动须写入到/etc/fstab中
2、配置GFS磁盘配额信息更新频率
[root@node1 ~]# gfs_tool settune /var/www/html quota_quantum 60
#Quotas并不会每次写入磁盘都更新,默认每60s检查一次Quota信息
[root@node1 ~]# gfs_tool settune /var/www/html quota_scale 1
#计数器,默认为1
3、配置quota限制
限制级别:
limit:硬限制,数量量不可超过limit限制。
warn:软限制,数量量可超过warm限制,给出警告信息。
[root@node1 ~]# gfs_quota limit -l 80m -u netsword -f /var/www/html
#硬限制80M
[root@node1 ~]# gfs_quota warn -l 50m -u netsword -f /var/www/html
#软限制50M
[root@node1 ~]# gfs_quota get -u netsword -f /var/www/html
user netsword: limit: 80.0 warn: 50.0 value: 0.0
#查看限制信息
[root@node1 ~]# chmod -R 777 /var/www/html
[root@node1 ~]# su – netsword
[netsword@node1 ~]$ cd /var/www/html
[netsword@node1 html]$ dd if=/dev/zero of=test bs=1M count=40
40+0 records in
40+0 records out
41943040 bytes (42 MB) copied, 0.0895091 seconds, 469 MB/s
#未超过任何限制
[netsword@node1 html]$ dd if=/dev/zero of=test1 bs=1M count=20
GFS: fsid=cluster8:gfslv01.2: quota warning for user 500
20+0 records in
20+0 records out
20971520 bytes (21 MB) copied, 0.0525222 seconds, 399 MB/s
#超过warn限制,给出警告信息
[netsword@node1 html]$ dd if=/dev/zero of=test2 bs=1M count=30
GFS: fsid=cluster8:gfslv01.2: quota warning for user 500
GFS: fsid=cluster8:gfslv01.2: quota exceeded for user 500
dd: 写入 “test2”: 超出磁盘限额
21+0 records in
20+0 records out
20971520 bytes (21 MB) copied, 0.128903 seconds, 163 MB/s
#超过limit限制,给出警告信息,并限制所有数据量不超过limit
十一、GFS直接IO配置( GFS Direct I/O)
1、GFS Direct I/O:它是一个文件系统的属性,直接哪个应用存贮设备进行读和写,所谓直接就是绕过操作系统去读写cache的内容,提高磁盘性能,更费资源
2、Direct I/O应用于一个文 件或目录上的三种方式
应用程序直接支持:O_DIRECT
GFS文件属性
GFS目录属性
3、对文件的direct io设置(意义不大)
[root@node1 html]# touch file1
[root@node1 html]# gfs_tool setflag directio /var/www/html/file1
#对文件开启directio
[root@node1 html]# gfs_tool clearflag directio /var/www/html/file1
#清除directio
4、对目录的direct io设置
[root@node1 html]# gfs_tool setflag inherit_directio /var/www/html
#开启目录directo io,须用inherit_directio
[root@node1 html]# gfs_tool stat /var/www/html | grep directio
inherit_directio
#查看状态
[root@node1 html]# gfs_tool clearflag inherit_directio /var/www/html
十二、Data Journaling数据日志
1、数据日志
gfs通常是先把元数据写到日志里,文件内容是由内核周期性的刷新文件系统的buffers后再写到磁盘的,内核是通过调用fsync()来完成把文件写到disk的,Data journaling能减少fsync()调用的时间,所以比直接把文件写到一个主文件系统里快,Data journaling能自动为一个gfs文件系统的目录和文件设置jdata attribute属性,即使是零长度的文件,当然也可以清处
2、对文件设置数据日志
[root@node1 html]# gfs_tool setflag jdata file
[root@node1 html]# gfs_tool clearflag jdata file
3、对目录设置数据日志
[root@node1 html]# gfs_tool setflag inherit_jdata /var/www/html
[root@node1 html]# gfs_tool stat /var/www/html | grep jdata
jdata
inherit_jdata
[root@node1 html]# gfs_tool clearflag inherit_jdata /var/www/html十三、在一个文件系统上执行挂起行为(Suspending Activity on a File System)
1、在一个文件 系统上执行gfs_tool freeze命令来 挂起写的行为,挂起写的行为允许硬件设备使用快照捕获文件系统的一个持续状态
2、挂起
[root@node1 ~]# gfs_tool freeze /var/www/html
#挂起后,不能再对该文件系统进行写操作,只能读
3、结束挂起
[root@node1 ~]# gfs_tool unfreeze /var/www/html
十四、GFS信息查询
1、显示统计的信息
[root@node1 ~]# gfs_tool counters /var/www/html
2、显示空间
[root@node1 ~]# gfs_tool df /var/www/html
3、显示扩展状态
[root@node1 ~]# gfs_tool stat /var/www/html
十五、GFS修复
1、当一个接点 的gfs文件系统失败了,可以从文件系统的日志文件中恢复,使用gfs_fsck命令,但该命令必须在被unmounted的文件系统上都执行
2、gfs_fsck
gfs_fsck -y BlockDevice
[root@node1 ~]# gfs_fsck /dev/vg01/lv01
十六、CDPN(Context-Dependent Path Names)上下关联路径名
1、当一个应用使用这个符号连接时它可以解析到真实的文件和目录上去,应用程序只能使用这个符号连接去找到真实文件或目录
2、语法:ln -s Variable LinkName
它和我们平时使用的符 号连接[ln -s Target LinkName]的差别在于连接目标是可变的,且其取值也是下的几个:
@hostname 主机名,可用这个命令得到:echo `uname -n`
@mach 机器类型,可用这个命令得到:echo `uname -m`
@os操着系统类型,可用这个命令得到:echo `uname -s`
@sys机器类型和操着系统类型的组合,可用这个命令得到:echo `uname -m`_`uname -s`
@uid 用户id 可用这个命令得到echo `id -u`
@gid 组id,可用这个命令得到:echo `id -g`
3、实例
root@node1 html]# mkdir node{1,2,3}
[root@node1 html]# ln -s @hostname log
[root@node1 html]# ls -ls
总计 16
4 lrwxrwxrwx 1 root root 9 01-17 01:29 log -> @hostname
4 drwxr-xr-x 2 root root 3864 01-17 01:28 node1
4 drwxr-xr-x 2 root root 3864 01-17 01:28 node2
4 drwxr-xr-x 2 root root 3864 01-17 01:28 node3
[root@node1 html]# touch log/msg1
[root@node2 html]# touch log/msg2
[root@node3 html]# touch log/msg3
[root@node1 html]# ls log
msg1
[root@node2 html]# ls log
msg2
[root@node3 html]# ls log
msg3十七、GFS超级块的修改(GFS Super block changes)
1、lock manager
gfs_tool sb <dev> proto [lock_dlm,lock_nolock]
[root@node1 /]# umount /var/www/html
#修改superblock时,所有node必须umount
[root@node1 /]# gfs_tool sb /dev/vg01/lv01 proto lock_nolock
You shouldn’t change any of these values if the filesystem is mounted.
Are you sure? [y/n] y
current lock protocol name = “lock_dlm”
new lock protocol name = “lock_nolock”
Done
2、Lock table name
gfs_tool sb <dev> table cluster1:gfslv
[root@node1 /]# gfs_tool sb /dev/vg01/lv01 table cluster:gfslv
You shouldn’t change any of these values if the filesystem is mounted.
Are you sure? [y/n] y
current lock table name = “cluster8:gfslv01”
new lock table name = “cluster:gfslv”
Done
#修改后node1将无法挂载/dev/vg01/lv01,因node1的cluster为cluster8
#多用于磁盘移植到新的cluster中
3、List superblock information
gfs_tool sb <dev> all
[root@node1 /]# gfs_tool sb /dev/vg01/lv01 all
mh_magic = 0x01161970
mh_type = 1
mh_generation = 0
mh_format = 100
mh_incarn = 0
sb_fs_format = 1309
sb_multihost_format = 1401
sb_flags = 0
sb_bsize = 4096
sb_bsize_shift = 12
sb_seg_size = 16
no_formal_ino = 19
no_addr = 19
no_formal_ino = 20
no_addr = 20
no_formal_ino = 23
no_addr = 23
sb_lockproto = lock_nolock
sb_locktable = cluster:gfslv
no_formal_ino = 21
no_addr = 21
no_formal_ino = 22
no_addr = 22
sb_reserved =
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00