CentOS6.6 Glusterfs详解

来源:互联网 发布:linux查询当前时间 编辑:程序博客网 时间:2024/06/14 19:24

CentOS6.6 安装Glusterfs,从原理到实践。

一、GlusterFS 外部架构

wKiom1eDiHjA-6YjAAW6vXeeVEE704.png

     GlusterFS总体架构与组成部分如上图所示,它主要由存储服务器(BrickServer)、客户端以及NFS/Samba 存储网关组成。不难发现,GlusterFS 架构中没有元数据服务器组件,这是其最大的设计这点,对于提升整个系统的性能、可靠性和稳定性都有着决定性的意义。              GlusterFS 支持TCP/IP 和InfiniBandRDMA 高速网络互联,客户端可通过原生Glusterfs 协议访问数据,其他没有运行GlusterFS客户端的终端可通过NFS/CIFS 标准协议通过存储网关访问数据。

二、GlusterFS内部架构

wKioL1eDiNayWoKEAAcdvSoqpMo543.png

GlusterFS是模块化堆栈式的架构设计,如上图所示。模块称为Translator,是GlusterFS提供的一种强大机制,借助这种良好定义的接口可以高效简便地扩展文件系统的功能。

1.服务端与客户端模块接口是兼容的,同一个translator可同时在两边加载。

2.GlusterFS中所有的功能都是通过translator实现,如Cluster, Storage,Performance, Protocol, Features等。

3.重点是GlusterFSClient端。

三、GlusterFS数据访问流程

wKiom1eDiTDxNAtWAACeeKXHV3M342.png

上图是GlusterFS数据访问的一个概要图:

1.首先是在客户端,用户通过glusterfs的mount point 来读写数据。

2.用户的这个操作被递交给本地linux系统的VFS来处理。

3.VFS将数据递交给FUSE内核文件系统,在启动glusterfs客户端以前,需要向系统注册一个实际的文件系统FUSE,如上图所示,该文件系统与ext3在同一个层次上面,ext3是对实际的磁片进行处理,而fuse文件系统则是将数据通过/dev/fuse这个设备文件递交给了glusterfs client端。所以,我们可以将fuse文件系统理解为一个代理。

4.数据被fuse递交给Glusterfs client 后,client对数据进行一些指定的处理(所谓的指定,是按照client配置文件来进行的一系列处理)

5.在glusterfsclient的处理末端,通过网路将数据递交给Glusterfs Server,并且将数据写入到服务器所控制的存储设备上

四、技术特点

GlusterFS在技术实现上与传统存储系统或现有其他分布式文件系统有显著不同之处,主要体现在如下几个方面。

完全软件实现(SoftwareOnly)

GlusterFS认为存储是软件问题,不能够把用户局限于使用特定的供应商或硬件配置来解决。GlusterFS采用开放式设计,广泛支持工业标准的存储、网络和计算机设备,而非与定制化的专用硬件设备捆绑。对于商业客户,GlusterFS可以以虚拟装置的形式交付,也可以与虚拟机容器打包,或者是公有云中部署的映像。开源社区中,GlusterFS被大量部署在基于廉价闲置硬件的各种操作系统上,构成集中统一的虚拟存储资源池。简言之,GlusterFS是开放的全软件实现,完全独立于硬件和操作系统。

完整的存储操作系统栈(CompleteStorage Operating System Stack)

GlusterFS不仅提供了一个分布式文件系统,而且还提供了许多其他重要的分布式功能,比如分布式内存管理、I/O调度、软RAID和自我修复等。GlusterFS汲取了微内核架构的经验教训,借鉴了GNU/Hurd操作系统的设计思想,在用户空间实现了完整的存储操作系统栈。

用户空间实现(User Space)

与传统的文件系统不同,GlusterFS在用户空间实现,这使得其安装和升级特别简便。另外,这也极大降低了普通用户基于源码修改GlusterFS的门槛,仅仅需要通用的C程序设计技能,而不需要特别的内核编程经验。

模块化堆栈式架构(ModularStackable Architecture)

GlusterFS采用模块化、堆栈式的架构,可通过灵活的配置支持高度定制化的应用环境,比如大文件存储、海量小文件存储、云存储、多传输协议应用等。每个功能以模块形式实现,然后以积木方式进行简单的组合,即可实现复杂的功能。比如,Replicate模块可实现RAID1,Stripe模块可实现RAID0,通过两者的组合可实现RAID10和RAID01,同时获得高性能和高可性。

原始数据格式存储(DataStored in Native Formats)

GlusterFS无元数据服务设计(NoMetadata with the Elastic Hash Algorithm)以原始数据格式(如EXT3、EXT4、XFS、ZFS)储存数据,并实现多种数据自动修复机制。因此,系统极具弹性,即使离线情形下文件也可以通过其他标准工具进行访问。如果用户需要从GlusterFS中迁移数据,不需要作任何修改仍然可以完全使用这些数据。

对Scale-Out存储系统而言,最大的挑战之一就是记录数据逻辑与物理位置的映像关系,即数据元数据,可能还包括诸如属性和访问权限等信息。传统分布式存储系统使用集中式或分布式元数据服务来维护元数据,集中式元数据服务会导致单点故障和性能瓶颈问题,而分布式元数据服务存在性能负载和元数据同步一致性问题。特别是对于海量小文件的应用,元数据问题是个非常大的挑战。

GlusterFS独特地采用无元数据服务的设计,取而代之使用算法来定位文件,元数据和数据没有分离而是一起存储。集群中的所有存储系统服务器都可以智能地对文件数据分片进行定位,仅仅根据文件名和路径并运用算法即可,而不需要查询索引或者其他服务器。这使得数据访问完全并行化,从而实现真正的线性性能扩展。无元数据服务器极大提高了GlusterFS的性能、可靠性和稳定性。

五、一些设计与讨论

无元数据服务器vs 元数据服务器

无元数据服务器设计的好处是没有单点故障和性能瓶颈问题,可提高系统扩展性、性能、可靠性和稳定性。对于海量小文件应用,这种设计能够有效解决元数据的难点问题。它的负面影响是,数据一致问题更加复杂,文件目录遍历操作效率低下,缺乏全局监控管理功能。同时也导致客户端承担了更多的职能,比如文件定位、名字空间缓存、逻辑卷视图维护等等,这些都增加了客户端的负载,占用相当的CPU 和内存。

用户空间vs内核空间

用户空间实现起来相对要简单许多,对开发者技能要求较低,运行相对安全。用户空间效率低,数据需要多次与内核空间交换,另外GlusterFS 借助FUSE 来实现标准文件系统接口,性能上又有所损耗。内核空间实现可以获得很高的数据吞吐量,缺点是实现和调试非常困难,程序出错经常会导致系统崩溃,安全性低。纵向扩展上,内核空间要优于用户空间,GlusterFS 有横向扩展能力来弥补。

堆栈式vs 非堆栈式

这有点像操作系统的微内核设计与单一内核设计之争。GlusterFS 堆栈式设计思想源自GNU/Hurd 微内核操作系统,具有很强的系统扩展能力,系统设计实现复杂性降低很多,基本功能模块的堆栈式组合就可以实现强大的功能。查看GlusterFS卷配置文件我们可以发现,translator 功能树通常深达10层以上,一层一层进行调用,效率可见一斑。非堆栈式设计可看成类似Linux 的单一内核设计,系统调用通过中断实现,非常高效。后者的问题是系统核心臃肿,实现和扩展复杂,出现问题调试困难。

原始存储格式vs 私有存储格式

GlusterFS使用原始格式存储文件或数据分片,可以直接使用各种标准的工具进行访问,数据互操作性好,迁移和数据管理非常方便。然而,数据安全成了问题,因为数据是以平凡的方式保存的,接触数据的人可以直接复制和查看。这对很多应用显然是不能接受的,比如云存储系统,用户特别关心数据安全,这也是影响公有云存储发展的一个重要原因。私有存储格式可以保证数据的安全性,即使泄露也是不可知的。GlusterFS 要实现自己的私有格式,在设计实现和数据管理上相对复杂一些,也会对性能产生一定影响。

大文件vs 小文件

GlusterFS 适合大文件还是小文件存储?弹性哈希算法和Stripe 数据分布策略,移除了元数据依赖,优化了数据分布,提高数据访问并行性,能够大幅提高大文件存储的性能。对于小文件,无元数据服务设计解决了元数据的问题。但GlusterFS 并没有在I/O 方面作优化,在存储服务器底层文件系统上仍然是大量小文件,本地文件系统元数据访问是一个瓶颈,数据分布和并行性也无法充分发挥作用。因此,GlusterFS 适合存储大文件,小文件性能较差,还存在很大优化空间。

可用性vs 存储利用率

GlusterFS使用复制技术来提供数据高可用性,复制数量没有限制,自动修复功能基于复制来实现。可用性与存储利用率是一个矛盾体,可用性高存储利用率就低,反之亦然。采用复制技术,存储利用率为1/复制数,镜像是50%,三路复制则只有33%。其实,可以有方法来同时提高可用性和存储利用率,比如RAID5的利用率是(n-1)/n,RAID6是(n-2)/n,而纠删码技术可以提供更高的存储利用率。但是,鱼和熊掌不可得兼,它们都会对性能产生较大影响。

6、主要模块介绍

Gluterfs总体采用堆栈式架构,模仿的函数调用栈,各个功能模块耦合度低,且非常多模块可自由结合形成不同的功能。

以下主要介绍一下Glusterfs的主要模块:

  1 DHT模块

    该xlator主要实现了文件的哈希分布,将0到2的32次方依据子卷的个数平均划分若干个区间,文件到达DHT时,会依据文件名称计算所得的哈希值所在的区间,来决定该文件落在哪个子卷上。当中各个子卷的哈希区间记录在父文件夹的扩展属性中。此外,该模块还实现了数据迁移和扩容功能。

gluster volume create mamm-volume node1:/media node2:/media node3:/media ...

  2 AFR模块

    该xlator主要实现了文件级别的镜像冗余功能,类似raid1功能,只是不是块级别的。数据到达AFR时,会将ChangeLog加1,然后写数据,待所有子卷所有写成功后,再将ChangeLog减1。若须要修复时,依据ChangeLog推断哪个是source卷。实际的修复流程很复杂,包含meta,entry等。冗余卷没有主从之分,不论什么一个子卷都能够保证上层的读写请求,可在不影响上层应用的情况下运行修复功能。

gluster volume create mamm-volume repl 2  node1:/media node2:/media

  3 Stripe模块

    该xlator主要实现了文件的写条带,即文件到达Stripe时,会将文件按固定大小的条带写入各个子卷,类似raid0功能。在高版本号中,有两种模式:写空洞文件模式和聚合模式。该模块原理和实现都较DHT和AFR模块简单,且代码量较少。

gluster volume create mamm-volume stripe 2 node1:/media node2:/media

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

7、Glusterfs安装

相关软件包下载地址:http://pan.baidu.com/s/1kVCBmxp

1.安装相关依赖包

 yum install -y  libibverbs librdmacm xfsprogsnfs-utils rpcbind  libaio liblvm2app lvm2-devel

2.安装服务器端软件包

glusterfs-3.4.6-1.el6.x86_64.rpm
glusterfs-api-3.4.6-1.el6.x86_64.rpm
glusterfs-cli-3.4.6-1.el6.x86_64.rpm
glusterfs-fuse-3.4.6-1.el6.x86_64.rpm
glusterfs-libs-3.4.6-1.el6.x86_64.rpm
glusterfs-server-3.4.6-1.el6.x86_64.rpm

3.安装客户端软件包

glusterfs-3.4.6-1.el6.x86_64.rpm
glusterfs-fuse-3.4.6-1.el6.x86_64.rpm
glusterfs-libs-3.4.6-1.el6.x86_64.rpm

强制安装:

rpm -ivh  *  --force --nodeps 


4.磁盘配置

磁盘分区:
1)EXT4格式化工具目前最大支持16TB
2)使用parted进行磁盘分区
3)分区格式化
4)每个服务器上面都需要至少添加一块硬盘 我们这边是用的1块1.5T硬盘 现在每台都格式化
# mkfs.ext4 -L brick01 /dev/sdb

#mkdir share_disk

4)自动挂载分区
# vim /etc/fstab 

LABEL=brick01  /share_disk  ext4  defaults 0 0

#mount   -a

5)安装成功启动GlusterFS
# service glusterd start
Starting glusterd:                                         [  OK  ]
# chkconfig glusterd on


5.组建集群扩展
在GlusterFS-01服务器上面操作 选择192.168.56.35 作为当前集群节点
添加另外一台台服务器
# gluster peer probe 192.168.56.35
peer probe: success

gluster peer status

6.创建卷

#gluster

>volume create qianzhi_disk  replica 2 192.168.56.34:/share_disk/qianzhi_disk  192.168.56.35:/share_disk/qianzhi_disk

7.根据卷限制

gluster> volume start 

gluster> volume quota  qianzhi_disk enable

gluster> volume quota qianzhi_disk limit-usage /qianzhi_disk  100GB

8.访问限制

gluster volume setqianzhi_disk allth.allow 192.168.56.30

9.查看卷信息

gluster> volume info

10.客户端挂载
# mkdir /data1
# mount -t glusterfs 192.168.56.34:/qianzhi_disk(卷名称)  /data1


---------------------------------------------------------------------------------------------------------------------------------------

还有个小问题,如何一个客户端同时挂在两个服务端,当第一个服务端故障,可以自动切换?

手动配置主备挂载

mount -t glusterfs  -o  backupvolfile-server=192.168.56.35,fetch-attempts=3 192.168.56.34:/yingyong_disk  /test

自动配置主备挂载

vi /etc/fstab

192.168.56.34:/yingyong_disk  /MemberCardDir  glusterfs defaults,_netdev,backupvolfile-server=192.168.56.35,fetch-attempts=3 0 0

这篇命令解释的不错,可以参看下

https://fossies.org/linux/glusterfs/doc/mount.glusterfs.8


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

上述这种方式,当客户端挂载时,看到的全部是一块磁盘的大小,虽然有限额,可是看不到使用的真实大小;不如说你的一块整盘是1T ,你给用某客户机分配100G,客户端挂载完毕后,看到的大小还是1T,尽管使用的时候只能用到100G。

换种方式实现,使客户端看到的就是真实使用大小:

服务端配置:

fdisk /dev/sdb

然后创建LVM,针对不同的客户端,分配不同的文件大小,这里的LVM相当于磁盘限额。

pvcreate /dev/sdb5

vgcreate share_disk /dev/sdb5

lvcreate -L 100G -n  qianzhi_disk share_disk
lvcreate -L 300G -n  yingyong_disk share_disk

mkfs.ext4 /dev/share_disk/qianzhi_disk 
mkfs.ext4 /dev/share_disk/yingyong_disk 

vi /etc/fstab 

/dev/mapper/share_disk-qianzhi_disk /qianzhi_disk   ext4  defaults 0 0
/dev/mapper/share_disk-yingyong_disk /yingyong_disk   ext4  defaults 0 0

mount -a 

volume create yingyong_disk  replica 2 192.168.56.34:/yingyong_disk/yy_disk  192.168.56.35:/yingyong_disk/yy_disk

volume start  yingyong_disk


接下来再有不同客户端挂载,就在服务器上创建逻辑卷,然后格式化,然后服务器把盘挂载,最后创建VOL。

当然原磁盘需要扩展,可以使用逻辑卷扩展方式实现。


1 、启/停/删除卷

[plain] view plain copy
 print?
  1. $gluster volume start mamm-volume  
  2. $gluster volume stop mamm-volume  
  3. $gluster volume delete mamm-volume  


2、扩展收缩卷
[plain] view plain copy
 print?
  1. $gluster volume add-brick mamm-volume [strip|repli <count>] brick1...  
  2. $gluster volume remove-brick mamm-volume [repl <count>] brick1...  


扩展或收缩卷时,也要按照卷的类型,加入或减少的brick个数必须满足相应的要求。

3、 迁移卷
主要完成数据在卷之间的在线迁移
[plain] view plain copy
 print?
  1. gluster volume replace-brick mamm-volume old-brick new-brick [start|pause|abort|status|commit]  
  2. #迁移需要完成一系列的事务,假如我们准备将mamm卷中的brick3替换为brick5  
  3. #启动迁移过程  
  4. $gluster volume replace-brick mamm-volume node3:/exp3 node5:/exp5 start  
  5. #暂停迁移过程  
  6. $gluster volume replace-brick mamm-volume node3:/exp3 node5:/exp5 pause  
  7. #中止迁移过程  
  8. $gluster volume replace-brick mamm-volume node3:/exp3 node5:/exp5 abort  
  9. #查看迁移状态  
  10. $gluster volume replace-brick mamm-volume node3:/exp3 node5:/exp5 status  
  11. #迁移完成后提交完成  
  12. $gluster volume replace-brick mamm-volume node3:/exp3 node5:/exp5 commit  



4、 均衡卷
当对卷进行了扩展或收缩后,需要对卷的数据进行重新均衡。
[plain] view plain copy
 print?
  1. $gluster volume rebalane mamm-volume start|stop|status  



5、 触发副本自愈
[plain] view plain copy
 print?
  1. $gluster volume heal mamm-volume #只修复有问题的文件  
  2. $gluster volume heal mamm-volume full #修复所有文件  
  3. $gluster volume heal mamm-volume info#查看自愈详情  
  4. $gluster volume heal mamm-volume info healed|heal-failed|split-brain  


6、 选项配置
[plain] view plain copy
 print?
  1. $gluster volume set mamm-volume key value  

问题解决

如果创建了一个卷,删掉了,再次创建,会报错
volume create: nfsp: failed: /glusterfs/nfsp or a prefix of it is already part of a volume

因为创建volume时,在brick对应的存储目录上,增加了"trusted.glusterfs.volume-id"和"trusted.gfid"两个扩展属性,在删除volume时并未移除这两个属性,再次创建时,对brick的存储目录进行校验,发现已经有了扩展属性,因此会有brick已经是volume的一部分的提示。
在改卷涉及的所有节点执行以下操作


# setfattr -x trusted.glusterfs.volume-id /glusterfs/nfsp


# setfattr -x trusted.gfid /glusterfs/nfsp


# rm -rf /glusterfs/nfsp/.glusterfs


# /etc/init.d/glusterd restart


文章最后提几款测试工具:atop, iperf, iozone, fio, 链接如下

atop     http://blog.csdn.net/miltonzhong/article/details/9167419

iperf     http://man.linuxde.net/iperf

iozone     http://blog.sina.com.cn/s/blog_667725170100ttet.html

fio       http://michaelkang.blog.51cto.com/1553154/1640479/


【完】