Glusterfs是一个借助于TCP服务并且无元数据服务器的分布式存储服务,不仅具有高性能、低延迟的特点,还能保证整个集群服务在崩溃时也能及时恢复,是一个具有强大横向拓展的分布式存储服务的解决方案。
1. GlusterFs概述
1.1 GlusterFs简介
GlusterFS 是一个开源的分布式文件系统。
由存储服务器、客户端以及NFS/Samba 存储网关(可选,根据需要选择使用)组成。
没有元数据服务器组件,这有助于提升整个系统的性能、可靠性和稳定性。
GlusterFS同时也是Scale-Out(横向扩展)存储解决方案Gluster的核心
在存储数据方面具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。
GlusterFS支持借助TCP/IP或InfiniBandRDMA网络(一种支持多并发链接的技术,具有高带宽、低时延、高扩展性的特点)
将物理分散分布的存储资源汇聚在一起,统一提供存储服务,并使用统一全局命名空间来管理数据。
对比传统分布式文件存储系统MFS:
传统的分布式文件系统大多通过元服务器来存储元数据,元数据包含存储节点上的目录信息、目录结构等。这样的设计在浏览目录时效率高,但是也存在一些缺陷,例如单点故障。一旦元数据服务器出现故障,即使节点具备再高的冗余性,整个存储系统也将崩溃。(例如Ceph、Longhorm等k8s常用的分布式文件存储系统)
而 GlusterFS 分布式文件系统是基于无元服务器的设计,数据横向扩展能力强,具备较高的可靠性及存储效率。
1.2 GlusterFS特点
(1)拓展性和高性能
GlusterFS利用双重特性来提供高容量存储解决方案。
① Scale-Out架构允许通过简单地增加存储节点的方式来提高存储容量和性能(磁盘、计算和I/O资源都可以独立增加),支持10GbE和 InfiniBand等高速网络互联。
② Gluster弹性哈希(ElasticHash)解决了GlusterFS对元数据服务器的依赖,改善了单点故障和性能瓶颈,真正实现了并行化数据访问。GlusterFS采用弹性哈希算法在存储池中可以智能地定位任意数据分片(将数据分片存储在不同节点上),不需要查看索引或者向元数据服务器查询。
(2)高可用性
① GlusterFS可以对文件进行自动复制,如镜像或多次复制,从而确保数据总是可以访问,甚至是在硬件故障的情况下也能正常访问。
② 当数据出现不一致时,自我修复功能能够把数据恢复到正确的状态,数据的修复是以增量的方式在后台执行,几乎不会产生性能负载。
③ GlusterFS可以支持所有的存储,因为它没有设计自己的私有数据文件格式,而是采用操作系统中主流标准的磁盘文件系统(如EXT3、XFS等)来存储文件,因此数据可以使用传统访问磁盘的方式被访问。
(3)全局统一命名空间
分布式存储中,将所有节点的命名空间整合为统一命名空间,将整个系统的所有节点的存储容量组成一个大的虚拟存储池,供前端主机访问这些节点完成数据读写操作。
(4)弹性卷管理
GlusterFS通过将数据储存在逻辑卷中,逻辑卷从逻辑存储池进行独立逻辑划分而得到。
逻辑存储池可以在线进行增加和移除,不会导致业务中断。逻辑卷可以根据需求在线增长和缩减,并可以在多个节点中实现负载均衡。
文件系统配置也可以实时在线进行更改并应用,从而可以适应工作负载条件变化或在线性能调优。
(5)基于标准协议
Gluster 存储服务支持 NFS、CIFS、HTTP、FTP、SMB 及 Gluster原生协议,完全与 POSIX 标准(可移植操作系统接口)兼容。
现有应用程序不需要做任何修改就可以对Gluster 中的数据进行访问,也可以使用专用 API 进行访问。
(6)模块化堆栈设计
GlusterFS 采用模块化、堆栈式的架构。
通过对模块进行各种组合,即可实现复杂的功能。
例如 Replicate 模块可实现 RAID1,Stripe 模块可实现 RAID0, 通过两者的组合可实现 RAID10 和 RAID01,同时获得更高的性能及可靠性。
(7)弹性HASH算法
弹性 HASH 算法是 Davies-Meyer 算法的具体实现,通过 HASH 算法可以得到一个 32 位的整数范围的 hash 值,假设逻辑卷中有 N 个存储单位 Brick,则 32 位的整数范围将被划分为 N 个连续的子空间,每个空间对应一个 Brick。当用户或应用程序访问某一个命名空间时,通过对该命名空间计算 HASH 值,根据该 HASH 值所对应的 32 位整数空间定位数据所在的 Brick。
弹性 HASH 算法的优点:
保证数据平均分布在每一个 Brick 中。
解决了对元数据服务器的依赖,进而解决了单点故障以及访问瓶颈。
1.3 GlusterFS 术语
Brick(存储块):
指可信主机池中由主机提供的用于物理存储的专用分区,是GlusterFS中的基本存储单元,同时也是可信存储池中服务器上对外提供的存储目录。
存储目录的格式由服务器和目录的绝对路径构成,表示方法为
SERVER:EXPORT
,如192.168.80.10:/data/mydir/
。
Volume(逻辑卷):
一个逻辑卷是一组 Brick 的集合。
卷是数据存储的逻辑设备,类似于 LVM 中的逻辑卷。
大部分 Gluster 管理操作是在卷上进行的。
FUSE:
是一个内核模块,允许用户创建自己的文件系统,无须修改内核代码。
VFS:
内核空间对用户空间提供的访问磁盘的接口。
Glusterd(后台管理进程):
在存储群集中的每个节点上都要运行。
1.4 GlusterFS的工作流程
(1)客户端或应用程序通过 GlusterFS 的挂载点访问数据。
(2)linux系统内核通过 VFS API 收到请求并处理。
(3)VFS 将数据递交给 FUSE 内核文件系统,并向系统注册一个实际的文件系统 FUSE,而 FUSE 文件系统则是将数据通过 /dev/fuse 设备文件递交给了 GlusterFS client 端。可以将 FUSE 文件系统理解为一个代理。
(4)GlusterFS client 收到数据后,client 根据配置文件的配置对数据进行处理。
(5)经过 GlusterFS client 处理后,通过网络将数据传递至远端的 GlusterFS Server,并且将数据写入到服务器存储设备上。
2. GlusterFS的卷类型
详细说明请参考官网说明:
GlusterFS 支持七种卷类型:
分布式(Distributed)
复制型(Replicated)
分布式复制型(Distributed Replicated)
分散型/纠删码型(Dispersed)
分布式分散型卷(Distributed Dispersed):结合分布式存储和纠删码技术,既扩展存储也保证数据保护。
2.1 分布式卷(Distributed Volume)
分布式卷采用 HASH 算法将文件散列分布到所有 Brick(存储单元)上,是 GlusterFS 的默认卷。文件以整体为单位被存放在某个 Brick 上,类似于文件级的 RAID0。
特点:
扩展存储: 通过增加 Brick 来横向扩展存储空间。
缺乏容错: 如果任一 Brick(或对应磁盘)故障,文件会丢失;数据冗余需依赖底层其他硬件或软件来保障。
存取性能: 由于直接使用本地文件系统存储文件,文件并未进行分块处理,所以在网络通信时可能会带来额外延时。
2.1.1 分布式卷示例原理
文件(例如 File1)通过 HASH 算法随机分布到不同的 Brick 上,假设 File1 存在于 Server1,而 File2、File3 可能分别落在 Server1 或 Server2 上。
一个文件只存在于某个单独的 Brick 上,而不会拆分存放于多个服务器。
主要特点:
文件分布在不同的服务器上,但本身不具备冗余性;
易于通过增加 Brick 来廉价扩展卷的容量;
单点故障(某个 Brick 或服务器故障)将直接导致数据丢失;
数据保护依赖于底层其他的备份或冗余机制。
注意: 分布式卷中的磁盘/服务器故障可能导致严重的 丢失数据,因为目录内容随机分布在 bricks 的 Bricks 中。
2.1.2 创建分布式卷
语法:
# gluster volume create [transport tcp]
// 示例:创建四个TCP通讯的分布式卷
# gluster volume create test-volume server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
Creation of test-volume has been successful
Please start the volume to access data.
// 示例:展示卷详情信息
# gluster volume info
Volume Name: test-volume
Type: Distribute
Status: Created
Number of Bricks: 4
Transport-type: tcp
Bricks:
Brick1: server1:/exp1
Brick2: server2:/exp2
Brick3: server3:/exp3
Brick4: server4:/exp4
// 示例:指定InfiniBand协议,不设置默认TCP协议,还可以设置RDMA协议
# gluster volume create test-volume transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
Creation of test-volume has been successful
Please start the volume to access data.
创建后修改传输协议流程:
先在所有的节点卸载所有卷:
umount mount-point
通过gluster停止卷使用:
gluster volume stop <VOLNAME>
改变卷传输类型,可以同时启用两个
gluster volume set test-volume config.transport tcp,rdma OR tcp OR rdma
使用具体协议挂载所有卷
mount -t glusterfs -o transport=rdma server1:/test-volume /mnt/glusterfs
2.2 复制型卷(Replicated Volume)
复制型卷将文件在卷内的多个 Brick 之间进行复制存储,可以保证数据在环境中是高可用和高可靠性的。
特点:
高可用性与高可靠性: 每个文件都有多个副本,确保在某个 Brick 故障时数据依然可用;
冗余保护: 数据冗余由系统自动维护,适用于对数据完整性要求较高的环境。
注意: 存储块的数量应等于复制卷的数量,为了防止服务器和磁盘故障,建议不同存储块应该来自不同的服务器。
2.2.1 复制型卷原理
文件(如 FileA)在多个 Brick(例如 Server1 与 Server2 的相应目录)上都有完整副本。
文件的所有副本一致存在,即便某个 Brick 出现故障,其他副本仍能提供数据服务。
主要特点:
自动提供数据冗余,具备容错能力;
保证了高可用性和数据的高可靠性;
由于需要同步多个副本,写操作性能可能会略受影响。
2.2.2 创建复制型卷
语法
# gluster volume create [replica ] [transport tcp]
// 示例:创建两个副本的存储服务
# gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2
Creation of test-volume has been successful
Please start the volume to access data.
注意:如果尝试在同一个节点创建多个相同的复制卷则会报错,需要使
force
标志
尝试使用仲裁节点防止脑裂问题,例如以下3个副本卷,其中第三块充当仲裁块
# gluster volume create <VOLNAME> replica 2 arbiter 1 host1:brick1 host2:brick2 host3:brick3
脑裂问题(Split-brain):在分布式系统中,由于网络分割或通信故障,集群中的节点分成了两个或多个相互独立的部分,每个部分都认为自己是唯一的、有效的服务提供者。这会导致各部分同时进行写操作和数据更新,从而造成数据不一致、资源竞争甚至数据损坏的问题。
为什么需要仲裁节点:
仲裁节点(Arbitrator Node)充当一个额外的“投票者”,在出现脑裂情况时帮助集群作出决策。它通常不存储数据,但参与投票以确定哪一部分应当继续对外提供服务。这样可以确保只有一个子集获得多数票,从而防止多个子集同时对外写入数据,保证数据一致性和系统稳定性。
2.3 分布式复制型卷(Distributed Replicated Volume)
分布式复制型卷将文件分布在多个复制型 Brick 之中,结合了扩展存储和数据冗余的优点。
特点:
存储扩展与冗余保护兼备: 文件在多个 Brick 上分布且存在多个副本;
高可靠性: 即使部分 Brick 发生故障,数据仍可恢复;
读取性能提升: 多个副本分布在不同服务器,读取时可并行访问,从而提高读取效率。
2.3.1 分布式复制型卷示例原理
文件(例如 FileB)在 Server1 与 Server2 上都有完整副本,同时文件会根据 HASH 算法分布于更多 Brick。
一个文件的副本不会集中存放,而是在多个节点间均衡分布。
主要特点:
同时具备分布式卷的扩展性和复制型卷的容错能力;
提供高可用性和高可靠性;
读取性能在多数环境中有明显改善;
对于写操作,网络同步与复制可能会带来一定的性能开销。
2.3.2 创建分布式复制型卷
语法
# gluster volume create [replica ] [transport tcp]
// 示例:创建有两个副本的分布式复制卷
# gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
Creation of test-volume has been successful
Please start the volume to access data.
// 示例:可以创建六个节点只有2个复制卷
# gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4 server5:/exp5 server6:/exp6
Creation of test-volume has been successful
Please start the volume to access data.
注意:卷中Brick所包含的存储服务器数必须是复制数的倍数(>=2倍)
2.4 分散型卷(Dispersed Volume)
Dispersed Volume 是基于纠删码(erasure codes)构建的。
数据会被打散(stripe)并加上冗余信息,分布在多个 brick(即存储节点)上。
你可以通过调整冗余程度,在可靠性和空间效率之间取得平衡。-
特点:
空间利用率高: 相比简单复制,可用更少的冗余空间实现相似级别的数据保护;
容错配置灵活: 通过管理员设定允许缺失的 Brick 数量,在一定范围内保证数据恢复;
抗故障能力: 即使部分 Brick 失效,只要剩余片段足够,即可重建原始文件。
2.4.1 分散型卷示例原理
文件(如 FileC)被编码成多个数据片段,每个 Brick 存储其中一个片段;
只需部分片段(如 70% 的片段)就可重构原始文件,容忍一定数量的 Brick 失效。
主要特点:
通过纠删码技术实现数据保护,节省冗余存储空间;
允许管理员配置容错级别,决定最多允许缺失多少个 Brick;
对于大规模存储环境尤其适用,但重建数据时可能会消耗一定的计算资源。
2.4.2 区别于复制节点说明
(1)冗余与可用空间
创建卷时会指定一个 冗余值(redundancy),表示最多能容忍多少个 brick 故障而不影响使用。
可用空间计算公式为:
可用容量=单个 Brick 容量×(Brick 总数−冗余数)
示例:
(2)容量与安全性权衡
Brick 多时,冗余 1 占比小,空间利用率高;
但同时系统风险增大,因为任意两个 brick 故障就会崩溃,概率更高。
所以:越少节点、越高冗余 ⇒ 更安全,但代价是空间利用率低。
(3)为什么不能设置冗余大于容量一半
因为若冗余达到一半,相当于副本卷(如 replica-2),此时直接使用 replica 会更高效。
纠删码不适合“高冗余低 brick 数”的场景。
(4)性能瓶颈:RMW 问题(Read-Modify-Write)
纠删码是按固定大小的块(block)处理的。
当写入的不是完整块(如写 1KB,但块是 2KB),需要:读取原始数据->合并新数据->重新编码->写回。
这就叫 RMW(读-改-写)循环,会造成延迟,降低性能。
(5)条带大小(Stripe size)与优化配置
条带大小影响性能,特别是数据库、虚拟机等以 2 的幂为单位写入的场景。
所以推荐选择
(bricks - redundancy)
为 2 的幂的配置,比如:
总结特点:
Dispersed 卷通过纠删码实现“低成本冗余”,比副本方式更节省空间。
冗余数越大 ⇒ 空间越少,但容错能力越强。
RMW 是性能瓶颈,要避免频繁小写入操作。
选择使 Stripe Size 为 2 的幂的配置会获得更佳性能。
2.4.3 创建分散型卷
语法
# gluster volume create [disperse [<count>]] [redundancy <count>] [transport tcp]
// 可以通过指定 disperse set,通过指定 redundancy brick 的数量,或同时指定两者。
// 如果未指定 disperse,或者缺少 <count>,则 整个体积将被视为由所有 bricks 中列举的。
// 如果未指定 redundancy,则会自动将其计算为 最优值。如果此值不存在,则假定为 '1' 和 显示警告消息:
# gluster volume create test-volume disperse 4 server{1..4}:/bricks/test-volume
There isn't an optimal redundancy value for this configuration. Do you want to create the volume with redundancy 1 ? (y/n)
// 在自动计算冗余的所有情况下,它不是等于 '1',则会显示一条警告消息:
# gluster volume create test-volume disperse 6 server{1..6}:/bricks/test-volume
The optimal redundancy for this configuration is 2. Do you want to create the volume with this value ? (y/n)
注意:redundancy 必须大于 0,并且 brick 的总数必须大于 2 * redundancy。这意味着分散的卷必须至少有 3 存储块。
2.5 分布式分散型卷(Distributed Dispersed Volume)
分布式分散型卷等效于分布式复制卷,但是使用的分散的子卷而不是复制卷,既具备分布式扩展能力,又利用纠删码实现数据高效保护。
特点:
存储扩展: 文件分布于多个分散子卷,易于横向扩展;
高可靠性: 采用纠删码技术,即便部分 Brick 失效也能恢复数据;
读取性能优势: 在多数环境下,分布式布局能提升读取速度,同时保持数据完整性。
2.5.1 分布式分散型卷示例原理
文件(例如 FileD)经过纠删码处理后,其编码片段分布在多个分散型子卷中;
每个子卷内部采用纠删码方式存储,整体架构既保证数据冗余也便于扩展。
主要特点:
综合了分布式卷和分散型卷的优点;
支持大规模存储扩展和高可靠性要求;
在一定条件下可实现比纯复制方式更优的存储空间利用率和读取性能;
管理上需要同时考虑数据分布策略和纠删码配置。
2.5.2 创建分布式分散型卷
语法
# gluster volume create disperse <count> [redundancy <count>] [transport tcp]
冗余参数等同于分散卷配置
// 对于分布式分散卷,如果块数据不同的子卷,则可以托管到同一个节点上
# gluster volume create <volname> disperse 3 server1:/br1 server2:/br1 server3:/br1 server1:/br2 server2:/br2 server3:/br2
3. 安装部署GlusterFS
3.1 节点主机安装部署
下载软件包:
yum install centos-release-gluster -y
安装资源包
yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
启动服务:
systemctl start glusterd.service
设置开启启动:
systemctl enable glusterd.service
3.2 管理员常用配置命令
3.2.1 节点管理
添加节点到信用池中:
gluster peer probe node1
查看集群状态:
gluster peer status
3.2.2 存储卷管理
注意:必须要在创建存储后启动存储卷,否则客户端会一直显示挂载中
启动存储卷:
# gluster volume start <VOLNAME> [force]
// 示例:
# gluster volume start test-volume
Starting test-volume has been successful
查看卷详细信息:
gluster volume info dis-volume
查看所有卷列表:
gluster volume list
挂载存储卷:
① 手动挂载测试:mount -t glusterfs node1:dis-volume /test/dis
② 设置/etc/fstab
自动挂载,然后自动挂载mount -a
:
<主机名>:<卷名> <挂载点> glusterfs <挂载选项> 0 0
node1:dis-volume /test/dis glusterfs defaults,_netdev 0 0
停止一个存储卷:
gluster volume stop dis-stripe
删除一个存储卷(删除前必须停止):
gluster volume delete dis-stripe
3.2.3 设置存储卷访问权限
设置白名单(仅接受):
gluster volume set dis-rep auth.allow 192.168.23.104
设置黑名单(仅拒绝)
gluster volume set rep-volume auth.reject 192.168.23.104
3.2.4 拓展或删除存储卷
如果节点未加入,则先加入节点:
gluster peer probe <SERVERNAME>
手动加入对应节点存储块:
gluster volume add-brick <VOLNAME> <NEW-BRICK
,例如:gluster volume add-brick test-volume server4:/exp4
手动删除对应节点存储块
gluster volume remove-brick <VOLNAME> <BRICKNAME> start
,例如:gluster volume remove-brick test-volume server2:/exp2 start
查看修改状态(可选):
gluster volume remove-brick <VOLNAME> <BRICKNAME> status
必须进行rebalance命令:
gluster volume rebalance rep-volume start
3.2.5 替换损坏的存储块
用一个空的分布式存储块替换坏掉的存储块(必须要有冗余)
注意:replace-brick 命令仅支持分布式存储块,必须要有副本的分布式存储块
实例:如何替换掉旧的Server1:/home/gfs/r2_1
成新的Server1:/home/gfs/r2_2
首先加入新的存储块:
gluster volume add-brick r2 Server1:/home/gfs/r2_2
移除坏掉的存储块:
gluster volume remove-brick r2 Server1:/home/gfs/r2_1 start
等待并查看移除状态:
gluster volume remove-brick r2 Server1:/home/gfs/r2_1 status
确认并移除存储块:
gluster volume remove-brick r2 Server1:/home/gfs/r2_1 commit
额外替换存储块命令:gluster volume replace-brick r2 Server1:/home/gfs/r2_0 Server1:/home/gfs/r2_5
3.2.6 重平衡模式说明
轻量级重平衡(不移动原有文件):
gluster volume rebalance <VOLNAME> fix-layout start
重量级重平衡(迁移原有文件数据):
gluster volume rebalance <VOLNAME> start
强制重平衡:
gluster volume rebalance <VOLNAME> start force
查看重平衡状态:
gluster volume rebalance <VOLNAME> status
更多快照创建功能以及错误检测可以参考: