GlusterFS-分布式文件系统
GlusterFS 概述
GlusterFS是一个完全开源、无中心设计的分布式文件系统,旨在构建大规模、弹性扩展、高性能的存储解决方案。它将多个物理存储设备汇聚成一个巨大的、虚拟的、全局统一命名空间的存储池,使得数据可以在整个集群中透明地分布和共享。
作为Scale-Out(横向扩展)存储解决方案的核心,GlusterFS在存储数据方面具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。它支持借助TCP/IP或InfiniBandRDMA网络将物理分散分布的存储资源汇聚在一起,统一提供存储服务。通过扩展不同的节点可以支持PB级别的存储容量。
与传统分布式文件系统不同,GlusterFS没有元数据服务器组件,这有助于提升整个系统的性能、可靠性和稳定性。传统的分布式文件系统大多通过元服务器来存储元数据,这样的设计在浏览目录时效率高,但是存在单点故障的缺陷。而GlusterFS基于无元服务器的设计,数据横向扩展能力强,具备较高的可靠性及存储效率。
graph TD
A[GlusterFS是什么?]
style A fill:#F9A825,stroke:#333,stroke-width:2px
classDef feature fill:#fff,stroke:#666,stroke-width:1px,stroke-dasharray:5 5
B[集群NAS]
C[高性能]
D[无中心架构]
E[Cloud Storage]
F[分布式文件系统]
G[标准硬件]
H[POSIX]
I[自修复]
J[自动复制]
K[InfiniBand]
L[全局统一命名空间]
M[高可用]
class B,C,D,E,F,G,H,I,J,K,L,M feature
%% 关键修正:添加虚拟连接点并分组布局
A--->B
A--->C
A--->D
A--->E
A--->F
A--->G
A--->H
A--->I
A--->J
A--->K
A--->L
A--->M
linkStyle 0,1,2,3,4,5,6,7,8,9,10,11 stroke-width:0pxGlusterFS 特点
可扩展性和高性能
- 横向扩展:能够通过简单地增加存储节点的方式来提高存储容量和性能(磁盘、计算和I/O资源都可以独立增加),支持10GbE和InfiniBand等高速网络互联
- 高性能:通过分布式并行处理I/O请求,优化了读写性能,特别是针对大数据集的读取操作,通过条带化、镜像和分布式复制等存储策略,可以大幅提升数据访问效率
高可用性
- 无单点故障:没有中央元数据服务器,而是通过分布式元数据管理来避免单点故障
- 冗余和自动恢复:支持多种数据保护模式,包括复制、分布式复制和奇偶校验等,能够在节点故障时迅速恢复数据服务
全局统一命名空间
提供了一个全局的、统一的文件命名空间,使得用户可以从单一入口点访问整个集群内的所有文件,简化了数据管理
弹性卷管理
灵活的存储卷管理机制允许管理员根据业务需求调整存储策略,比如增加或减少冗余级别,或者动态地向现有卷添加新存储节点
弹性哈希算法
使用弹性的哈希算法将数据分布在整个集群中,确保数据分布的均衡和高效定位
标准协议支持
支持行业标准的网络协议,例如NFS、SMB/CIFS、HTTP/REST等,使得不同操作系统和应用程序都能够方便地访问存储资源
POSIX兼容性
兼容POSIX标准,使得大多数符合POSIX要求的应用程序可以直接在GlusterFS之上运行
用户空间设计
利用用户空间的FUSE(Filesystem in Userspace)技术,使得系统设计更加灵活,能够快速迭代和改进
GlusterFS 存储架构
Brick(存储块)
- 定义:GlusterFS 的基本物理存储单元,对应存储节点上的一个本地目录(如
/data/brick1),由底层文件系统(如 XFS、EXT4)管理。 - 功能:
- 实际存储文件数据分片或完整文件(取决于卷类型)。
- 通过格式
SERVER:EXPORT(如192.168.1.4:/data/brick1)标识。
- 特性:
- 无专用硬件依赖,支持标准磁盘设备。
Volume(逻辑卷)
- 定义:由多个 Brick 聚合而成的逻辑存储单元,提供统一的命名空间。
- 功能:
- 定义数据分布策略(如复制、条带、分散)。
- 支持动态扩展(在线添加/移除 Brick)。
- 卷类型示例:
- 分布式卷:文件级分布,无冗余(类似 RAID0)。
- 复制卷:文件全量复制,高可用(类似 RAID1)。
- 分散卷:纠删码冗余(如 10+3 模式),高效存储。
Client(客户端)
- 核心模块:
- FUSE(用户空间文件系统):通过内核模块挂载 GlusterFS 卷,提供 POSIX 兼容接口。
- libgfapi:原生 API 库,支持直接 I/O 操作(绕过 FUSE)。
- 智能特性:
- 缓存卷配置信息,通过弹性哈希算法直接定位数据所在 Brick,无需元数据服务器。
- 支持并行读写(如条带卷分块处理)。
服务端守护进程
- glusterd:
- 角色:集群管理进程,运行于每个节点。
- 功能:
- 节点对等(
gluster peer probe)构建可信存储池(Trusted Storage Pool)。 - 卷生命周期管理(创建/启动/停止/扩容)。
- 配置同步至所有节点与客户端。
- 节点对等(
- glusterfsd:
- 角色:数据服务进程,处理客户端 I/O 请求。
- 功能:
- 根据卷策略(如复制、条带)操作 Brick 数据。
- 支持 TCP/RDMA 传输协议优化网络性能。
Translator(转换器)
- 定位:GlusterFS 的模块化功能引擎,以堆栈形式组合实现复杂逻辑。
- 核心模块:
- Distribute:实现分布式卷的文件哈希定位。
- Replicate:实现复制卷的同步写入。
- Stripe:实现条带卷的分块存储。
- Self-Heal:自动修复副本数据不一致。
- 工作流程:I/O 请求按顺序通过 Translator 堆栈处理(如
Client → Replicate → Distribute → Brick)。
弹性哈希算法(Elastic Hash)
- 核心机制:
- 根据文件名计算 32 位哈希值,映射到 Brick 组成的哈希环,直接定位数据存储位置。
- 优势:
- 消除元数据服务器瓶颈,避免单点故障。
- 数据均匀分布,支持动态扩容(新增 Brick 自动重平衡)。
辅助组件
- 仲裁器(Arbiter):
- 解决复制卷的脑裂问题(如 3 副本卷中设置仲裁节点)。
- 地域复制(Geo-Replication):
- 跨数据中心异步同步数据,支持灾难恢复。
组件协作关系
graph LR
A[Client] -- FUSE/libgfapi --> B(Translator堆栈)
B -- 弹性哈希定位 --> C[glusterfsd]
C -- 读写操作 --> D[Brick]
E[glusterd] <--> F[节点管理]
E <--> G[卷配置同步]
F <--> H[可信存储池]GlusterFS 工作原理
GlusterFS的工作流程如下:
- 客户端访问数据:客户端或应用程序通过GlusterFS的挂载点访问数据,就像访问常规的本地文件系统一样
- 操作系统内核处理:当客户端操作系统接收到应用程序的I/O请求时,它通过VFS层处理这个请求。如果是Linux系统,客户端通常通过FUSE内核模块或内建的Kernel Module
- GlusterFS客户端处理:
- GlusterFS客户端负责将操作系统传递来的I/O请求转换为对GlusterFS服务端的调用
- 客户端使用GlusterFS的API与集群中的各个节点进行通信,确定数据的位置
- 根据GlusterFS的卷配置和弹性HASH算法,客户端计算出数据应该存储或读取的brick(存储节点)
- 数据传输:客户端通过网络将请求发送到对应的brick节点。brick节点接收到请求后,通过VFS接口,在本地文件系统上执行相应的读写操作
- 卷类型影响的处理方式:根据卷的类型(如分布式卷、复制卷、条带卷、分布式复制卷等),请求的处理方式会有所不同
- 返回结果:brick完成操作后,将结果通过网络传回给客户端。客户端再将处理结果反馈给操作系统,进而由操作系统通知应用程序
graph TD
A[客户端/应用程序] -->|1. 发起I/O请求<br>(读/写/删除)| B[操作系统内核]
B -->|2. VFS层处理请求| C[FUSE模块]
C -->|3. 通过/dev/fuse转发| D[GlusterFS客户端]
D -->|4.1 解析卷配置| E[弹性哈希算法]
D -->|4.2 定位目标Brick| F[卷类型策略]
E -->|4.1.1 计算文件哈希值| F
F -->|5.1 分布式卷:单节点写入| G[网络传输层]
F -->|5.2 复制卷:同步多副本| G
F -->|5.3 条带卷:分块写入| G
G -->|6. TCP/IP或RDMA协议| H[Brick服务端]
H -->|7.1 VFS接口处理| I[本地文件系统]
I -->|7.2 执行磁盘操作| J((存储设备))
J -->|8. 返回操作结果| H
H -->|9. 聚合副本响应| G
G -->|10. 返回数据/状态| D
D -->|11. 反馈内核| C
C -->|12. 返回应用| A
classDef process fill:#e6f7ff,stroke:#3498db,stroke-width:2px;
classDef storage fill:#e8f5e9,stroke:#4CAF50,stroke-width:2px;
classDef network fill:#fff8e1,stroke:#FFC107,stroke-width:2px;
class A,B,C,D,E,F,H,I process;
class J storage;
class G network;弹性HASH算法
弹性HASH算法是Davies-Meyer算法的具体实现,通过HASH算法可以得到一个32位的整数范围的hash值。假设逻辑卷中有N个存储单位Brick,则32位的整数范围将被划分为N个连续的子空间,每个空间对应一个Brick。当用户或应用程序访问某一个命名空间时,通过对该命名空间计算HASH值,根据该HASH值所对应的32位整数空间定位数据所在的Brick。
弹性HASH算法的优点:
- 保证数据平均分布在每一个Brick中
- 解决了对元数据服务器的依赖,进而解决了单点故障以及访问瓶颈
GlusterFS 卷的类型
GlusterFS支持七种卷类型,可以满足不同应用对高性能、高可用的需求:
分布式卷
- 特点:文件通过HASH算法分布到所有Brick Server上,是GlusterFS的默认卷类型
- 优点:更容易和廉价地扩展卷的大小
- 缺点:不具备冗余性,单点故障会造成数据丢失
- 创建命令:bash
gluster volume create dis-volume server1:/dir1 server2:/dir2 server3:/dir3 - 适用场景:当不需要数据冗余时,可以用于存储大量的非关键数据
条带卷
- 特点:类似RAID0,文件被分成数据块并以轮询的方式分布到多个BrickServer上
- 优点:支持大文件存储,文件越大,读取效率越高
- 缺点:不具备冗余性
- 创建命令:bash
gluster volume create stripe-volume stripe 2 transport tcp server1:/dir1 server2:/dir2 - 适用场景:需要高带宽和并行读写性能的场景,如流媒体服务、大数据分析等
复制卷
- 特点:将文件同步到多个Brick上,使其具备多个文件副本,属于文件级RAID1
- 优点:具有容错能力,即使一个节点损坏,也不影响数据的正常使用
- 缺点:磁盘利用率较低
- 创建命令:bash
gluster volume create rep-volume replica 2 transport tcp server1:/dir1 server2:/dir2 - 适用场景:需要高可用性和数据安全性的场景,如数据库和关键业务系统
分布式条带卷
- 特点:BrickServer数量是条带数的倍数,兼具分布式卷和条带卷的特点
- 优点:可以获得更好的性能和一定的扩展性
- 缺点:不自带冗余
- 创建命令:bash
gluster volume create dis-stripe stripe 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4 - 适用场景:分布式条带卷通常适用于对性能要求很高,同时可以接受较低冗余度的应用环境
分布式复制卷
- 特点:Brick Server数量是镜像数的倍数,兼具分布式卷和复制卷的特点
- 优点:提供分布式存储的同时还保证数据的冗余
- 创建命令:bash
gluster volume create dis-rep replica 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4 - 适用场景:既要扩展存储容量又要保证数据冗余的复杂环境
条带复制卷
- 特点:类似RAID10,同时具有条带卷和复制卷的特点
- 优点:既能实现数据条带化以提高性能,又能做到数据的冗余备份
分布式条带复制卷
- 特点:三种基本卷的复合卷
- 适用场景:通常用于类MapReduce应用
Gluster 部署
环境准备
| 系统类型 | 配置 | 磁盘 | IP地址 | 主机名 | 所需软件 |
|---|---|---|---|---|---|
| openEuler 24.03(LTS) | 2C4G | 500GB | 192.168.148.120 | gfs-data01 | glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma |
| openEuler 24.03(LTS) | 2C4G | 500GB | 192.168.148.121 | gfs-data02 | glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma |
| openEuler 24.03(LTS) | 2C4G | 500GB | 192.168.148.122 | gfs-data03 | glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma |
| openEuler 24.03(LTS) | 1C2G | - | 192.168.148.123 | gfs-client | glusterfs glusterfs-fuse |
部署步骤
- 配置主机之间的解析(在此所有主机配置相同,在此只列举data1节点的配置);
- 在所有data节点上安装GlusterFS(在此所有主机配置相同,在此只列举data1节点的配置);
- 在data1节点上进行创建集群,其他节点会同步配置;
- 在多个data节点创建数据存储的位置;
- 在data1节点创建数据存储的卷(复制卷),其他节点会同步配置;
- 在client客户端节点上安装gluster客户端工具并测试挂载;
- client客户端节点测试存放文件;
- 扩展:Gluster的管理命令;
配置主机之间的解析(所有主机)
cat >> /etc/hosts << EOF
192.168.148.120 gfs-data01
192.168.148.121 gfs-data02
192.168.148.122 gfs-data03
192.168.148.123 gfs-client
EOF
# 测试
ping gfs-data01 -c 2磁盘格式化
所有data节点执行
# XFS格式化
parted
# 为每个节点添加存储磁盘(如 /dev/sda、/dev/sdb),分区并格式化为 XFS 文件系统:
mkfs.xfs /dev/sdb1
# 创建挂载目录并配置永久挂载(编辑 /etc/fstab)
mkdir -p /data
echo "/dev/sdb1 /data xfs defaults 0 0" >> /etc/fstab
mount -a安装GlusterFS
所有data节点执行
dnf -y install glusterfs glusterfs-server glusterfs-fuse
# 启动服务
systemctl start glusterd
# 开机自启
systemctl enable glusterd
# 检测进程
ps -aux | grep glusterd创建集群
在data1节点上进行创建集群
# 添加节点1
gluster peer probe gfs-data01
# 添加节点2
gluster peer probe gfs-data02
# 添加节点3
gluster peer probe gfs-data03
# 查看集群状态
gluster peer status存储卷配置
# 所有data节点执行
mkdir -p /data/gfs-volume
# 查看存储卷信息
gluster volume info
# 创建存储卷(任意data节点执行)
gluster volume create gfs-volume replica 3 \
gfs-data01:/data/gfs-volume \
gfs-data02:/data/gfs-volume \
gfs-data03:/data/gfs-volume \
force
# 启动卷
gluster volume start gfs-volume客户端测试
安装软件
dnf install glusterfs-client -y挂载gfs
mkdir /data
echo 'gfs-data01:/rep-volume /data glusterfs defaults,_netdev 0 0' >> /etc/fstab
mount -a验证挂载
df -Th
touch /data/{1..10}.txt
# 到data节点查看是否生成gluster 常用命令
集群管理命令
| 命令 | 功能 | 示例 |
|---|---|---|
gluster peer probe | 添加节点到集群 | gluster peer probe node02 |
gluster peer detach | 从集群移除节点 | gluster peer detach node03 |
gluster peer status | 查看集群节点状态 | gluster peer status |
gluster pool list | 显示存储池信息 | gluster pool list |
卷管理命令
| 命令 | 功能 | 示例 |
|---|---|---|
gluster volume create | 创建新卷 | gluster volume create vol1 replica 2 node1:/brick1 node2:/brick2 |
gluster volume start | 启动卷 | gluster volume start vol1 |
gluster volume stop | 停止卷 | gluster volume stop vol1 --mode=script |
gluster volume delete | 删除卷 | gluster volume delete vol1 |
gluster volume info | 查看卷信息 | gluster volume info vol1 |
gluster volume status | 查看卷状态 | gluster volume status vol1 detail |
gluster volume list | 列出所有卷 | gluster volume list |
gluster volume add-brick | 添加存储块 | gluster volume add-brick vol1 node3:/brick3 |
gluster volume remove-brick | 移除存储块 | gluster volume remove-brick vol1 node3:/brick3 start |
gluster volume replace-brick | 更换存储块 | gluster volume replace-brick vol1 node1:/old node1:/new commit |
卷配置命令
| 命令 | 功能 | 示例 |
|---|---|---|
gluster volume set | 配置卷参数 | gluster volume set vol1 performance.cache-size 2GB |
gluster volume reset | 重置卷配置 | gluster volume reset vol1 |
gluster volume get | 查看卷参数 | gluster volume get vol1 all |
gluster volume heal | 数据自愈管理 | gluster volume heal vol1 info |
gluster volume rebalance | 数据重平衡 | gluster volume rebalance vol1 start |
监控与诊断命令
| 命令 | 功能 | 示例 |
|---|---|---|
gluster volume profile | 性能分析 | gluster volume profile vol1 start |
gluster volume top | I/O操作监控 | gluster volume top vol1 open |
gluster volume statedump | 状态转储 | gluster volume statedump vol1 |
gluster volume sync | 同步卷配置 | gluster volume sync all |
gluster volume log | 日志位置查询 | grep vol1 /var/log/glusterfs/*.log |
高级管理命令
| 命令 | 功能 | 示例 |
|---|---|---|
gluster snapshot create | 创建快照 | gluster snapshot create snap1 vol1 |
gluster snapshot list | 列出快照 | gluster snapshot list |
gluster system:: execute | 执行系统命令 | gluster system:: execute "df -h" all |
gluster quota list | 配额管理 | gluster quota vol1 list /dir |
gluster geo-replication | 异地复制 | gluster geo-replication vol1 remote_host::vol2 start |
