视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
GlusterFS集群文件系统
2025-09-26 21:43:50 责编:小OO
文档
GlusterFS集群文件系统

一、概述

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下载本文

显示全文
专题