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 算法的具体实现, 具体使用原理为, 在访问一个文件路径时:
- 利用文件路径和名称计算得到一个 32 位 hash 值
- 假设逻辑卷中有 N 个 Brick, 将 32 位整数空间 (也就是所有的 32 位数) 拆分为 N 个连续的子空间 (就是数字), 每一个空间对应一个 Brick
- 当访问一个命名空间时, 通过对该命名空间计算 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 |
|
创建一个 Distributed Replication:
1 |
|
(注意区别仅在 brick 的数量, 此时的 brick 顺序很重要)
Dispersed
将文件分成数据块, 并以轮询的方式分布到多个 Brick server.
如将一个文件编码为三块, 放在 3 个 Brick 上存储, 在读取数据时, 从各个 Brick 上获取编码块, 并解码成原始数据块以及组合, 返回给用户.
这里不仅会将数据条带化, 还会添加冗余, 冗余 brick 的数量可以在创建卷时设置. (用于存储纠删码)
Distributed Dispersed
Brick Server 数量为文件编码成数据块数量的倍数.
和 Distributed Replication volume 类似. (同样有 brick set 的概念)
安装
服务端和客户端的说明
Gluster 服务端即提供存储的一方, 而 Gluster 客户端是连接并使用存储的一方.
Gluster server 的安装和启用
在提供存储的服务器安装:
1 |
|
Gluster client 的安装
在客户端 (即谁想用 gluster 提供的磁盘) 安装:
1 |
|
(如果不安装这两个, Linux 甚至无法识别 glusterfs 这一文件系统)
基本使用
步骤为:
- 各节点进行磁盘分区和挂载
- 各存储节点实现 IP 和域名的解析 (DNS 服务配置或用 hosts 文件)
- 所有存储节点安装和启用 glusterfs
- 创建 GlusterFS 的存储信任池 (查看用:
gluster poor list
), 在任意一个存储节点上添加其他信任节点即可 (在其他节点上会生效) - 查看存储池状态
gluster peer status
Peer
要构建一个 GlusterFS 集群, 则需要将主机添加到集群中等操作, 对集群中主机的管理使用:
1 |
|
添加主机到集群
1 |
|
注意集群中所有的主机要相互 probe
. 这样才能建立双向的信任关系, 以便相互通信和共享数据. (也即添加到一个 trusted storage pool 中)
如现在有 server1 和 server2 两台主机, 在 server1 上运行:
1 |
|
则将 server2 添加到 server1 的 GlusterFS 集群中.
之后在 server2 上运行:
1 |
|
则将 server1 添加到了 server2 的 GlusterFS 集群中. 此时也就建立了双向的信任关系.
将某主机移除集群
1 |
|
(也即从 pool 中移除)
查看 peer 主机的状态
1 |
|
Pool
查看 trusted storage pool 中的所有 peers:
1 |
|
Volume
Volume, 逻辑卷, 是一组 Brick 的集合.
查看已有的 Volume 列表
1 |
|
创建 Volume
1 |
|
(看示例容易懂)
如创建一个名为 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 的状态
有多条子命令可用于查询 Volume 的状态:
status
, 可查询 volume 中各 brick 所属, 以及与 gluster 服务器连接的 tcp, pid 等信息info
, 查看 volume 的基本信息, 如当前状态, 连接方式, 一些选项的开启情况, brick 的所属等
如:
1 |
|
输出如:
1 |
|
使用 info
:
1 |
|
输出如;
1 |
|
启用一个 Volume
Volume 具有几种状态:
Created
, 已创建但未启动过, 此时未准备好提供数据访问Stopped
, 启动过但目前处于停止状态, 此时不接受数据访问Started
, 已启动并运行, 此时正在提供数据访问和服务
启用:
1 |
|
禁用一个 Volume
1 |
|
删除一个 Volume
1 |
|
删除卷后, 释放的 brick 还无法直接使用, 需要在对应 brick 目录中, 删除 .glusterfs
开头的隐藏文件, 然后执行:
1 |
|
(当你删除一个卷时, GlusterFS 只是标记了这个卷已经被删除, 但实际的 brick 数据并没有被立即删除. 这是为了确保如果需要恢复这个卷, 数据还能够找回)
设置 Volume 的选项
语法为:
1 |
|
(以后用到了再列常见选项)
有哪些选项可以用:
1 |
|
来查看.
(不用 all
, 而是指定某一个选项可以查看其设置值)
Brick
与 Brick 相关的命令大都为 gluster volume
下的子命令. 用于对 Brick 的添加, 移除, 替换, 负载均衡等.
向指定 Volume 添加一个或多个 brick
1 |
|
如:
1 |
|
(当向 replicate volume 提供两个在同一个 node 上的 brick 时, 默认是不允许的, 但可以用 force
来强制添加)
Brick 的命名规范
也就是 brick 的路径规范, 一般为:
1 |
|
这里的 <brick>
是存储设备的挂载点.
如:
1 |
|
移除指定 Volume 中的一个或多个 brick
1 |
|
如:
1 |
|
将指定 Volume 中的一个 brick 替换为 另一个 brick
1 |
|
如:
1 |
|
对 Volume 中的 brick 做负载均衡
启用:
1 |
|
停止:
1 |
|
查看状态:
1 |
|
Quota
Quota 相关命令也都是 gluster volume
的子命令.
(这里大部分功能暂时不讨论, 以后用到了再看)
启用指定 Volume 的 quota 功能
1 |
|
若成功启用, 其输出为:
1 |
|
禁用指定 Volume 的 quota 功能
1 |
|
如:
1 |
|
Heal
Heal 相关命令也大都是 gluster volume
的子命令.
查看指定 Volume 中哪些文件需要 healing
1 |
|
如:
1 |
|
输出如:
1 |
|
手动 Heal 指定 Volume 中需要 healing 的文件
1 |
|
如:
1 |
|
手动 Heal 指定 Volume 中所有文件
1 |
|
如:
1 |
|
查看指定 Volume 中 self-healed 的文件
1 |
|
如:
1 |
|
查看指定 Volume 中 self-healed 失败的文件
1 |
|
如:
1 |
|
查看指定 Volume 中处于 split-brain 状态的文件
1 |
|
如:
1 |
|
客户端操作
直接挂载
先确保客户端安装了 glusterfs
和 glusterfs-fuse
包, 以及能够连接服务端主机.
之后直接创建挂载点, 向 /etc/fstab
写入挂载信息后重新挂载即可:
1 |
|
注意指定文件系统类型为 glusterfs
. 同时, 挂载时指定的是 volume 而不是具体的目录.
NFS 挂载
此模式需要重启 volume 开启 NFS 选项, 并在 server 上启动 NFS 服务:
1 |
|
测试各类型 volume 的效果
日志信息
相关日志信息都放在 /var/log/glusterfs
目录下.