1884 字
9 分钟
GlusterFS 分布式文件系统部署
1. 文件系统简介
文件系统由三部分组成:
- 接口:文件系统接口
- 功能模块:管理与存储工具的软件集合
- 对象及属性:使用该文件系统的消费者
它的作用是对存储设备空间进行组织和分配,负责文件的建立、存储、读出、修改、转储与访问控制。
除根文件系统外,其他文件系统必须挂载到挂载点后才可访问。挂载点就是分区设备文件关联的某个目录。GlusterFS 的远程使用本质上也是「挂载 + 文件类型 = glusterfs」。
2. GlusterFS 概述
2.1 它是什么
- 开源的分布式文件系统,由存储服务器、客户端、可选的 NFS/Samba 存储网关组成
- 没有元数据服务器:传统分布式文件系统的元服务器一旦故障,整个存储系统就崩了;GlusterFS 通过弹性哈希算法绕过这个单点
- 借助 TCP/IP 或 InfiniBand RDMA 网络,把分散的存储资源汇聚成统一命名空间
- 是 Scale-Out 存储方案 Gluster 的核心,可扩展到 PB 级容量、数千客户端
三大组件:
- 存储服务器(Brick Server)
- 客户端
- 存储网关(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具体步骤:
- 客户端通过挂载点访问数据
- Linux 内核 VFS API 收到请求
- VFS 把数据递交给 FUSE,FUSE 把数据通过
/dev/fuse设备文件交给 GlusterFS Client - Client 根据配置处理数据
- 通过网络传递给远端 Server,写入存储设备
4. 弹性 HASH 算法
弹性哈希基于 Davies-Meyer 算法实现,把哈希值划分到 32 位整数空间。假设有 N 个 Brick,则把整数范围划分成 N 个连续子空间,每个子空间对应一个 Brick。访问文件时计算其哈希值,定位到对应 Brick。
优点:
- 数据均匀分布到每个 Brick
- 消除对元数据服务器的依赖,避免单点故障和访问瓶颈
5. 卷类型对比
| 卷类型 | 特点 | 类比 |
|---|---|---|
| 分布式卷(Distribute) | 文件按 HASH 分布到不同 Brick,不分块,无冗余 | 类 RAID 0(文件级) |
| 条带卷(Stripe) | 文件按偏移量分成 N 块轮询存到 Brick,无冗余 | RAID 0 |
| 复制卷(Replica) | 文件同步到多个 Brick,有副本 | RAID 1 |
| 分布式条带卷 | 兼顾分布与条带,至少 4 台 | RAID 0+0 扩展 |
| 分布式复制卷 | 兼顾分布与冗余 | 常用生产组合 |
| 条带复制卷 | 同时具备条带与复制 | RAID 10 |
| 分布式条带复制卷 | 三种基本卷复合,常用于 MapReduce | 综合最强 |
创建命令模板:
# 分布式卷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:/dir46. 集群部署
演示用双节点(node1/node2),实际生产建议至少四节点。
6.1 环境准备(所有节点)
扫描新增硬盘:
$ echo "- - -" > /sys/class/scsi_host/host0/scan$ echo "- - -" > /sys/class/scsi_host/host1/scan$ echo "- - -" > /sys/class/scsi_host/host2/scan关闭防火墙和 SELinux:
$ systemctl stop firewalld && systemctl disable firewalld$ setenforce 0$ sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config6.2 批量初始化磁盘
编写自动分区脚本:
$ vi fdisk.sh#!/bin/bashNEWDEV=`ls /dev/sd* | grep -o 'sd[b-z]' | uniq`for VAR in $NEWDEVdo 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/fstabdonemount -a &> /dev/null执行并验证:
$ chmod +x fdisk.sh && ./fdisk.sh$ df -h6.3 主机解析
$ cat >> /etc/hosts <<EOF192.168.190.104 node1192.168.190.105 node2EOF6.4 安装 GlusterFS(离线方式)
这里的
Gluster.tar.gz是预先打包好的离线 RPM 仓库目录。如何把任意 yum 包打包成这样的离线仓库,见 [[posts/centos-local-yum-repo/index.md]]。
$ tar zxvf Gluster.tar.gz -C /opt/$ mv /etc/yum.repos.d/CentOS-* /media/$ cat >> /etc/yum.repos.d/gluster.repo <<EOF[gluster]name=glusterbaseurl=file:///opt/glustergpgcheck=0enabled=1EOF$ yum clean all && yum makecache$ yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma$ systemctl enable --now glusterd6.5 组建信任池(任一节点执行)
$ gluster peer probe node2$ gluster peer status7. 创建各类卷
规划:
| 卷名称 | 类型 | 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。以分布式卷为例:
$ 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 安装客户端
$ yum -y install glusterfs glusterfs-fuse$ mkdir -p /test/{dis,stripe,rep,dis_stripe,dis_rep}8.2 挂载
# 临时挂载$ 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 0node1:stripe-volume /test/stripe glusterfs defaults,_netdev 0 0node1:rep-volume /test/rep glusterfs defaults,_netdev 0 0node1:dis-stripe /test/dis_stripe glusterfs defaults,_netdev 0 0node1:dis-rep /test/dis_rep glusterfs defaults,_netdev 0 0
_netdev选项告诉系统这是网络文件系统,开机时等网络就绪再挂载。
8.3 写入测试文件
$ 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 故障:
[root@node2 ~]# systemctl stop glusterd# 或直接 init 0在客户端验证:
| 卷类型 | 现象 | 原因 |
|---|---|---|
| 分布式卷 | 少了部分文件 | 文件按 HASH 分布,丢节点丢文件 |
| 条带卷 | 数据全没 | 文件分块存放,节点缺失即不可读 |
| 复制卷 | 数据正常 | 有副本 |
| 分布式条带卷 | 数据缺失 | 不具备冗余 |
| 分布式复制卷 | 数据正常 | 有副本 |
结论:生产环境优先选择复制卷或分布式复制卷,纯条带和纯分布式不具备容错能力。
10. 常用维护命令
# 查看gluster volume list # 列出所有卷gluster volume info # 所有卷详细信息gluster volume status # 所有卷运行状态
# 停止与删除(删除前必须先停,且信任池中无宕机节点)gluster volume stop dis-stripegluster volume delete dis-stripe
# 访问控制gluster volume set dis-rep auth.deny 192.168.190.100 # 拒绝单 IPgluster volume set dis-rep auth.allow 192.168.190.* # 允许网段11. 小结
- 无元数据服务器是 GlusterFS 区别于传统分布式文件系统的关键设计,避免单点故障
- 弹性哈希算法让客户端可以直接定位 Brick,不需要查询索引
- 卷类型选择:要容量选分布式,要性能选条带,要可靠选复制;生产常用「分布式复制卷」
- 破坏性测试是验收必备项,能直观验证冗余能力
GlusterFS 分布式文件系统部署
https://blog.xeu.asia/posts/glusterfs-distributed-fs/