1884 字
9 分钟
GlusterFS 分布式文件系统部署

1. 文件系统简介#

文件系统由三部分组成:

  • 接口:文件系统接口
  • 功能模块:管理与存储工具的软件集合
  • 对象及属性:使用该文件系统的消费者

它的作用是对存储设备空间进行组织和分配,负责文件的建立、存储、读出、修改、转储与访问控制。

除根文件系统外,其他文件系统必须挂载到挂载点后才可访问。挂载点就是分区设备文件关联的某个目录。GlusterFS 的远程使用本质上也是「挂载 + 文件类型 = glusterfs」。

2. GlusterFS 概述#

2.1 它是什么#

  • 开源的分布式文件系统,由存储服务器、客户端、可选的 NFS/Samba 存储网关组成
  • 没有元数据服务器:传统分布式文件系统的元服务器一旦故障,整个存储系统就崩了;GlusterFS 通过弹性哈希算法绕过这个单点
  • 借助 TCP/IP 或 InfiniBand RDMA 网络,把分散的存储资源汇聚成统一命名空间
  • 是 Scale-Out 存储方案 Gluster 的核心,可扩展到 PB 级容量、数千客户端

三大组件:

  1. 存储服务器(Brick Server)
  2. 客户端
  3. 存储网关(NFS / Samba)

2.2 核心特性#

特性说明
扩展性与性能Scale-Out 架构,弹性哈希算法消除元数据依赖,支持 10GbE / InfiniBand
高可用自动复制(镜像/多副本),自愈以增量方式在后台进行
全局统一命名空间多节点的存储容量整合为一个大虚拟池
弹性卷管理逻辑卷可在线增减、负载均衡,配置实时生效
基于标准协议支持 NFS、CIFS、HTTP、FTP、SMB、原生协议,兼容 POSIX

2.3 关键术语#

术语含义
Brick实际存储数据的服务器目录,格式:SERVER:EXPORT,如 192.168.79.210:/data/mydir
Volume(卷)一组 Brick 的集合,类似 LVM 的逻辑卷,大部分操作针对卷
FUSE用户空间文件系统,内核模块,允许用户态创建文件系统
VFS内核态虚拟文件系统,向用户空间提供磁盘访问接口
Glusterd运行在每个存储节点上的后台管理进程

3. 工作流程#

客户端 → VFS → FUSE → /dev/fuse → GlusterFS Client → 网络 → GlusterFS Server → Brick

具体步骤:

  1. 客户端通过挂载点访问数据
  2. Linux 内核 VFS API 收到请求
  3. VFS 把数据递交给 FUSE,FUSE 把数据通过 /dev/fuse 设备文件交给 GlusterFS Client
  4. Client 根据配置处理数据
  5. 通过网络传递给远端 Server,写入存储设备

4. 弹性 HASH 算法#

弹性哈希基于 Davies-Meyer 算法实现,把哈希值划分到 32 位整数空间。假设有 N 个 Brick,则把整数范围划分成 N 个连续子空间,每个子空间对应一个 Brick。访问文件时计算其哈希值,定位到对应 Brick。

优点

  1. 数据均匀分布到每个 Brick
  2. 消除对元数据服务器的依赖,避免单点故障和访问瓶颈

5. 卷类型对比#

卷类型特点类比
分布式卷(Distribute)文件按 HASH 分布到不同 Brick,不分块,无冗余类 RAID 0(文件级)
条带卷(Stripe)文件按偏移量分成 N 块轮询存到 Brick,无冗余RAID 0
复制卷(Replica)文件同步到多个 Brick,有副本RAID 1
分布式条带卷兼顾分布与条带,至少 4 台RAID 0+0 扩展
分布式复制卷兼顾分布与冗余常用生产组合
条带复制卷同时具备条带与复制RAID 10
分布式条带复制卷三种基本卷复合,常用于 MapReduce综合最强

创建命令模板:

Terminal window
# 分布式卷
gluster volume create dis-volume server1:/dir1 server2:/dir2 server3:/dir3
# 条带卷
gluster volume create stripe-volume stripe 2 transport tcp server1:/dir1 server2:/dir2
# 复制卷
gluster volume create rep-volume replica 2 transport tcp server1:/dir1 server2:/dir2
# 分布式条带卷(Brick 数必须是条带数的倍数)
gluster volume create dis-stripe stripe 2 transport tcp \
server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4
# 分布式复制卷
gluster volume create dis-rep replica 2 transport tcp \
server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4

6. 集群部署#

演示用双节点(node1/node2),实际生产建议至少四节点。

6.1 环境准备(所有节点)#

扫描新增硬盘:

Terminal window
$ echo "- - -" > /sys/class/scsi_host/host0/scan
$ echo "- - -" > /sys/class/scsi_host/host1/scan
$ echo "- - -" > /sys/class/scsi_host/host2/scan

关闭防火墙和 SELinux:

Terminal window
$ systemctl stop firewalld && systemctl disable firewalld
$ setenforce 0
$ sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

6.2 批量初始化磁盘#

编写自动分区脚本:

Terminal window
$ vi fdisk.sh
#!/bin/bash
NEWDEV=`ls /dev/sd* | grep -o 'sd[b-z]' | uniq`
for VAR in $NEWDEV
do
echo -e "n\np\n\n\n\nw\n" | fdisk /dev/$VAR &> /dev/null
mkfs.xfs /dev/${VAR}"1" &> /dev/null
mkdir -p /data/${VAR}"1" &> /dev/null
echo "/dev/${VAR}1 /data/${VAR}1 xfs defaults 0 0" >> /etc/fstab
done
mount -a &> /dev/null

执行并验证:

Terminal window
$ chmod +x fdisk.sh && ./fdisk.sh
$ df -h

6.3 主机解析#

Terminal window
$ cat >> /etc/hosts <<EOF
192.168.190.104 node1
192.168.190.105 node2
EOF

6.4 安装 GlusterFS(离线方式)#

这里的 Gluster.tar.gz 是预先打包好的离线 RPM 仓库目录。如何把任意 yum 包打包成这样的离线仓库,见 [[posts/centos-local-yum-repo/index.md]]。

Terminal window
$ tar zxvf Gluster.tar.gz -C /opt/
$ mv /etc/yum.repos.d/CentOS-* /media/
$ cat >> /etc/yum.repos.d/gluster.repo <<EOF
[gluster]
name=gluster
baseurl=file:///opt/gluster
gpgcheck=0
enabled=1
EOF
$ yum clean all && yum makecache
$ yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
$ systemctl enable --now glusterd

6.5 组建信任池(任一节点执行)#

Terminal window
$ gluster peer probe node2
$ gluster peer status

7. 创建各类卷#

规划:

卷名称类型Brick
dis-volume分布式卷node1(/data/sdb1)、node2(/data/sdb1)
stripe-volume条带卷node1(/data/sdc1)、node2(/data/sdc1)
rep-volume复制卷node3(/data/sdb1)、node4(/data/sdb1)
dis-stripe分布式条带卷四节点 /data/sdd1
dis-rep分布式复制卷四节点 /data/sde1

通用流程:create → start → info。以分布式卷为例:

Terminal window
$ gluster volume create dis-volume node1:/data/sdb1 node2:/data/sdb1 force
$ gluster volume start dis-volume
$ gluster volume info dis-volume

其余卷参考第 5 节模板。

8. 客户端挂载与测试#

8.1 安装客户端#

Terminal window
$ yum -y install glusterfs glusterfs-fuse
$ mkdir -p /test/{dis,stripe,rep,dis_stripe,dis_rep}

8.2 挂载#

Terminal window
# 临时挂载
$ mount.glusterfs node1:dis-volume /test/dis
$ mount.glusterfs node1:stripe-volume /test/stripe
$ mount.glusterfs node1:rep-volume /test/rep
$ mount.glusterfs node1:dis-stripe /test/dis_stripe
$ mount.glusterfs node1:dis-rep /test/dis_rep
# 永久挂载(写入 /etc/fstab)
node1:dis-volume /test/dis glusterfs defaults,_netdev 0 0
node1:stripe-volume /test/stripe glusterfs defaults,_netdev 0 0
node1:rep-volume /test/rep glusterfs defaults,_netdev 0 0
node1:dis-stripe /test/dis_stripe glusterfs defaults,_netdev 0 0
node1:dis-rep /test/dis_rep glusterfs defaults,_netdev 0 0

_netdev 选项告诉系统这是网络文件系统,开机时等网络就绪再挂载。

8.3 写入测试文件#

Terminal window
$ for i in {1..5}; do dd if=/dev/zero of=/opt/demo${i}.log bs=1M count=40; done
$ cp /opt/demo* /test/dis/
$ cp /opt/demo* /test/stripe/
$ cp /opt/demo* /test/rep/
$ cp /opt/demo* /test/dis_stripe/
$ cp /opt/demo* /test/dis_rep/

9. 破坏性测试#

模拟 node2 故障:

Terminal window
[root@node2 ~]# systemctl stop glusterd
# 或直接 init 0

在客户端验证:

卷类型现象原因
分布式卷少了部分文件文件按 HASH 分布,丢节点丢文件
条带卷数据全没文件分块存放,节点缺失即不可读
复制卷数据正常有副本
分布式条带卷数据缺失不具备冗余
分布式复制卷数据正常有副本

结论:生产环境优先选择复制卷分布式复制卷,纯条带和纯分布式不具备容错能力。

10. 常用维护命令#

Terminal window
# 查看
gluster volume list # 列出所有卷
gluster volume info # 所有卷详细信息
gluster volume status # 所有卷运行状态
# 停止与删除(删除前必须先停,且信任池中无宕机节点)
gluster volume stop dis-stripe
gluster volume delete dis-stripe
# 访问控制
gluster volume set dis-rep auth.deny 192.168.190.100 # 拒绝单 IP
gluster volume set dis-rep auth.allow 192.168.190.* # 允许网段

11. 小结#

  • 无元数据服务器是 GlusterFS 区别于传统分布式文件系统的关键设计,避免单点故障
  • 弹性哈希算法让客户端可以直接定位 Brick,不需要查询索引
  • 卷类型选择:要容量选分布式,要性能选条带,要可靠选复制;生产常用「分布式复制卷」
  • 破坏性测试是验收必备项,能直观验证冗余能力
GlusterFS 分布式文件系统部署
https://blog.xeu.asia/posts/glusterfs-distributed-fs/
作者
Xeu
发布于
2026-05-21
许可协议
CC BY-NC-SA 4.0