GlusterFS-服务搭建

GlusterFS 官方文档

简介

Gluster 是一个可扩展的分布式文件系统, 其将多个服务器的存储整合到一个 global namespace 中.

其能够自动检测存储节点的故障, 并将数据转移到其他节点上. 也能够将数据均匀分布在不同的存储节点上已实现负载均衡.

特点

  • 高可用性, 自动检测存储节点的故障, 并将数据转移到其他节点
  • 负载均衡, 分布式存储, 且自动将数据均匀分散在不同的存储节点上
  • 可扩展性, 能添加存储节点来增加存储容量
  • 数据安全, 将数据复制到多个存储节点上
  • 高性能, 用弹性哈希算法实现快速读写, 且支持多个客户端并发访问
  • 易于管理, 有完整的管理工具

相关概念

Brick

Brick, 存储块, 是 GlusterFS 中的基本存储单元. 可以把硬盘, 分区, 目录, 逻辑卷等制作为 bricks.

一般把硬盘, 分区挂载到一个目录下作为 brick.

Volume

Volume, 逻辑卷, 一组 Brick 的集合.

FUSE

FUSE, Filesystem in Userspace, 是一个 Linux 内核模块, 其允许用户创建自己的文件系统, 而无需修改内核代码.

VFS

VFS, Virtual File System, 一个抽象层, 位于操作系统内核和各个具体文件系统之间, 为应用程序提供统一的文件系统接口.

其主要目标是将不同的文件系统 (如 ext4, NTFS, FAT 等) 统一视为一个统一的文件系统,使应用程序无需关心底层具体的文件系统细节.

弹性 HASH 算法

弹性 HASH 算法是 Davies-Meyer 算法的具体实现, 具体使用原理为, 在访问一个文件路径时:

  1. 利用文件路径和名称计算得到一个 32 位 hash 值
  2. 假设逻辑卷中有 N 个 Brick, 将 32 位整数空间 (也就是所有的 32 位数) 拆分为 N 个连续的子空间 (就是数字), 每一个空间对应一个 Brick
  3. 当访问一个命名空间时, 通过对该命名空间计算 hash 值, 根据该 hash 值确定 Brick 位置

冗余

冗余, 是指在存储集群中对数据进行备份或复制, 以提高数据的可靠性和冗余度.

纠删码 (Erasure Code)

纠删码 (Erasure Code), 一种在分布式存储系统中用于数据冗余和容错的技术. 它通过将原始数据切分为多个数据块, 并生成一些冗余数据块, 以实现数据的恢复和容错能力.

纠删码的原理是基于数学算法, 它通过将原始数据编码为一系列数据块, 并在存储系统的不同节点上进行分布式存储. 这些数据块包括原始数据块和额外的冗余数据块.

Quota

“quota” 是一种机制, 用于限制文件系统中的存储空间使用量. 它允许管理员为用户或组设置最大存储容量, 以控制其在文件系统中创建和使用文件的能力.

GlusterFS 支持基于目录级别的配额设置,允许对存储进行更精细的管理.

Trusted Storage Pools

一个 trusted storage pool (TSP), 指一个组相互信任的 storage server.

在创建 GlusterFS Volume 之前, 需要通过 servers 之间 peer probing 来创建一个 trusted storage pool 以给 volume 提供 bricks. (因此一个 TSP 内的所有 servers 都是 peers of each other).

在刚安装 Gluster server 时, 其就已经属于一个 TSP 内, 只是此时 TSP 中只有它本身一台主机.

Heal

“heal” 是指卷 (Volume) 中的数据一致性检查和修复过程. GlusterFS 使用分布式存储的方式, 将数据分散存储在多个存储节点 (brick) 上.在某些情况下, 由于网络故障, 储节点故障或其他原因, 卷中的数据可能会变得不一致或丢失.

为了确保数据的一致性和完整性, GlusterFS 提供了自动修复机制, 即 “heal”. Heal 过程负责检测和修复数据不一致的情况, 并将数据同步到所有相关存储节点, 以使数据再次保持一致.

GlusterFS 中有两种类型的 Heal:

  • Self Heal, 自动检测和修复存储节点之间的数据不一致性
  • 手动触发 Heal, 管理员手动出发 Heal 过程来保证数据一致性

GlusterFS 常见的 Volume mode

Distribute

默认类型, 利用 HASH 算法将文件分布到所有 Brick server. (直接存储文件), 没有冗余.

同一个文件只会存储在一个 Brick 中. 容易导致数据丢失. 因此适合非关键数据的存储.

Replicated

将文件同步到多个 Brick Server 上, 每个文件都有多个副本. (有冗余)

若想有两个副本, 则至少要两个 brick, 所想有 3 个副本, 则至少要三个 brick.

卷中的所有 brick 都会有一个副本. (也可以自定义数量)

文件的副本数量, 需要是存储节点的倍数, 如:

  • 复制卷, 2 个存储单元 (Brick), 副本数可设置为 2, 4, 6 等
  • 复制卷, 3 个存储单元 (Brick), 副本数可设置为 3, 6, 9 等

同时, 需要保证存储单元的容量是相同的.

此时文件是不分片的, 会完整存储在某个节点上. 一般配合条带卷使用.

Distribute Replication

Brick Server 数量为副本数的倍数. 且相邻的 Brick 会成为彼此的副本.

本质是, 每几个 brick 构成一组, 相互之间都是副本.

如副本数为 2, 则 Brick 则至少为 8. 若此时 Brick 为 8, 则前两块为彼此的副本, 然后是下两块, 以此类推. 表示为 4x2 卷. (第一个数字为 Brick 数处以副本数, 第二个数字为副本数)

如果副本为 4, Brick 为 8, 则前四个为彼此的副本. 这种表示为 2x4 卷.

这里其实有 brick set 的概念, 比如, 要创建一个分布式复制卷, 文件副本为 2, 若有 8 个 brick, 则每 2 个 (相邻的) 组成一个 brick set. 此时存储文件, 一个文件只会进入一个 brick set, set 中相互为副本.

注意, 其创建语法和 Replication Volume 一致, 区别指在于提供的 brick 数量. 如创建一个 Replication volume:

1
glusterfs volume create replica 2 server1:/bricks/brick1 server2:/bricks/brick2

创建一个 Distributed Replication:

1
glusterfs volume create replica 2 server1:/bricks/brick1 server2:/bricks/brick2 server3:/bricks/brick3 server4:/bricks/brick4

(注意区别仅在 brick 的数量, 此时的 brick 顺序很重要)

Dispersed

将文件分成数据块, 并以轮询的方式分布到多个 Brick server.

如将一个文件编码为三块, 放在 3 个 Brick 上存储, 在读取数据时, 从各个 Brick 上获取编码块, 并解码成原始数据块以及组合, 返回给用户.

这里不仅会将数据条带化, 还会添加冗余, 冗余 brick 的数量可以在创建卷时设置. (用于存储纠删码)

Distributed Dispersed

Brick Server 数量为文件编码成数据块数量的倍数.

和 Distributed Replication volume 类似. (同样有 brick set 的概念)

安装

服务端和客户端的说明

Gluster 服务端即提供存储的一方, 而 Gluster 客户端是连接并使用存储的一方.

Gluster server 的安装和启用

在提供存储的服务器安装:

1
2
dnf install -y glusterfs-server
systemctl enable --now glusterd

Gluster client 的安装

在客户端 (即谁想用 gluster 提供的磁盘) 安装:

1
dnf install -y glusterfs glusterfs-fuse

(如果不安装这两个, Linux 甚至无法识别 glusterfs 这一文件系统)

基本使用

步骤为:

  1. 各节点进行磁盘分区和挂载
  2. 各存储节点实现 IP 和域名的解析 (DNS 服务配置或用 hosts 文件)
  3. 所有存储节点安装和启用 glusterfs
  4. 创建 GlusterFS 的存储信任池 (查看用: gluster poor list), 在任意一个存储节点上添加其他信任节点即可 (在其他节点上会生效)
  5. 查看存储池状态 gluster peer status

Peer

要构建一个 GlusterFS 集群, 则需要将主机添加到集群中等操作, 对集群中主机的管理使用:

1
gluster peer <option> <args>

添加主机到集群

1
gluster peer probe <HOSTNAME|IP>

注意集群中所有的主机要相互 probe. 这样才能建立双向的信任关系, 以便相互通信和共享数据. (也即添加到一个 trusted storage pool 中)

如现在有 server1 和 server2 两台主机, 在 server1 上运行:

1
gluster peer probe server2

则将 server2 添加到 server1 的 GlusterFS 集群中.

之后在 server2 上运行:

1
gluster peer probe server1

则将 server1 添加到了 server2 的 GlusterFS 集群中. 此时也就建立了双向的信任关系.

将某主机移除集群

1
gluster peer detach <HOSTNAME|IP>

(也即从 pool 中移除)

查看 peer 主机的状态

1
gluster peer status

Pool

查看 trusted storage pool 中的所有 peers:

1
gluster pool list

Volume

Volume, 逻辑卷, 是一组 Brick 的集合.

查看已有的 Volume 列表

1
gluster volume list

创建 Volume

1
gluster volume create <New-Volume-Name> [<type> <count>] <brick>...

(看示例容易懂)

如创建一个名为 gv0 的 volume, 类型为 replica, count 为 2 (表示每一个数据有两个副本), 指定可用的 brick 为:

  • 192.168.177.24 下的 /data/brick1/gv0 目录
  • 192.168.177.25 下的 /data/brick1/gv0 目录
    1
    gluster volume create gv0 replica 2 192.168.177.24:/data/brick1/gv0 192.168.177.25:/data/brick1/gv0

如果创建成功, 输出则为:

1
volume create: gv0: success: please start the volume to access data

查看 Volume 的状态

有多条子命令可用于查询 Volume 的状态:

  • status, 可查询 volume 中各 brick 所属, 以及与 gluster 服务器连接的 tcp, pid 等信息
  • info, 查看 volume 的基本信息, 如当前状态, 连接方式, 一些选项的开启情况, brick 的所属等

如:

1
gluster volume status gv0

输出如:

1
2
3
4
5
6
7
8
9
10
11
Status of volume: gv0
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick 192.168.177.24:/data/brick1/gv0 49974 0 Y 6936
Brick 192.168.177.25:/data/brick1/gv0 50841 0 Y 6795
Self-heal Daemon on localhost N/A N/A Y 6968
Self-heal Daemon on 192.168.177.25 N/A N/A Y 6827

Task Status of Volume gv0
------------------------------------------------------------------------------
There are no active volume tasks

使用 info:

1
gluster volume info gv0

输出如;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Volume Name: gv0
Type: Replicate
Volume ID: 2e19a448-ffe8-4d2f-b7da-ae0ab9d1e9dc
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: 192.168.177.24:/data/brick1/gv0
Brick2: 192.168.177.25:/data/brick1/gv0
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off

启用一个 Volume

Volume 具有几种状态:

  • Created, 已创建但未启动过, 此时未准备好提供数据访问
  • Stopped, 启动过但目前处于停止状态, 此时不接受数据访问
  • Started, 已启动并运行, 此时正在提供数据访问和服务

启用:

1
gluster volume start gv0

禁用一个 Volume

1
gluster volume stop gv0

删除一个 Volume

1
gluster volume delete <VOLNAME>

删除卷后, 释放的 brick 还无法直接使用, 需要在对应 brick 目录中, 删除 .glusterfs 开头的隐藏文件, 然后执行:

1
2
setfattr -x trusted.glusterfs.volume-id /BRICK
setfattr -x trusted.gfid /BRICK

(当你删除一个卷时, GlusterFS 只是标记了这个卷已经被删除, 但实际的 brick 数据并没有被立即删除. 这是为了确保如果需要恢复这个卷, 数据还能够找回)

设置 Volume 的选项

语法为:

1
gluster volume set <VOLNNAME> <OPTION> <PARAMETER [<OPTION> <PARAMETER>] ...

(以后用到了再列常见选项)

有哪些选项可以用:

1
gluster volume get <VOLNAME> all

来查看.
(不用 all, 而是指定某一个选项可以查看其设置值)

Brick

与 Brick 相关的命令大都为 gluster volume 下的子命令. 用于对 Brick 的添加, 移除, 替换, 负载均衡等.

向指定 Volume 添加一个或多个 brick

1
gluster volume add-brick <VOLNAME> <NEW-BRICK> ...

如:

1
gluster volume add-brick gv0 192.168.177.24:/data/brick2/gv0 192.168.177.24:/data/brick3/gv0 force

(当向 replicate volume 提供两个在同一个 node 上的 brick 时, 默认是不允许的, 但可以用 force 来强制添加)

Brick 的命名规范

也就是 brick 的路径规范, 一般为:

1
/data/glusterfs/<volume>/<brick>/brick

这里的 <brick> 是存储设备的挂载点.

如:

1
2
mkdir -p /data/glusterfs/myvol1/brick1
mount /dev/sdb1 /data/glusterfs/myvol1/brick1

移除指定 Volume 中的一个或多个 brick

1
gluster volume remove-brick <VOLNAME> <BRICK> ...

如:

1
2
3
4
[root@fedora1 gv0]# gluster volume remove-brick gv0 192.168.177.24:/data/brick2/gv0 192.168.177.24:/data/brick3/gv0 force
Remove-brick force will not migrate files from the removed bricks, so they will no longer be available on the volume.
Do you want to continue? (y/n) y
volume remove-brick commit force: success

将指定 Volume 中的一个 brick 替换为 另一个 brick

1
gluster volume replace-brick <VOLNAME> <SOURCE-BRICK> <NEW-BRICK> commit force

如:

1
gluster volume replace-brick gv0 server1:/brick1 server2:/brick2

对 Volume 中的 brick 做负载均衡

启用:

1
gluster volume rebalance <VOLNAME> start

停止:

1
gluster volume rebalance <VOLNAME> stop

查看状态:

1
gluster volume rebalance <VOLNAME> status

Quota

Quota 相关命令也都是 gluster volume 的子命令.

(这里大部分功能暂时不讨论, 以后用到了再看)

启用指定 Volume 的 quota 功能

1
gluster volume quota <VOLNAME> enable

若成功启用, 其输出为:

1
volume quota : success

禁用指定 Volume 的 quota 功能

1
gluster volume quota <VOLNAME> disable

如:

1
2
3
[root@fedora1 gv0]# gluster volume quota gv0 disable
Disabling quota will delete all the quota configuration. Do you want to continue? (y/n) y
volume quota : success

Heal

Heal 相关命令也大都是 gluster volume 的子命令.

查看指定 Volume 中哪些文件需要 healing

1
gluster volume heal <VOLNAME> info

如:

1
gluster volume heal vg0 info

输出如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# gluster volume heal test-volume info
Brick server1:/gfs/test-volume_0
Number of entries: 0

Brick server2:/gfs/test-volume_1
Number of entries: 101
/95.txt
/32.txt
/66.txt
/35.txt
/18.txt
/26.txt
/47.txt
/55.txt
/85.txt
...

手动 Heal 指定 Volume 中需要 healing 的文件

1
gluster volume heal <VOLNAME>

如:

1
gluster volume heal vg0

手动 Heal 指定 Volume 中所有文件

1
gluster volume heal <VOLNAME> full

如:

1
gluster volume heal vg0 full

查看指定 Volume 中 self-healed 的文件

1
gluster volume heal <VOLNAME> info healed

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# gluster volume heal test-volume info healed
Brick Server1:/gfs/test-volume_0
Number of entries: 0

Brick Server2:/gfs/test-volume_1
Number of entries: 69
/99.txt
/93.txt
/76.txt
/11.txt
/27.txt
/64.txt
/80.txt
/19.txt
/41.txt
/29.txt
/37.txt
/46.txt
...

查看指定 Volume 中 self-healed 失败的文件

1
gluster volume heal <VOLNAME> info failed

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
# gluster volume heal test-volume info failed
Brick Server1:/gfs/test-volume_0
Number of entries: 0

Brick Server2:/gfs/test-volume_3
Number of entries: 72
/90.txt
/95.txt
/77.txt
/71.txt
/87.txt
/24.txt
...

查看指定 Volume 中处于 split-brain 状态的文件

1
gluster volume heal <VOLNAME> info split-brain

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# gluster volume heal test-volume info split-brain
Brick Server1:/gfs/test-volume_2
Number of entries: 12
/83.txt
/28.txt
/69.txt
...

Brick Server2:/gfs/test-volume_3
Number of entries: 12
/83.txt
/28.txt
/69.txt
...

客户端操作

直接挂载

先确保客户端安装了 glusterfsglusterfs-fuse 包, 以及能够连接服务端主机.

之后直接创建挂载点, 向 /etc/fstab 写入挂载信息后重新挂载即可:

1
2
3
mkdir /mnt/glusterfs/dis_vol01
echo "node1:dis_volume01 /mnt/glusterfs/dis_vol01 glusterfs defaults 0 0 " >> /etc/fstab
mount -a

注意指定文件系统类型为 glusterfs. 同时, 挂载时指定的是 volume 而不是具体的目录.

NFS 挂载

此模式需要重启 volume 开启 NFS 选项, 并在 server 上启动 NFS 服务:

1
2
gluster volume set VOLUME nfs.disable off
mount -t nfs nodeX:NEW-VOLNAME /mnt/xx

测试各类型 volume 的效果

日志信息

相关日志信息都放在 /var/log/glusterfs 目录下.


GlusterFS-服务搭建
http://example.com/2024/03/07/GlusterFS-服务搭建/
作者
Jie
发布于
2024年3月7日
许可协议