GlusterFS 入门到精通 | 第 1 天:GlusterFS 分布式存储概述与架构基础

第 1/20 天|GlusterFS 入门到精通系列开篇

一、引言:为什么需要分布式存储

在云原生与容器化时代,单机存储早已无法满足业务对容量、性能、可用性的三重诉求。当一台服务器的硬盘塞满、当某块磁盘损坏导致业务中断、当跨机房容灾成为合规要求——分布式存储便成为绕不开的基础设施。

GlusterFS(Gluster File System)是一款开源、横向可扩展、无元数据服务器(No Metadata Server)的分布式文件系统,由 Red Hat 维护。它把多台普通 x86 服务器上的磁盘通过弹性哈希算法(Elastic Hash)组织成一个统一命名空间,既能像本地目录一样 mount,又能提供 PB 级容量与多副本高可用。本系列 20 篇将从架构、安装、卷类型、客户端、灾备、监控、调优到生产全栈部署,带你从入门到精通。本文是开篇,聚焦架构与基础概念。

GlusterFS

二、GlusterFS 设计架构

2.1 整体拓扑:无中心化设计

传统分布式存储(如 MooseFS、HDFS NameNode)多采用「元数据服务器 + 数据节点」的主从架构,元数据节点是瓶颈与单点。GlusterFS 走了一条截然不同的路——无元数据服务器架构,所有节点对等,数据访问通过客户端侧的弹性哈希算法直接定位到目标 Brick,消除中心节点瓶颈。

核心组件拓扑:

💻 代码示例

┌─────────────────────────────────────────────────────────────┐

│ GlusterFS Trusted Storage Pool │

│ │

│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │

│ │ node1 │ │ node2 │ │ node3 │ │

│ │ /data/b1 │ │ /data/b2 │ │ /data/b3 │ ← Bricks │

│ │ glusterd │◄──►│ glusterd │◄──►│ glusterd │ ← 守护进程 │

│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │

│ │ │ │ │

│ └───────────────┴───────────────┘ │

│ TCP/RPC 互信通道 (24007) │

└─────────────────────────────────────────────────────────────┘

▲

│ FUSE mount / NFS / SMB

┌───────────┴──────────┐

│ Client (Ubuntu) │

│ mount -t glusterfs │

└───────────────────────┘

2.2 数据流向

  1. 客户端执行 mount -t glusterfs node1:/gv0 /mnt/gv0,通过 RPC 与 glusterd 握手,获取 Volume 拓扑与 Brick 列表。
  2. 客户端加载 glusterfs FUSE 内核模块,挂载点 /mnt/gv0 上的所有 VFS 调用被转发到用户态 glusterfs 进程。
  3. 用户态进程内置 Translator(翻译器)栈,依次经过:mount → fuse → client → protocol/client → cluster(distribute/replicate/stripe)→ storage/posix。
  4. cluster 类型 Translator(如 DHT 弹性哈希、AFR 自动复制)决定数据写入哪些 Brick。
  5. 通过 TCP 长连接把数据直接写入目标节点的 posix 存储(即真实磁盘目录),全程不经过任何元数据服务器。

2.3 高可用机制

GlusterFS 的高可用分三层:

  • 节点级:Trusted Pool 内任意节点宕机,卷仍可访问(前提是卷类型有冗余,如 Replicated/Dispersed)。
  • 数据级:通过 AFR(Automatic File Replication)或 Erasure Code 提供副本/纠删冗余,单 Brick 损坏不丢数据。
  • 客户端级:挂载时可指定 backupvolfile-server=node2:node3,当 node1 的 glusterd 不可达时自动切换。

2.4 存储规划建议(3 节点起步)

角色 主机名 IP 磁盘 Brick 目录
Server+Client node1 192.168.1.11 /dev/sdb 100G /data/brick1
Server+Client node2 192.168.1.12 /dev/sdb 100G /data/brick2
Server+Client node3 192.168.1.13 /dev/sdb 100G /data/brick3

3 节点是起步最小集:可做 3 副本(最强冗余)、2+1 Arbiter(省容量防脑裂)、2+1 Dispersed(容量与冗余平衡)。

三、核心概念速览

本节建立全局认知,后续章节会逐一深入实战。

3.1 Brick

Brick 是 GlusterFS 的基本存储单元,本质上是节点上的一个导出目录,通常对应一块独立磁盘。一个 Brick = 节点:/目录,例如 node1:/data/brick1。Volume 由一个或多个 Brick 组成。

3.2 Trusted Storage Pool

受信存储池是一组互相信任的 GlusterFS 节点集合。通过 gluster peer probe 把节点加入池,池内节点共享卷配置。只有同一池的节点才能组成 Volume。

3.3 Volume

Volume 是对客户端暴露的逻辑卷,是 Brick 的逻辑组合。客户端挂载的 node1:/gv0 中的 gv0 即 Volume 名。GlusterFS 提供六大卷类型:Distributed(分布式)、Replicated(复制)、Striped(条带)、Distributed Replicated、Dispersed(纠删)、Distributed Dispersed。本系列第 4–8 天逐一实战。

3.4 glusterd

glusterd 是每个节点上的管理守护进程,监听 TCP 24007,负责 peer 管理、volume 创建/启停、客户端握手、快照协调。它是控制面,不参与数据面。

四、部署实战:搭建 3 节点受信存储池

本节在 Ubuntu 22.04 LTS 上从零搭建 3 节点 GlusterFS 集群。这是后续所有卷类型实战的基础环境,请务必完成。

4.1 环境准备(三节点均执行)

💻 代码示例

# 1. 设置主机名与 hosts 解析(在三台机器分别执行)

hostnamectl set-hostname node1 # node2、node3 同理

 

# 2. 三台机器写入统一的 hosts

cat >> /etc/hosts << 'EOF'

192.168.1.11 node1

192.168.1.12 node2

192.168.1.13 node3

EOF

 

# 3. 关闭防火墙(生产环境应开放 24007、24008、49152-49664 端口)

ufw disable

 

# 4. 时间同步(脑裂预防必备)

apt update && apt install -y chrony ntpdate

systemctl enable –now chrony

4.2 安装 GlusterFS(apt 官方仓库)

Ubuntu 22.04 官方源里的 glusterfs-server 版本通常较旧,推荐使用 Launchpad PPA 安装较新稳定版(如 10.x 或 11.x)。

💻 代码示例

# 添加 GlusterFS 官方 PPA(Ubuntu 22.04 jammy)

apt install -y software-properties-common

add-apt-repository -y ppa:gluster/glusterfs-11

 

# 安装服务端与客户端

apt update

apt install -y glusterfs-server glusterfs-client

 

# 验证版本

glusterfs –version

# 期望输出:glusterfs 11.x

 

systemctl enable –now glusterd

systemctl status glusterd –no-pager

若 PPA 不可用,也可直接用 Ubuntu 自带版本(约 7.x),命令一致,功能足够本系列学习:

💻 代码示例

apt install -y glusterfs-server glusterfs-client

4.3 源码编译安装(备选方案)

当需要特定版本或定制特性时,使用源码编译。以 GlusterFS 11.1 为例:

💻 代码示例

# 安装编译依赖

apt install -y build-essential autoconf automake libtool

pkg-config libtirpc-dev liburing-dev libuuid-dev

libacl1-dev libattr1-dev flex bison libsqlite3-dev

 

# 下载并编译

cd /usr/local/src

wget https://download.gluster.org/pub/gluster/glusterfs/11/11.1/glusterfs-11.1.tar.gz

tar xzf glusterfs-11.1.tar.gz && cd glusterfs-11.1

./configure –prefix=/usr/local/glusterfs –disable-linux-io_uring

make -j$(nproc) && make install

 

# 加入 PATH 与 systemd

export PATH=/usr/local/glusterfs/sbin:$PATH

echo 'export PATH=/usr/local/glusterfs/sbin:$PATH' >> /etc/profile.d/gluster.sh

# 启动(源码版需手动起 glusterd)

/usr/local/glusterfs/sbin/glusterd

glusterfs –version

4.4 准备 Brick 目录(三节点均执行)

生产环境建议 Brick 使用独立磁盘(LVM/xfs),便于后续快照。本例用 /dev/sdb:

💻 代码示例

# 格式化独立磁盘为 xfs

mkfs.xfs -f /dev/sdb

mkdir -p /data/brick1 # node1; node2 用 brick2,node3 用 brick3

echo '/dev/sdb /data/brick1 xfs defaults 0 0' >> /etc/fstab

mount -a && df -h /data/brick1

4.5 组建 Trusted Storage Pool

在 node1 上执行,把 node2、node3 加入受信池:

💻 代码示例

# 在 node1 上探测 node2、node3

gluster peer probe node2

gluster peer probe node3

 

# 预期输出:

# peer probe: success

 

# 查看池状态

gluster peer status

预期输出(在 node1 上看到两个 peer,State 为 Peer in Cluster):

💻 代码示例

Number of Peers: 2

 

Hostname: node2

Uuid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

State: Peer in Cluster (Connected)

 

Hostname: node3

Uuid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

State: Peer in Cluster (Connected)

4.6 创建第一个分布式复制卷

为验证环境可用,先创建一个 2x3 的分布式复制卷(2 个复制组,每组 3 副本,跨 6 Brick——本例 3 节点各出 2 Brick):

💻 代码示例

# 各节点再建第二个 Brick 目录

mkdir -p /data/brick1b # node1; 对应 node2:/data/brick2b、node3:/data/brick3b

 

# 创建卷

gluster volume create gv0

replica 3

node1:/data/brick1/gv0 node2:/data/brick2/gv0 node3:/data/brick3/gv0

node1:/data/brick1b/gv0 node2:/data/brick2b/gv0 node3:/data/brick3b/gv0

 

# 启动卷

gluster volume start gv0

 

# 查看卷信息

gluster volume info gv0

4.7 客户端挂载验证

任一节点或独立客户端均可挂载:

💻 代码示例

# 安装客户端

apt install -y glusterfs-client

 

# 挂载

mkdir -p /mnt/gv0

mount -t glusterfs node1:/gv0 /mnt/gv0

 

# 写入测试

echo "hello glusterfs day1" > /mnt/gv0/test.txt

cat /mnt/gv0/test.txt

ls -l /mnt/gv0/

五、登录验证命令

部署完成后,按以下顺序验证集群健康:

💻 代码示例

# 1. 验证 glusterd 服务

systemctl is-active glusterd

# active

 

# 2. 验证 peer 池

gluster peer status

# Number of Peers: 2,全部 Connected

 

# 3. 验证卷

gluster volume info

# Volume Name: gv0, Type: Distributed-Replicate, Status: Started

 

# 4. 验证卷状态(含 Brick 在线情况)

gluster volume status gv0

# N Bricks online,无 N/A

 

# 5. 验证挂载与读写

mount | grep gv0

df -h /mnt/gv0

cat /mnt/gv0/test.txt

六、日常巡检基础命令

作为开篇,先建立日常巡检命令清单,后续每篇会按主题扩展:

💻 代码示例

# A. 集群健康

gluster peer status # peer 连接状态

gluster volume status # 所有卷 Brick 在线状态

gluster volume info # 卷配置

 

# B. 容量巡检

df -h /data/brick1 # 各节点 Brick 容量

gluster volume top gv0 read/write # IO 热点

 

# C. 服务与日志

systemctl status glusterd # 守护进程

journalctl -u glusterd –since "1 hour ago" # 服务日志

tail -f /var/log/glusterfs/glusterd.log # 详细日志

 

# D. 性能快照

gluster volume profile gv0 start

gluster volume profile gv0 info # 查看 IO profile

gluster volume profile gv0 stop

七、常见问题 FAQ

Q1:peer probe: failed: Probe returned with Transport endpoint is not connected
A:对方 glusterd 未启动或防火墙拦截 24007。检查 systemctl status glusterd 与 ufw status,确保 hosts 解析正确。

Q2:mount 报 Transport endpoint is not connected 但卷已 Started
A:客户端 glusterfs 版本与服务端差异过大。统一两端版本;或检查 /var/log/glusterfs/mnt-gv0.log 定位。

Q3:3 节点能否做 3 副本?
A:可以,且是推荐的入门高可用配置。每个 Brick 在不同节点,任一节点宕机数据仍完整可用。

八、总结

本文从「为什么需要分布式存储」出发,讲解了 GlusterFS 无元数据服务器的对等架构、数据在 Translator 栈中的流转、三层高可用机制,以及 Brick/Peer/Volume/glusterd 四个核心概念。随后在 Ubuntu 22.04 上从零搭建了 3 节点 Trusted Storage Pool,创建了第一个分布式复制卷并完成客户端挂载验证,最后给出日常巡检命令清单。

核心要点:
– GlusterFS 靠弹性哈希定位数据,无中心元数据瓶颈
– Trusted Pool 是卷的前提,peer probe 建立互信
– Brick 是物理存储单元,Volume 是逻辑呈现
– 3 节点是生产最小集,可灵活组合各类卷类型

掌握了架构与基础环境后,下一篇将正式进入安装专题的深度实践。

九、下期预告

第 2 天:Ubuntu 22.04 安装 GlusterFS(apt 仓库与源码编译)
将深入对比 apt PPA 与源码编译两种安装方式的差异,覆盖依赖管理、systemd 服务配置、版本升级与回滚、多版本共存等生产场景,让你掌握可复现的安装流水线。

十、系列目录

  • 📌 第 1 天:GlusterFS 分布式存储概述与架构基础 ← 本文
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像 - 恒星
欢迎您留下宝贵的见解!
提交
头像 - 恒星

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容