OpenEuler 24.03 GlusterFS 分布式文件系统超详细教程
一、环境准备(所有节点执行)
1.1 系统要求与节点规划
- 系统版本:openEuler 24.03 LTS(x86_64/arm64)
- 最低配置:2 核 4G 内存,每节点至少 1 块独立数据盘
- 网络要求:节点间网络互通,建议万兆网卡
- 示例节点规划:
表格
| 主机名 | IP 地址 | 数据盘 | 挂载点 |
|---|---|---|---|
| gluster-node1 | 192.168.1.101 | /dev/sdb | /data/brick1 |
| gluster-node2 | 192.168.1.102 | /dev/sdb | /data/brick1 |
| gluster-node3 | 192.168.1.103 | /dev/sdb | /data/brick1 |
1.2 系统初始化
设置主机名(对应节点执行)
bash
# 节点1
hostnamectl set-hostname gluster-node1
# 节点2
hostnamectl set-hostname gluster-node2
# 节点3
hostnamectl set-hostname gluster-node3
配置 hosts 解析
bash
cat >> /etc/hosts << EOF
192.168.1.101 gluster-node1
192.168.1.102 gluster-node2
192.168.1.103 gluster-node3
EOF
配置时间同步
bash
dnf install -y chrony
systemctl enable --now chronyd
chronyc sources
1.3 数据盘准备(关键!)
⚠️ 重要提示:GlusterFS 的 brick 必须挂载在独立的文件系统上,不能使用系统盘根目录!
bash
# 分区(如果磁盘未分区)
fdisk /dev/sdb
# 按n创建新分区,p主分区,默认回车,w保存
# 格式化为XFS(推荐)
mkfs.xfs /dev/sdb1
# 创建挂载点
mkdir -p /data/brick1
# 配置永久挂载
echo "/dev/sdb1 /data/brick1 xfs defaults 0 0" >> /etc/fstab
# 挂载并验证
mount -a
df -h /data/brick1
1.4 防火墙与 SELinux 配置
方法一:生产环境推荐(开放端口)
bash
# 开放GlusterFS所需端口
firewall-cmd --permanent --add-service=glusterfs
firewall-cmd --permanent --add-port=24007-24008/tcp
firewall-cmd --permanent --add-port=49152-49251/tcp
firewall-cmd --reload
# 验证端口
ss -ntlup | grep glusterd
方法二:测试环境(临时关闭)
bash
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 临时关闭SELinux
setenforce 0
# 永久关闭SELinux(重启生效)
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
二、安装 GlusterFS(所有节点执行)
openEuler 官方仓库已包含 GlusterFS 软件包,无需额外配置第三方源。
bash
# 安装服务端和客户端组件
dnf install -y glusterfs glusterfs-server glusterfs-fuse
# 启动服务并设置开机自启
systemctl enable --now glusterd
# 验证服务状态
systemctl status glusterd
三、配置 GlusterFS 集群(仅在主节点执行)
3.1 添加节点到信任池
bash
# 添加节点2和节点3
gluster peer probe gluster-node2
gluster peer probe gluster-node3
# 查看集群节点状态
gluster peer status
预期输出:
plaintext
Number of Peers: 2
Hostname: gluster-node2
Uuid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
State: Peer in Cluster (Connected)
Hostname: gluster-node3
Uuid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
State: Peer in Cluster (Connected)
3.2 查看集群信息
bash
# 查看集群详细信息
gluster pool list
# 查看所有卷
gluster volume list
四、创建和管理 GlusterFS 卷
4.1 卷类型对比与选择
表格
| 卷类型 | 特点 | 适用场景 | 磁盘利用率 | 可靠性 |
|---|---|---|---|---|
| 分布式卷 | 文件随机分布在不同 brick | 海量小文件存储,追求容量 | 100% | 低 |
| 复制卷 | 文件完整复制到多个 brick | 高可用数据存储 | 1 / 副本数 | 高 |
| 分布式复制卷 | 先分布式再复制 | 兼顾容量和可靠性 | 1 / 副本数 | 高 |
| 纠删码卷 | 基于擦除码,空间效率高 | 冷数据归档 | 高 | 中 |
4.2 创建分布式卷(默认类型)
bash
# 创建brick目录(所有节点执行)
mkdir -p /data/brick1/gv-dist
# 创建分布式卷(主节点执行)
gluster volume create gv-dist \
gluster-node1:/data/brick1/gv-dist \
gluster-node2:/data/brick1/gv-dist \
gluster-node3:/data/brick1/gv-dist
# 启动卷
gluster volume start gv-dist
# 查看卷信息
gluster volume info gv-dist
4.3 创建复制卷(推荐生产环境)
bash
# 创建brick目录(所有节点执行)
mkdir -p /data/brick1/gv-rep
# 创建3副本复制卷(主节点执行)
gluster volume create gv-rep replica 3 \
gluster-node1:/data/brick1/gv-rep \
gluster-node2:/data/brick1/gv-rep \
gluster-node3:/data/brick1/gv-rep force
# 启动卷
gluster volume start gv-rep
# 查看卷信息
gluster volume info gv-rep
4.4 创建分布式复制卷
bash
# 创建brick目录(所有节点执行)
mkdir -p /data/brick1/gv-dist-rep
# 创建2副本分布式复制卷(6个brick)
gluster volume create gv-dist-rep replica 2 \
gluster-node1:/data/brick1/gv-dist-rep \
gluster-node2:/data/brick1/gv-dist-rep \
gluster-node3:/data/brick1/gv-dist-rep \
gluster-node1:/data/brick1/gv-dist-rep2 \
gluster-node2:/data/brick1/gv-dist-rep2 \
gluster-node3:/data/brick1/gv-dist-rep2 force
# 启动卷
gluster volume start gv-dist-rep
4.5 创建纠删码卷(EC 卷)
bash
# 创建brick目录(所有节点执行)
mkdir -p /data/brick1/gv-ec
# 创建4+2纠删码卷(6个brick,可容忍2个节点故障)
gluster volume create gv-ec disperse 6 redundancy 2 \
gluster-node1:/data/brick1/gv-ec \
gluster-node2:/data/brick1/gv-ec \
gluster-node3:/data/brick1/gv-ec \
gluster-node1:/data/brick1/gv-ec2 \
gluster-node2:/data/brick1/gv-ec2 \
gluster-node3:/data/brick1/gv-ec2 force
# 启动卷
gluster volume start gv-ec
五、客户端挂载 GlusterFS 卷
5.1 安装客户端软件
bash
# 在客户端节点执行
dnf install -y glusterfs glusterfs-fuse
5.2 临时挂载
bash
# 创建挂载点
mkdir -p /mnt/glusterfs/gv-rep
# 挂载卷(可以使用任意集群节点IP)
mount -t glusterfs gluster-node1:/gv-rep /mnt/glusterfs/gv-rep
# 验证挂载
df -h /mnt/glusterfs/gv-rep
5.3 永久挂载(开机自动挂载)
bash
# 编辑fstab文件
echo "gluster-node1:/gv-rep /mnt/glusterfs/gv-rep glusterfs defaults,_netdev 0 0" >> /etc/fstab
# 验证自动挂载
mount -a
⚠️ 重要 :必须添加_netdev选项,表示依赖网络,确保网络就绪后再挂载。
六、测试 GlusterFS 集群
6.1 数据写入测试
bash
# 在客户端写入测试文件
cd /mnt/glusterfs/gv-rep
for i in {1..10}; do echo "test file $i" > test$i.txt; done
# 查看文件
ls -l
6.2 数据同步验证
bash
# 在节点1查看brick目录
ls /data/brick1/gv-rep
# 在节点2查看brick目录
ls /data/brick1/gv-rep
# 两个节点应该有相同的文件(3副本卷所有节点都有完整文件)
6.3 高可用测试
bash
# 停止节点1的glusterd服务
systemctl stop glusterd
# 在客户端继续操作,应该仍然可以正常读写
echo "test after node1 down" > /mnt/glusterfs/gv-rep/test-ha.txt
# 启动节点1的服务
systemctl start glusterd
# 数据会自动同步到节点1
ls /data/brick1/gv-rep/test-ha.txt
七、GlusterFS 集群管理
7.1 卷扩容
bash
# 添加新节点到集群
gluster peer probe gluster-node4
# 为复制卷添加brick(必须成对添加,保持副本数)
gluster volume add-brick gv-rep replica 3 \
gluster-node4:/data/brick1/gv-rep force
# 重新平衡数据(必须执行!)
gluster volume rebalance gv-rep start
# 查看重平衡状态
gluster volume rebalance gv-rep status
7.2 卷缩容
bash
# 移除brick(必须成对移除)
gluster volume remove-brick gv-rep replica 2 \
gluster-node3:/data/brick1/gv-rep start
# 查看移除状态
gluster volume remove-brick gv-rep replica 2 \
gluster-node3:/data/brick1/gv-rep status
# 确认移除完成后提交
gluster volume remove-brick gv-rep replica 2 \
gluster-node3:/data/brick1/gv-rep commit
7.3 快照管理
bash
# 启用卷的快照功能
gluster volume set gv-rep features.snapshots on
# 创建快照
gluster snapshot create snap1 gv-rep
# 查看快照列表
gluster snapshot list
# 恢复快照
gluster snapshot restore snap1
# 删除快照
gluster snapshot delete snap1
7.4 常用管理命令
bash
# 查看所有卷状态
gluster volume status
# 查看卷详细信息
gluster volume info gv-rep
# 停止卷
gluster volume stop gv-rep
# 删除卷(必须先停止)
gluster volume delete gv-rep
# 设置卷访问控制(只允许指定IP访问)
gluster volume set gv-rep auth.allow 192.168.1.*
# 查看卷性能统计
gluster volume profile gv-rep start
gluster volume profile gv-rep info
gluster volume profile gv-rep stop
八、常见问题排查
8.1 节点无法加入集群
- 检查网络是否互通:
ping gluster-node2 - 检查防火墙端口是否开放:
telnet gluster-node2 24007 - 检查时间是否同步:
date - 检查 hosts 解析是否正确:
cat /etc/hosts
8.2 客户端挂载失败
- 检查卷是否已启动:
gluster volume status gv-rep - 检查客户端是否能访问集群节点
- 检查卷的访问控制设置:
gluster volume info gv-rep | grep auth.allow - 查看客户端日志:
tail -f /var/log/glusterfs/mnt-glusterfs-gv-rep.log
8.3 数据不同步
- 检查所有节点的 glusterd 服务是否正常运行
- 查看卷状态:
gluster volume status gv-rep - 执行自修复:
gluster volume heal gv-rep full - 查看自修复状态:
gluster volume heal gv-rep info
8.4 性能优化
bash
# 启用性能优化
gluster volume set gv-rep performance.cache-size 256MB
gluster volume set gv-rep performance.write-behind on
gluster volume set gv-rep performance.read-ahead on
gluster volume set gv-rep performance.io-thread-count 16
# 针对小文件优化
gluster volume set gv-rep features.cache-invalidation on
gluster volume set gv-rep features.cache-invalidation-timeout 600
九、生产环境最佳实践
- 使用独立的存储网络:分离数据流量和管理流量
- 使用 XFS 文件系统:GlusterFS 官方推荐
- 至少 3 节点集群:避免脑裂问题
- 定期创建快照:防止数据误删除
- 监控集群状态:使用 Prometheus+Grafana 监控
- 定期备份数据:分布式存储不是备份
- 避免使用系统盘作为 brick:防止系统故障导致数据丢失
