一、概述
GlusterFS是一个开放源代码的分布式文件系统,它能够扩展到几PB(实际上,72 brontobytes(1015TB)!)和处理数千的客户端。GlusterFS集群存储通过InfiniBand RDMA或TCP / IP网络互连,聚集的磁盘和内存资源和管理数据在一个单一全局命名空间。GlusterFS是基于可堆叠用户空间设计可以为不同的工作负载提供卓越的性能。
图1 GlusterFS–一个共同的挂载点
GlusterFS支持标准的客户端运行标准的应用程序在任何标准的IP网络上,如图1所示,说明了用户如何在全局统一的命名空间中使用NFS/CIFS等不同的标准协议来访问应用数据和文件。GlusterFS使得用户可摆脱原有整体的、高成本的封闭存储系统,能够利用普通廉价的存储设备来部署可集中管理、横向扩展、虚拟的存储池,存储容量可扩展至TB/PB级。
GlusterFS是专为今天的高性能的虚拟化云计算环境而设计的。它不同于传统的数据中心,云环境需要多租户随着增长或减少资源需求的能力。企业可以在没有厂商锁定的前提下,在公共云,和混合环境中扩展容量、性能和可用性需求。
GlusterFS被用于不同行业的生产环境中,有医疗保健,,教育,Web 2.0和金融服务的数千家企业中。
GlusterFS的特性包括:
可伸缩性和高性能
Scale-Out架构允许通过简单地增加资源来提高存储容量和性能,磁盘、计算和I/O资源都可以增加,支持10GbE和InfiniBand等高速网络互联。Gluster弹性哈希(Elastic Hash)解除了GlusterFS对元数据服务器的需求,消除了单点故障和性能瓶颈,真正实现了并行化数据访问。
●高可用性
GlusterFS可以对文件进行自动复制,如镜像或多次复制,从而确保数据总是可以访问,甚至是在硬件故障的情况下也能正常访问。自我修复功能能够把数据恢复到正确的状态,而且修复是以增量的方式在后台执行,几乎不会产生性能负载。GlusterFS没有设计自己的私有数据文件格式,而是采用操作系统中主流标准的磁盘文件系统(如EXT3、ZFS)来存储文件,因此数据可以使用各种标准工具进行复制和访问。
●全局命名空间
全局统一命名空间将磁盘和内存资源聚集成一个单一的虚拟存储池,对上层用户和应用屏蔽了底层的物理硬件。存储资源可以根据需要在虚拟存储池中进行弹性扩展,比如扩容或收缩。当存储虚拟机映像时,存储的虚拟映像文件没有数量,成千虚拟机均通过单一挂载点进行数据共享。虚拟机I/O可在命名空间内的所有服务器上自动进行负载均衡,消除了SAN环境中经常发生的访问热点和性能瓶颈问题。
●弹性哈希算法
GlusterFS采用弹性哈希算法在存储池中定位数据,而不是采用集中式或分布式元数据服务器索引。在其他的Scale-Out存储系统中,元数据服务器通常会导致I/O 性能瓶颈和单点故障问题。GlusterFS中,所有在Scale-Out存储配置中的存储系统都可以智能地定位任意数据分片,不需要查看索引或者向其他服务器查询。这种设计机制完全并行化了数据访问,实现了真正的线性性能扩展。
●弹性卷的管理
数据储存在逻辑卷中,逻辑卷可以从虚拟化的物理存储池进行逻辑划分而得到。存储服务器可以在线进行增加和移除,不会导致应用中断。逻辑卷可以在所有配置服务器中增长和缩减,可以在不同服务器迁移进行容量均衡,或者增加和移除系统,这些操作都可在线进行。文件系统配置更改也可以实时在线进行并应用,从而可以适应工作负载条件变化或在线性能调优。
●基于标准的协议
Gluster存储服务支持NFS, CIFS, HTTP, FTP以及Gluster原生协议,完全与POSIX 标准兼容。现有应用程序不需要作任何修改或使用专用API,就可以对Gluster 中的数据进行访问。这在公有云环境中部署Gluster时非常有用,Gluster对云服务提供商专用API进行抽象,然后提供标准POSIX接口。
二、体系结构
图2-GlusterFS架构和组成
GlusterFS总体架构与组成部分如上图所示,它主要由存储服务器(Brick Server)、客户端以及NFS/Samba存储网关组成。不难发现,GlusterFS架构中没有元数据服务器组件,没有 MeteData 的设计模式,使得系统的复杂度降低,也避免了MeteData 成为整个系统性能瓶颈的问题,当然,这种体系结构仅仅适合于基于以文件为对象的存储体系,对于像 GoogleFS,Lustre 等基于磁盘块,inode 的存储系统是不能没有 MeteData 的。这是其最大的设计这点,对于提升整个系统的性能、可靠性和稳定性都有着决定性的意义。GlusterFS支持TCP/IP
和InfiniBand RDMA高速网络互联,客户端可通过原生Glusterfs协议访问数据,其他没有运行GlusterFS客户端的终端可通过NFS/CIFS标准协议通过存储网关访问数据。
存储服务器主要提供基本的数据存储功能,最终的文件数据通过统一的调度策略分布在不同的存储服务器上。它们上面运行着Glusterfsd进行,负责处理来自其他组件的数据服务请求。如前所述,数据以原始格式直接存储在服务器的本地文件系统上,如EXT3、EXT4、XFS、ZFS等,运行服务时指定数据存储路径。多个存储服务器可以通过客户端或存储网关上的卷管理器组成集群,如Stripe (RAID0)、Replicate(RAID1)和DHT(分布式Hash)存储集群,也可利用嵌套组合构成更加复杂的集群,如RAID10。
由于没有了元数据服务器,客户端承担了更多的功能,如图3,包括数据卷管
理、I/O调度、文件定位、数据缓存等功能。利用FUSE(File system in User Space)模块将GlusterFS挂载到本地文件系统之上,实现POSIX兼容的方式来访问系统数据。在最新的3.1.X版本中,客户端不再需要维护卷配置信息,改成自动从运行在网关上的glusterd弹性卷管理服务进行获取和更新,极大简化了卷管理。GlusterFS客户端负载相对传统分布式文件系统要高,包括CPU占用率和内存占用。
GlusterFS存储网关提供弹性卷管理和NFS/CIFS访问代理功能,卷管理器负责逻辑卷的创建、删除、容量扩展与缩减、容量平滑等功能,并负责向客户端提供逻辑卷信息及主动更新通知功能等。
图3 GlusterFS模块化堆栈式设计
GlusterFS是模块化堆栈式的架构设计,如图3所示。模块称为Translator,是GlusterFS提供的一种强大机制,借助这种良好定义的接口可以高效简便地扩展文件系统的功能。服务端与客户端模块接口是兼容的,同一个translator可同时在两边加载。每个translator都是SO动态库,运行时根据配置动态加载。每个模块实现特定基本功能,GlusterFS中所有的功能都是通过translator实现,比如Cluster, Storage, Performance, Protocol, Features等,基本简单的模块可以通过堆栈式的组合来实现复杂的功能。这一设计思想借鉴了GNU/Hurd微内核的虚拟文件系统设计,可以把对外部系统的访问转换成目标系统的适当调用。大部分模块都运行在客户端,比如合成器、I/O调度器和性能优化等,服务端相对简单许多。客户端和存储服务器均有自己的存储栈,构成了一棵Translator功能树,应用了若干模块。模块化和堆栈式的架构设计,极大降低了系统设计复杂性,简化了系统的实现、升级以及系统维护。
整个数据流如下图4
图4-数据流
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 配置文件据来进行的一系列处理,我们在启动glusterfs client 时需要指定这个文件,其默认位置:
/etc/glusterfs/client.vol)。
5. 在glusterfs client 的处理末端,通过网络将数据递交给Glusterfs Server,并且将数据写入到服务器所控制的存储设备上。
三.弹性哈希算法
GlusterFS的哈希分布是以目录为基本单位的,文件的父目录利用扩展属性记录了子卷映射信息,其下面子文件目录在父目录所属存储服务器中进行分布。由于文件目录事先保存了分布信息,因此新增节点不会影响现有文件存储分布,它将从此后的新创建目录开始参与存储分布调度。这种设计,新增节点不需要移动任何
文件,但是负载均衡没有平滑处理,老节点负载较重。GlusterFS在设计中考虑了这一问题,在新建文件时会优先考虑容量负载最轻的节点,在目标存储节点上创建文件链接直向真正存储文件的节点。另外,GlusterFS弹性卷管理工具可以在后台以人工方式来执行负载平滑,将进行文件移动和重新分布,此后所有存储服务器都会均会被调度。
四、Translators
Cluster Translators,它是实现GlusterFS集群存储的核心,它包括AFR
(Automatic File Replication)、DHT(Distributed Hash Table)和Stripe
三种类型。
AFR相当于RAID1,同一文件在多个存储节点上保留多份,主要用于实现高
可用性以及数据自动修复。AFR所有子卷上具有相同的名字空间,查找文件时从
第一个节点开始,直到搜索成功或最后节点搜索完毕。读数据时,AFR会把所有
请求调度到所有存储节点,进行负载均衡以提高系统性能。写数据时,首先需要
在所有锁服务器上对文件加锁,默认第一个节点为锁服务器,可以指定多个。然
后,AFR以日志事件方式对所有服务器进行写数据操作,成功后删除日志并解锁。
AFR会自动检测并修复同一文件的数据不一致性,它使用更改日志来确定好的数
据副本。自动修复在文件目录首次访问时触发,如果是目录将在所有子卷上复制
正确数据,如果文件不存则创建,文件信息不匹配则修复,日志指示更新则进行
更新。
DHT即上面所介绍的弹性哈希算法,它采用hash方式进行数据分布,名字空间分布在所有节点上。查找文件时,通过弹性哈希算法进行,不依赖名字空间。但遍历文件目录时,则实现较为复杂和低效,需要搜索所有的存储节点。单一文件只会调度到唯一的存储节点,一旦文件被定位后,读写模式相对简单。DHT不具备容错能力,需要借助AFR实现高可用性, 如图5所示应用案例。
Stripe相当于RAID0,即分片存储,文件被划分成固定长度的数据分片以Round-Robin轮转方式存储在所有存储节点。Stripe所有存储节点组成完整的名字空间,查找文件时需要询问所有节点,这点非常低效。读写数据时,Stripe 涉及全部分片存储节点,操作可以在多个节点之间并发执行,性能非常高。
Stripe通常与AFR组合使用,构成RAID10/RAID01,同时获得高性能和高可用性,当然存储利用率会低于50%。
五、安装测试篇
cd /etc/yum.repo.d/
Wget -c
http://download.gluster.org/pub/gluster/glusterfs/LATEST/CentOS/glusterfs-epel.repo Yum makecache
如上图所示,我们也选择三个存储节点组成glusterfs集群。在glusterfs-node01上安装glusterfs-node01。
yum -y install glusterfs-server
/etc/init.d/glusterd start
glusterfs-node02和glusterfs-node03同样执行如上操作。
1)添加节点,在glusterfs-node01上进行添加节点。
gluster peer probe {ip-address-of-glusterfs-node02}
gluster peer probe {ip-address-of-glusterfs-node03}
#查看节点情况
gluster peer status
2)创建卷,为了测试和上面ceph类似,我们将逻辑卷挂载到/opt/glusterfs上。gluster volume create shared_vol replica 3
{ip-address-of-glusterfs-node01}:/opt/glusterfs
{ip-address-of-glusterfs-node02}:/opt/glusterfs
{ip-address-of-glusterfs-node03}:/opt/glusterfs
#查看卷状态
gluster volume info
我们这里设置的每份数据存3份。
3)启动卷。
gluster volume start shared_vol
至此服务器端部署完成,下面来部署客户端。
4)安装客户端程序,这里要注意是否与服务器端版本一致。
yum -y install glusterfs-client
5)挂载目录
mount.glusterfs {ip-address-of-glusterfs-node01}:/shared_vol /mnt/glusterfs
在虚拟机上测试
fio --direct=1 --rw=rw --bs=1m --size=1g --numjobs=3 --group_reporting --name=test-rw
fio --direct=1 --rw=read --bs=1m --size=1g --numjobs=3 --group_reporting --name=test-rwfio --direct=1 --rw=randread --bs=1m --size=1g --numjobs=3 --group_reporting --name=test-rw fio --direct=1 --rw=randread --bs=1m --size=1g --numjobs=3 --group_reporting --name=test-rw fio --direct=1 --rw=randwrite --bs=1m --size=1g --numjobs=3 --group_reporting --name=test-rw Io引擎为sync,bs=1m时,统计结果如下
常用的命令
存储池:
将服务器加入存储池:
gluster peer probe SERVER(端口为24007)
查看存储池的状态:
gluster peer status
将服务器从存储池中删除
gluster peer detach SERVER
gluster volume create distribute 10.28.1.12:/glusterfs
服务器卷:
创建卷:
gluster volume create replica-volume server3:/exp3 server4:/exp4
卷类型:
1)Distributed(可能导致一些数据丢失,因为没有副本)
gluster volume create replica-volume server1:/exp1 server2:/exp2
gluster volume create replica-volume transport rdma server1:/exp1
gluster volume set replica-volume auth.allow 10.*
gluster volume info
2)Replicated
gluster volume create replica-volume replica 2 transport tcp server1:/exp1 server2:/exp2
3)Striped(高并发环境访问大文件)
gluster volume create replica-volume stripe 2 transport tcp server1:/exp1 server2:/exp2
4)Distributed Replicated(能够提高读性能)
gluster volume create replica-volume replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
5)Distributed Striped
gluster volume create replica-volume stripe 4 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
卷操作:
gluster volume start replica-volume
gluster volume stop replica-volume
gluster volume delete replica-volume
调节卷选项:gluster volume set replica-volume performance.cache-size 256MB
扩展卷:
gluster peer probe server4
gluster volume add-brick replica-volume server4:/exp4
收缩卷:
gluster volume remove-brick replica-volume server2:/exp2
迁移卷(fuse):
gluster volume replace-brick replica-volume server3:/exp3 server5:exp5
暂停迁移:
gluster volume replace-brick replica-volume server3:/exp3 server5:exp5 pause 中止迁移:
gluster volume replace-brick replica-volume server3:/exp3 server5:exp5 abort 检查迁移状态:
gluster volume replace-brick replica-volume server3:/exp3 server5:/exp5 status
提交迁移:
gluster volume replace-brick replica-volume server3:/exp3 server5:/exp5 commit
查看迁移的结果:gluster volume info replica-volume
重新平衡卷:
gluster volume rebalance replica-volume status
停止重新平衡:
gluster volume rebalance replica-volume stop
将一些数据移动到新添加的存储块上
gluster volume rebalance replica-volume fix-layout start
gluster volume rebalance replica-volume migrate-data start
六、与openstack结合使用
openstack环境:
Controller 10.101.0.21
ComputeA 10.101.0.30
ComputeB 10.101.0.31
ComputeC 10.101.0.32
ComputeD 10.101.0.33
目的:
把四台Compute节点作为server和client一体的服务集群,在每个节点都划出一个目录作为共享目录,并作replica 2备份,当有一台计算节点挂掉的时候,整个系统仍然能够正常运行。
步骤:在每台计算节点都新建一个lv,并格式化成ext4格式
lvcreate -L 100g -n glusterfs_lv openstackvg
mkfs.ext4 /dev/openstackvg/glusterfs_lv
mount /dev/openstackvg/glusterfs_lv /home/glusterfs
这样每台结算节点的/home/glusterfs都作为共享目录。
然后启动每台节点的gluster服务,启动服务之前记得关闭防火墙
service iptables stop
server glusterd start
然后在ComputeA上加入其他节点:
gluster peer add ComputeB
gluster peer add ComputeC
gluster peer add ComputeD
[root@Compute-34-40-B5-E0-10-B2 ~]# gluster peer status
Number of Peers: 3
Hostname: Compute-5c-f3-fc-96-b9-34
Uuid: 13a8ae46-1b8a-4f55-b792-e75a9abed8c6
State: Peer in Cluster (Connected)
Hostname: Compute-5c-f3-fc-5e-4e-32
Uuid: 284e43e9-e9e4-42cc-aac2-be01424aecd6
State: Peer in Cluster (Connected)
Hostname: 10.101.0.30
Uuid: 9fa8d87c-841f-4e55-87c1-42c7b2be57af
State: Peer in Cluster (Connected)
然后创建glusterfs的volume
glusterfs volume create gluster_vol replica 2 stripe 2 ComputeA:/home/glusterfs ComputeB:/home/glusterfs ComputeC:/home/glusterfs ComputeD:/home/glusterfs
glusterfs volume start
[root@Compute-34-40-B5-E0-10-B2 ~]# gluster volume status
Status of volume: gluster_vol
Gluster process Port Online Pid
------------------------------------------------------------------------------
Brick Compute-34-40-b5-e0-10-b2:/opt/lbs/glusterfs_lv 49152 Y 2137
Brick Compute-5c-f3-fc-5e-4e-32:/opt/lbs/glusterfs_lv 49152 Y 2180
Brick Compute-5c-f3-fc-96-b9-34:/opt/lbs/glusterfs_lv 49153 Y 27050
Brick 10.101.0.30:/opt/lbs/glusterfs_lv 49152 Y 2038
NFS Server on localhost 2049 Y 2153
Self-heal Daemon on localhost N/A Y 2148 NFS Server on Compute-5c-f3-fc-5e-4e-32 2049 Y 2187 Self-heal Daemon on Compute-5c-f3-fc-5e-4e-32 N/A Y 2188 NFS Server on Compute-5c-f3-fc-96-b9-34 2049 Y 5096 Self-heal Daemon on Compute-5c-f3-fc-96-b9-34 N/A Y 5103 NFS Server on 10.101.0.30 2049 Y 2042 Self-heal Daemon on 10.101.0.30 N/A Y 2046
There are no active volume tasks
[root@Compute-34-40-B5-E0-10-B2 ~]# gluster volume info
V olume Name: gluster_vol
Type: Distributed-Replicate
V olume ID: b4717c0a-50ad-41a0-a444-612054cfd1b3
Status: Started
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: Compute-34-40-b5-e0-10-b2:/opt/lbs/glusterfs_lv
Brick2: Compute-5c-f3-fc-5e-4e-32:/opt/lbs/glusterfs_lv
Brick3: Compute-5c-f3-fc-96-b9-34:/opt/lbs/glusterfs_lv
Brick4: 10.101.0.30:/opt/lbs/glusterfs_lv
然后到每个节点上把glusterfs共享出来的volume挂在到特定目录
mount -t glusterfs <本机IP>:/gluster_vol /var/lib/nova/instances
chown -R nova:nova /var/lib/nova/instances下载本文