GlusterFS (Gluster File System) 是一个开源的分布式文件系统,通熟点讲就是将多个服务器上分散的多个磁盘通过网络协议进行合并,组成一块超大号的磁盘。
官方文档:
https://docs.gluster.org/en/latest/
简介
开始搭建前介绍一些术语知识:
名称 | 解释 |
---|---|
brick | 最基本的存储单元 |
volume | 存储卷,在逻辑上由N个 bricks 组成 |
gluster | 管理存储的程序,对 glusterfs 中的资源进行查看及操作 |
glusterd | 服务端进程,用来加载多个 bricks 并开启相关网络端口供客户端连接 |
node | 安装有 glusterd 守护进程的主机,提供多个 bricks 存储 |
整个架构来说比较简单:
-
主机上安装glusterfs服务端程序glusterd
-
将多个主机通过gluster命令将其组成一个集群
-
在每个主机上创建若干相关的目录
-
通过gluster将相关节点及目录构建出一个存储卷并启用
-
在任意安装有支持glusterfs的主机上挂载存储卷即可使用
环境
-
centos 7.8.2003
-
glusterfs 9.3
主机 | 备注 |
---|---|
10.255.129.100 | client 用于挂载存储卷的客户机 |
10.255.129.101 | node1 节点1 服务机 |
10.255.129.102 | node2 节点2 服务机 |
10.255.129.103 | node3 节点3 服务机 |
安装
在有网的情况下,安装相对比较简单。
建议配置中科大的源进行加速:https://mirrors.ustc.edu.cn/help/centos.html
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.ustc.edu.cn/centos|g' \
-i.bak \
/etc/yum.repos.d/CentOS-Base.repo
yum makecache
默认源上其实是已经有 glusterfs 相关软件包的,只是相对较旧,我们这里要安装较新一点的版本。
https://wiki.centos.org/SpecialInterestGroup(2f)Storage.html
更新软件源:
yum install -y centos-release-gluster
yum info glusterfs
Name : glusterfs
Arch : x86_64
Version : 9.3
Release : 1.el7
Size : 647 k
Repo : centos-gluster9/7/x86_64
Summary : Distributed File System
URL : http://docs.gluster.org/
License : GPLv2 or LGPLv3+
Description : GlusterFS is a distributed file-system capable of scaling to several
: petabytes. It aggregates various storage bricks over TCP/IP interconnect
: into one large parallel network filesystem. GlusterFS is one of the
: most sophisticated file systems in terms of features and extensibility.
: It borrows a powerful concept called Translators from GNU Hurd kernel.
: Much of the code in GlusterFS is in user space and easily manageable.
:
: This package includes the glusterfs binary, the glusterfsd daemon and the
: libglusterfs and glusterfs translator modules common to both GlusterFS server
: and client framework.
节点安装
yum install glusterfs-server -y
systemctl enable glusterd
systemctl start glusterd
systemctl status glusterd
客户机安装
挂载 glusterfs 只需要安装 glusterfs-fuse 即可:
yum install -y glusterfs-fuse
至此,客户机及服务机都安装完毕了,接下来开始配置及创建卷并使用吧。
简单使用
三台节点虽然安装并启动了glusterfs服务,但是还都是独立的,没有构成一个存储集群,使用前,首先将他们组成一个集群。
在其中任何一台节点机器上操作即可:我们这里在 101 机器上将 102, 103 加入进来,只需加入一次。
gluster peer probe 10.255.129.102
gluster peer probe 10.255.129.103
gluster peer status
这样,我们就组建了一个有3个节点的glusterfs集群了。
有了集群还需要创建卷才能使用,在 101-103 每台机器上创建一个目录:/data/gfs/vol1
# 3台节点机器均创建此目录
mkdir -p /data/gfs/vol1
# 在其中1台节点机器上执行
# 创建名字叫gv1包含3个brick的卷,使用force是因为默认不允许root用户创建卷
gluster volume create gv1 10.255.129.101:/data/gfs/vol1 10.255.129.102:/data/gfs/vol1 10.255.129.103:/data/gfs/vol1 force
# 连续的主机可以用下面的命令简单操作
# gluster volume create gv1 10.255.129.10{1..3}:/data/gfs/vol1 force
创建好的卷,可以查看信息,确认无误,可以将其启动。
# 查看所有卷信息,gv1状态是Created
gluster volume info
Volume Name: gv1
Type: Distribute
Volume ID: 7f5ce32d-d984-4d14-a39a-fc38f4936c80
Status: Created
Snapshot Count: 0
Number of Bricks: 3
Transport-type: tcp
Bricks:
Brick1: 10.255.129.101:/data/gfs/vol1
Brick2: 10.255.129.102:/data/gfs/vol1
Brick3: 10.255.129.103:/data/gfs/vol1
Options Reconfigured:
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
# 启动gv1卷
gluster volume start gv1
volume start: gv1: success
# 再次查看卷信息,此时的状态是Started
gluster volume info gv1
Volume Name: gv1
Type: Distribute
Volume ID: 7f5ce32d-d984-4d14-a39a-fc38f4936c80
Status: Started
这样一个最简单的共享卷就创建启动成功了,接下来用客户机挂载测试。
在 100 机器创建一个挂载点,并挂载刚才的gv1卷:
mkdir -p /data/mnt-gv1
# 将gv1挂载到/data/mnt-gv1
mount -t glusterfs 10.255.129.101:/gv1 /data/mnt-gv1
# 查看挂载情况
df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs tmpfs 7.8G 0 7.8G 0% /dev/shm
tmpfs tmpfs 7.8G 18M 7.8G 1% /run
/dev/mapper/centos-root xfs 296G 4.9G 291G 2% /
10.255.129.101:/gv1 fuse.glusterfs 887G 21G 866G 3% /data/mnt-gv1
可以看到 /data/mnt-gv1 成功挂载了 gv1 卷,存储大小为 101-103 机器的和。
切换到 /data/mnt-gv1 目录,创建 30 个文件:
cd /data/mnt-gv1
for i in `seq -w 1 30`; do echo test-$i > test-$i; done
ls
test-01 test-03 test-05 test-07 test-09 test-11 test-13 test-15 test-17 test-19 test-21 test-23 test-25 test-27 test-29
test-02 test-04 test-06 test-08 test-10 test-12 test-14 test-16 test-18 test-20 test-22 test-24 test-26 test-28 test-30
我们分别看一下3台主机上对应的目录:
# 101
ls /data/gfs/vol1
test-02 test-11 test-12 test-13 test-18 test-26 test-28
# 102
ls /data/gfs/vol1
test-06 test-08 test-14 test-16 test-29
# 103
ls /data/gfs/vol1
test-01 test-03 test-04 test-05 test-07 test-09 test-10 test-15 test-17 test-19 test-20 test-21 test-22 test-23 test-24 test-25 test-27 test-30
30个文件随机分配到了3台主机上。
卷类型
上面的简单使用部分创建的是最简单的存储卷:Distributed Glusterfs Volume, 下面就一起来认识一下各种卷类型吧。
Distributed
分散存储,将文件分布到所有 brick server,只是扩大了磁盘空间,不具备容错能力。一个文件只会在其中一个 brick 上,这个 brick 坏掉,这个文件就会丢失。
语法:
gluster volume create NEW-VOLNAME [transport [tcp | rdma | tcp,rdma]] NEW-BRICK... [force]
示例:
gluster volume create test-volume server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
Replicated
复制存储,文件同步复制到多个 brick 上,具有容错能力,写性能下降,读性能提升。不具备扩容的特性,每个 brick 上存储所有的文件,例如:副本为2的卷,只能用到俩个 brick。
限制:replica count == brick count
语法:
gluster volume create NEW-VOLNAME [replica COUNT] [transport [tcp |rdma | tcp,rdma]] NEW-BRICK... [force]
示例:
mkdir -p /data/gfs/vol2
# 数量不合法无法创建
gluster volume create gv2 replica 2 10.255.129.10{1..3}:/data/gfs/vol2 force
number of bricks is not a multiple of replica count
# 改为3就可以了
gluster volume create gv2 replica 3 10.255.129.10{1..3}:/data/gfs/vol2 force
volume create: gv2: success: please start the volume to access data
gluster volume info gv2
Volume Name: gv2
Type: Replicate
Volume ID: f894cdf6-be0d-4d93-b4f3-45f6f3a9e8da
Status: Created
Snapshot Count: 0
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: 10.255.129.101:/data/gfs/vol2
Brick2: 10.255.129.102:/data/gfs/vol2
Brick3: 10.255.129.103:/data/gfs/vol2
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
Distributed Replicated
分散且复制存储,兼具 distribute 和 replica 卷的特点。
限制:replica count x N(>1) == brick count
语法:
gluster volume create NEW-VOLNAME [replica COUNT] [transport [tcp | rdma | tcp,rdma]] NEW-BRICK... [force]
示例:
mkdir /data/gfs/vol3-1
mkdir /data/gfs/vol3-2
gluster volume create gv3 replica 3 10.255.129.10{1..3}:/data/gfs/vol3-{1,2} force
volume create: gv3: success: please start the volume to access data
gluster volume info gv3
Volume Name: gv3
Type: Distributed-Replicate
Volume ID: a3a1fdb5-b38d-4266-b168-cc55279ec6c3
Status: Created
Snapshot Count: 0
Number of Bricks: 2 x 3 = 6
Transport-type: tcp
Bricks:
Brick1: 10.255.129.101:/data/gfs/vol3-1
Brick2: 10.255.129.101:/data/gfs/vol3-2
Brick3: 10.255.129.102:/data/gfs/vol3-1
Brick4: 10.255.129.102:/data/gfs/vol3-2
Brick5: 10.255.129.103:/data/gfs/vol3-1
Brick6: 10.255.129.103:/data/gfs/vol3-2
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
Dispersed
拆分存储,之前应该叫 stripe 现在新版叫 Disperse, 就是把一个文件通过编码分割成多块,存储到多个 brick 上,并且留有多余的一部分(称为纠错块)。
此类型可以最大化利用磁盘空间达到容灾的效果,举个例子:如果10M的文件用 Replicated 类型,需要至少占用20M空间,而使用 Dispersed 可以只需要15M。
此类型的 brick 数量至少为3,也就是 2 + 1, 例如 10M 的文件会分成 2 x 5M 存在 2 个 brick 上,再计算出一个 5M 的纠错块存到第3个 brick 上,这样就可以做到丢失任意一块,仍然可以得到原文件。
关于纠错块请参考:http://www.yunweipai.com/17037.html
语法:
gluster volume create test-volume [disperse [<COUNT>]] [disperse-data <COUNT>] [redundancy <COUNT>] [transport tcp | rdma | tcp,rdma] NEW-BRICK... [force]
示例:
mkdir -p /data/gfs/vol4
gluster volume create gv4 disperse 3 redundancy 1 10.255.129.10{1..3}:/data/gfs/vol4 force
volume create: gv4: success: please start the volume to access data
gluster volume info gv4
Volume Name: gv4
Type: Disperse
Volume ID: 876a54f9-4a2f-4c94-ad98-43e5681eb0f9
Status: Created
Snapshot Count: 0
Number of Bricks: 1 x (2 + 1) = 3
Transport-type: tcp
Bricks:
Brick1: 10.255.129.101:/data/gfs/vol4
Brick2: 10.255.129.102:/data/gfs/vol4
Brick3: 10.255.129.103:/data/gfs/vol4
Options Reconfigured:
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
Distributed Dispersed
拆分分散存储,达到扩容的目的。
语法:同Dispersed, 数量是单个Dispersed的倍数
gluster volume create test-volume [disperse [<COUNT>]] [disperse-data <COUNT>] [redundancy <COUNT>] [transport tcp | rdma | tcp,rdma] NEW-BRICK... [force]
示例:
mkdir -p /data/gfs/vol5-{1,2}
gluster volume create gv5 disperse 3 redundancy 1 10.255.129.10{1..3}:/data/gfs/vol5-{1,2} force
volume create: gv5: success: please start the volume to access data
gluster volume info gv5
Volume Name: gv5
Type: Distributed-Disperse
Volume ID: f5e695fe-f535-43cf-a851-5d045af7d313
Status: Created
Snapshot Count: 0
Number of Bricks: 2 x (2 + 1) = 6
Transport-type: tcp
Bricks:
Brick1: 10.255.129.101:/data/gfs/vol5-1
Brick2: 10.255.129.101:/data/gfs/vol5-2
Brick3: 10.255.129.102:/data/gfs/vol5-1
Brick4: 10.255.129.102:/data/gfs/vol5-2
Brick5: 10.255.129.103:/data/gfs/vol5-1
Brick6: 10.255.129.103:/data/gfs/vol5-2
Options Reconfigured:
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
常用操作
gluster cli 可以直接查看相关帮助,也可以查阅文档:https://docs.gluster.org/en/latest/CLI-Reference/cli-main/
gluster help
peer help - display help for peer commands
volume help - display help for volume commands
volume bitrot help - display help for volume bitrot commands
volume quota help - display help for volume quota commands
snapshot help - display help for snapshot commands
global help - list global commands
启/停/删除卷
gluster volume start volume-name
gluster volume stop volume-name
gluster volume delete volume-name
扩展/收缩卷
gluster volume add-brick volume-name brick...
gluster volume remove-brick volume-name brick...
扩展或收缩卷时,也要按照卷的类型,加入或减少的brick个数必须满足相应的要求。
迁移卷
主要完成数据在卷之间的在线迁移
gluster volume replace-brick volume-name old-brick new-brick [start|pause|abort|status|commit]
#迁移需要完成一系列的事务,假如我们准备将卷中的brick3替换为brick5
#启动迁移过程
$gluster volume replace-brick volume-name node3:/exp3 node5:/exp5 start
#暂停迁移过程
$gluster volume replace-brick volume-name node3:/exp3 node5:/exp5 pause
#中止迁移过程
$gluster volume replace-brick volume-name node3:/exp3 node5:/exp5 abort
#查看迁移状态
$gluster volume replace-brick volume-name node3:/exp3 node5:/exp5 status
#迁移完成后提交完成
$gluster volume replace-brick volume-name node3:/exp3 node5:/exp5 commit
均衡卷
当对卷进行了扩展或收缩后,需要对卷的数据进行重新均衡。
gluster volume rebalane volume-name [start|stop|status]
卷配额
可以限制卷的大小。
gluster volume quota volume-name enable
gluster volume quota volume-name disable
gluster volume quota volume-name limit-usage DIR HARD_LIMIT
gluster volume quota volume-name list
gluster volume quota volume-name list DIR
gluster volume quota volume-name remove DIR
# eg.
gluster volume quota test-volume limit-usage /data 10GB
gluster volume quota test-volume list
/data 10 GB 6 GB
/data1 10 GB 4 GB
gluster volume quota test-volume list /data
/data 10 GB 6 GB
gluster volume quota test-volume remove /data
Usage limit set on /data is removed
副本自愈
gluster volume heal volume-name #只修复有问题的文件
gluster volume heal volume-name full #修复所有文件
gluster volume heal volume-name info #查看自愈详情
gluster volume heal volume-name info [healed|heal-failed|split-brain]
开机挂载
编辑 /etc/fstab 增加配置
# HOSTNAME-OR-IPADDRESS:/VOLNAME MOUNTDIR glusterfs defaults,_netdev,log-level=WARNING,log-file=/var/log/gluster.log 0 0
10.255.129.101:/gv1 /data/mnt-gv1 glusterfs defaults,_netdev,log-level=WARNING,log-file=/var/log/gluster.log 0 0
总结
GlusterFS 很好用,也很强大,还有很多特性可供深入探究,本文仅涉及最基本的使用,有兴趣的请继续深入实践吧。
好了,今天的分享就到这里,欢迎关注,点赞,收藏,评论。很期待和大家的一起成长。
注:公&号:新质程序猿,可以找到我,欢迎链接闲侃。