GlusterFS架构与维护

  1. 云栖社区>
  2. 博客>
  3. 正文

GlusterFS架构与维护

科技小先锋 2017-11-14 16:37:00 浏览904
展开阅读全文

GlusterFS 外部架构

wKiom1eDiHjA-6YjAAW6vXeeVEE704.png

    GlusterFS总体架构与组成部分如图2所示,它主要由存储服务器(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,而纠删码技术可以提供更高的存储利用率。但是,鱼和熊掌不可得兼,它们都会对性能产生较大影响。

术语表:

Xlator=translator:glusterfs 模块的代名词

Brick :存储目录是Glusterfs 的基本存储单元,由可信存储池中服务器上对外

输出的目录表示。存储目录的格式由服务器和目录的绝对路径构成,具体如下:

SERVER:EXPORT.例如:myhostname:/exports/myexportdir/

Volume :卷是存储目录的逻辑组合。大部分gluster 管理操作是在卷上进行的。

Metadata:元数据关于数据的数据,用于描述文件、目录等的相关信息。

FUSE=Filesystem inUserspace: 是一个内核模块,允许用户创建自己的文件系

统无需修改内核代码。

Glusterd : Glusterfs 后台进程,运行在所有Glusterfs 节点上。

DistributeVolume: 分布式卷

ReplicateVolume: 副本卷

StripeVolume: 条带卷

DistributeReplicate Volume: 分布式副本卷

DHT=Distribute HashTable

AFR=Automatic FileReplication

SAN = Storage AreaNetwork: 存储区域网络是一种高速网络或子网络,提供在计算机与存储之间的数据传输。

NAS = Network-attachedstorage:网络附属存储是一种将分布、独立的数据整合为大型、集中化管理的数据中心,以便于对不同主机和应用服务器进行访问的技术。

RPC =Remote ProcedureCall: 远程过程调用

XDR =eXtern DataRepresentation: RPC 传递数据的格式

CLI=Command LineInterface 控制台

argp=Argument Parser

UUID=University UnqiueIdentifier

SVC =service

CLNT =client

MGMT=management

cbks = Call Backs

ctx = context

lk = lock

attr = attribute

txn = transaction

rb = replace brick

worm = write once , readmany

系统配额:

1、开启/关闭系统配额

1
gluster volume quota VOLNAME enable/disable


2、设置(重置)目录配额

1
2
gluster volume quota VOLNAME limit-usage /img limit-value
gluster volume quota img limit-usage /quota 10GB


设置img 卷下的quota 子目录的限额为10GB。这个目录是以系统挂载目录为根目录”/”,所以/quota 即客户端挂载目录下的子目录quota

3、配额查看

1
2
gluster volume quota VOLNAME list
gluster volume quota VOLNAME list


可以使用如上两个命令进行系统卷的配额查看,第一个命令查看目的卷的所有配额设置,

第二个命令则是执行目录进行查看。可以显示配额大小及当前使用容量,若无使用容量(最小0KB)则说明设置的目录可能是错误的(不存在)。

 地域复制:

1
gluster volume geo-replication MASTER SLAVE start/status/stop

 //地域复制是系统提供的灾备功能,能够将系统的全部数据进行异步的增量备份到另外的磁盘中。

1
gluster volume geo-replication img 192.168.10.8:/data1/brick1 start

如上,开始执行将img 卷的所有内容备份到10.8 下的/data1/brick1 中的task,需要注意的是,这个备份目标不能是系统中的Brick。

 平衡卷:

平衡布局是很有必要的,因为布局结构是静态的,当新的bricks 加入现有卷,新创建的文件会分布到旧的bricks 中,所以需要平衡布局结构,使新加入的bricks 生效。布局平衡只是使

新布局生效,并不会在新的布局移动老的数据,如果你想在新布局生效后,重新平衡卷中的数据,还需要对卷中的数据进行平衡。

当你扩展或者缩小卷之后,需要重新在服务器直接重新平衡一下数据,重新平衡的操作被分

为两个步骤:

1、Fix Layout

修改扩展或者缩小后的布局,以确保文件可以存储到新增加的节点中。

2、Migrate Data

重新平衡数据在新加入bricks 节点之后。

* Fix Layout and Migrate Data

先重新修改布局然后移动现有的数据(重新平衡)

1
2
# gluster volume rebalance VOLNAME fix-layout start
# gluster volume rebalance VOLNAME migrate-data start

也可以两步合一步同时操作

1
2
3
# gluster volume rebalance VOLNAME start
# gluster volume rebalance VOLNAME status //你可以在在平衡过程中查看平衡信息
#  gluster volume rebalance VOLNAME stop //你也可以暂停平衡,再次启动平衡的时候会从上次暂停的地方继续开始平衡。

I/O 信息查看:

Profile Command 提供接口查看一个卷中的每一个brick 的IO 信息

1
2
3
#gluster volume profile VOLNAME start //启动profiling,之后则可以进行IO 信息查看
#gluster volume profile VOLNAME info //查看IO 信息,可以查看到每一个Brick 的IO 信息
#gluster volume profile VOLNAME stop //查看结束之后关闭profiling 功能

Top监控:

Top command 允许你查看bricks 的性能例如:read, write, fileopen calls, file read calls, file,write calls,directory open calls, and directory real calls

所有的查看都可以设置top 数,默认100

1
2
3
4
5
6
7
# gluster volume top VOLNAME open [brick BRICK-NAME] [list-cnt cnt] //查看打开的fd
# gluster volume top VOLNAME read [brick BRICK-NAME] [list-cnt cnt] //查看调用次数最多的读调用
# gluster volume top VOLNAME write [brick BRICK-NAME] [list-cnt cnt] //查看调用次数最多的写调用
# gluster volume top VOLNAME opendir [brick BRICK-NAME] [list-cnt cnt] //查看次数最多的目录调用
# gluster volume top VOLNAME readdir [brick BRICK-NAME] [list-cnt cnt] //查看次数最多的目录调用
# gluster volume top VOLNAME read-perf [bs blk-size count count] [brickBRICK-NAME] [list-cnt cnt] //查看每个Brick 的读性能
# gluster volume top VOLNAME write-perf [bs blk-size count count] [brickBRICK-NAME] [list-cnt cnt] //查看每个Brick 的写性能

性能优化配置选项:

1
2
3
4
5
6
7
8
9
gluster volume set arch-img cluster.min-free-disk 默认是10% 磁盘剩余告警
gluster volume set arch-img cluster.min-free-inodes 默认是5% inodes 剩余告警
gluster volume set img performance.read-ahead-page-count 8 默认4,预读取的数量
gluster volume set img performance.io-thread-count 16 默认16 io 操作的最大线程
gluster volume set arch-img network.ping-timeout 10 默认42s
gluster volume set arch-img performance.cache-size 2GB 默认128M 或32MB,
gluster volume set arch-img cluster.self-heal-daemon on 开启目录索引的自动愈合进程
gluster volume set arch-img cluster.heal-timeout 300 自动愈合的检测间隔,默认为600s #3.4.2版本才有
gluster volume set arch-img performance.write-behind-window-size 256MB #默认是1M 能提高写性能单个文件后写缓冲区的大小默认1M


本文转自Jacken_yang 51CTO博客,原文链接:http://blog.51cto.com/linuxnote/1825533,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
科技小先锋
+ 关注