目录
5.4 分布式条带卷 (Distributed Striped Volume)
5.5 分布式复制卷 (Distributed Replicated Volume)
5.6 条带复制卷 (Striped Replicated Volume)
5.7 分布式条带复制卷 (Distributed Striped Replicated Volume)
一.GlusterFS简介
GlusterFS 是一个开源的分布式文件系统,最初由Gluster公司开发,后来被Red Hat收购并继续维护和支持。它的设计目标是为大规模的数据存储需求提供高可靠性、高性能和可扩展性的解决方案。
1.ClusterFS特点
扩展性和高性能
GlusterFS利用双重特性来提供高容量存储解决方案。 (1)Scale-Out架构允许通过简单地增加存储节点的方式来提高存储容量和性能(磁盘、计算和I/O资源都可以独立增加),支持10GbE和 InfiniBand等高速网络互联。 (2)Gluster弹性哈希(ElasticHash)解决了GlusterFS对元数据服务器的依赖,改善了单点故障和性能瓶颈,真正实现了并行化数据访问。GlusterFS采用弹性哈希算法在存储池中可以智能地定位任意数据分片(将数据分片存储在不同节点上),不需要查看索引或者向元数据服务器查询。高可用性
GlusterFS可以对文件进行自动复制,如镜像或多次复制,从而确保数据总是可以访问,甚至是在硬件故障的情况下也能正常访问。 当数据出现不一致时,自我修复功能能够把数据恢复到正确的状态,数据的修复是以增量的方式在后台执行,几乎不会产生性能负载。 GlusterFS可以支持所有的存储,因为它没有设计自己的私有数据文件格式,而是采用操作系统中主流标准的磁盘文件系统(如EXT3、XFS等)来存储文件,因此数据可以使用传统访问磁盘的方式被访问。全局统一命名空间
分布式存储中,将所有节点的命名空间整合为统一命名空间,将整个系统的所有节点的存储容量组成一个大的虚拟存储池,供前端主机访问这些节点完成数据读写操作。弹性卷管理
GlusterFS通过将数据储存在逻辑卷中,逻辑卷从逻辑存储池进行独立逻辑划分而得到。 逻辑存储池可以在线进行增加和移除,不会导致业务中断。逻辑卷可以根据需求在线增长和缩减,并可以在多个节点中实现负载均衡。 文件系统配置也可以实时在线进行更改并应用,从而可以适应工作负载条件变化或在线性能调优。基于标准协议
Gluster 存储服务支持 NFS、CIFS、HTTP、FTP、SMB 及 Gluster原生协议,完全与 POSIX 标准(可移植操作系统接口)兼容。 现有应用程序不需要做任何修改就可以对Gluster 中的数据进行访问,也可以使用专用 API 进行访问。
2.ClusterFS 术语
-
Brick(存储块):
在 GlusterFS 中,Brick 是存储的基本单元,由可信主机提供,可以是一个专用的分区或目录。每个 Brick 通过格式SERVER:EXPORT
表示,例如192.168.91.100:/data/mydir/
。 -
Volume(逻辑卷):
Volume 是由多个 Bricks 组成的逻辑集合体,用于数据存储。它类似于 LVM 中的逻辑卷,管理 GlusterFS 群集的主要操作通常是在 Volume 层面上进行的。 -
FUSE:
FUSE (Filesystem in Userspace) 是一个内核模块,允许用户在用户空间创建文件系统,无需修改内核代码。它使得 GlusterFS 可以向用户空间应用程序提供文件系统接口。 -
VFS:
VFS (Virtual File System) 提供了一个内核层面的抽象接口,允许用户空间进程访问各种类型的文件系统。它促进了用户空间应用程序与磁盘存储之间的交互。 -
Glusterd(后台管理进程):
Glusterd 是在 GlusterFS 群集的每个节点上运行的管理守护进程。它负责管理配置和操作,如卷的创建、删除和重新平衡。 -
条带:
条带是 GlusterFS 中的一种数据分布技术,它将文件分割成固定大小的块(条带),然后按顺序存储在多个 Brick 上。每个条带的大小可以根据需要进行配置,默认大小为 4MB。
3.GlusterFS 的工作流程
(1)客户端或应用程序通过 GlusterFS 的挂载点访问数据。
(2)linux系统内核通过 VFS API 收到请求并处理。
(3)VFS 将数据递交给 FUSE 内核文件系统,并向系统注册一个实际的文件系统 FUSE,而 FUSE 文件系统则是将数据通过 /dev/fuse 设备文件递交给了 GlusterFS client 端。可以将 FUSE 文件系统理解为一个代理。
(4)GlusterFS client 收到数据后,client 根据配置文件的配置对数据进行处理。
(5)经过 GlusterFS client 处理后,通过网络将数据传递至远端的 GlusterFS Server,并且将数据写入到服务器存储设备上。
4.弹性hash算法
弹性 HASH 算法是 Davies-Meyer 算法的具体实现,通过 HASH 算法可以得到一个 32 位的整数范围的 hash 值, 假设逻辑卷中有 N 个存储单位 Brick,则 32 位的整数范围将被划分为 N 个连续的子空间,每个空间对应一个 Brick。
当用户或应用程序访问某一个命名空间时,通过对该命名空间计算 HASH 值,根据该 HASH 值所对应的 32 位整数空间定位数据所在的 Brick。#弹性 HASH 算法的优点:
保证数据平均分布在每一个 Brick 中。 解决了对元数据服务器的依赖,进而解决了单点故障以及访问瓶颈。
5.GlusterFS 的卷类型
5.1分布式卷 (Distributed Volume)
数据以条带方式分布在多个存储服务器上,没有数据冗余和复制。适合于大规模数据存储,但不提供数据冗余性。
分布式卷特点
文件分布在不同的服务器,不具备冗余性。
更容易和廉价地扩展卷的大小。
单点故障会造成数据丢失。
依赖底层的数据保护。
5.2 条带卷 (Striped Volume)
数据被分成固定大小的条带,并分布在多个存储服务器上。主要目的是提高数据读写性能,但不提供数据冗余性。
条带卷特点
数据被分割成更小块分布到块服务器群中的不同条带区。
分布减少了负载且更小的文件加速了存取的速度。
没有数据冗余。
5.3 复制卷 (Replicated Volume)
数据被复制到多个存储服务器上,提供数据的冗余备份。适合需要数据高可用性和冗余的场景,但是消耗更多的存储空间。
复制卷特点
卷中所有的服务器均保存一个完整的副本。
卷的副本数量可由客户创建的时候决定,但复制数必须等于卷中 Brick 所包含的存储服务器数。
至少由两个块服务器或更多服务器。
具备冗余性。
5.4 分布式条带卷 (Distributed Striped Volume)
将数据以条带方式分布在多个存储服务器上,并且没有数据冗余。这种卷类型结合了分布式和条带的特性,旨在提高存储性能。
5.5 分布式复制卷 (Distributed Replicated Volume)
数据被复制到多个存储服务器上,并且以条带方式分布。提供了数据的冗余备份和分布式存储的优势,适合需要高可用性和性能的应用。
5.6 条带复制卷 (Striped Replicated Volume)
数据被分成固定大小的条带,并且每个条带被复制到多个存储服务器上。结合了条带和复制的优点,提供了数据的冗余备份和更好的性能。
5.7 分布式条带复制卷 (Distributed Striped Replicated Volume)
数据被分成固定大小的条带,然后分布到多个存储服务器上,并且每个条带被复制到其他存储服务器上。这种卷类型结合了分布式、条带和复制的特性,提供了高性能和高可用性。
二.部署 GFS
节点 | 磁盘 | 挂载点 |
---|---|---|
node1/192.168.240.10 | /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 | /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 |
node2/192.168.240.11 | /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 | /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 |
node3/192.168.240.12 | /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 | /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 |
node4/192.168.240.13 | /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde | /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 |
node5/192.168.240.14 |
服务端:192.168.240.10
192.168.240.11
192.168.240.12
192.168.240.13
客户机:192.168.240.14 node5
1.服务端前期准备
1.1 关闭防火墙和selinux,客户端也要关
systemctl stop firewalld
setenforce 0
1.2 修改主机名
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3
hostnamectl set-hostname node4
hostnamectl set-hostname node5
echo "192.168.240.10 node1" >> /etc/hosts
echo "192.168.240.11 node2" >> /etc/hosts
echo "192.168.240.12 node3" >> /etc/hosts
echo "192.168.240.13 node4" >> /etc/hosts
echo "192.168.240.14 node5" >> /etc/hosts
1.3 添加硬盘
给每个主机添加四块硬盘 ,添加完使用命令刷新
echo "- - -" > /sys/class/scsi_host/host0/scan
echo "- - -" > /sys/class/scsi_host/host1/scan
echo "- - -" > /sys/class/scsi_host/host2/scan
查看硬盘
1.4 磁盘分区,格式化,并挂载
vim /opt/fdisk.sh
#!/bin/bash
NEWDEV=`ls /dev/sd* | grep -o 'sd[b-z]' | uniq`
for VAR in $NEWDEV
do
echo -e "n\np\n\n\n\nw\n" | fdisk /dev/$VAR &> /dev/null
mkfs.xfs /dev/${VAR}"1" &> /dev/null
mkdir -p /data/${VAR}"1" &> /dev/null
echo "/dev/${VAR}"1" /data/${VAR}"1" xfs defaults 0 0" >> /etc/fstab
done
mount -a &> /dev/null
chmod +x /opt/fdisk.sh
cd /opt/
./fdisk.sh
2.服务端准备yum源
#将gfsrepo 软件上传到/opt目录下
cd /opt
解压gfsrepo.zip包
unzip gfsrepo.zip
cd /etc/yum.repos.d/
mkdir repo.bak
mv *.repo repo.bak
vim glfs.repo
[glfs]
name=glfs
baseurl=file:///opt/gfsrepo
gpgcheck=0
enabled=1
yum clean all && yum makecache
#yum -y install centos-release-gluster #如采用官方 YUM 源安装,可以直接指向互联网仓库
3.安装GFS
yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
systemctl enable --now glusterd.service
systemctl status glusterd.service
4.添加节点到存储信任池中
node1节点上操作
#只要在一台Node节点上添加其它节点即可
gluster peer probe node1
gluster peer probe node2
gluster peer probe node3
gluster peer probe node4
#在每个Node节点上查看群集状态
gluster peer status
5.安装客户端
1.安装客户端软件
#将gfsrepo 软件上传到/opt目下
unzip gfsrepo.zip
cd /etc/yum.repos.d/
mkdir repo.bak
mv *.repo repo.bak
vim glfs.repo
[glfs]
name=glfs
baseurl=file:///opt/gfsrepo
gpgcheck=0
enabled=1
yum clean all && yum makecache
yum -y install glusterfs glusterfs-fuse
mkdir -p /test/{dis,stripe,rep,dis_stripe,dis_rep}
ls /test
6.建立卷
----- 创建卷 -----
#根据规划创建如下卷:
卷名称 | 卷类型 | Brick |
---|---|---|
dis-volume | 分布式卷 | node1(/data/sdb1)、node2(/data/sdb1) |
stripe-volume | 条带卷 | node1(/data/sdc1)、node2(/data/sdc1) |
rep-volume | 复制卷 | node3(/data/sdb1)、node4(/data/sdb1) |
dis-stripe | 分布式条带卷 | node1(/data/sdd1)、node2(/data/sdd1)、node3(/data/sdd1)、node4(/data/sdd1) |
dis-rep | 分布式复制卷 | node1(/data/sde1)、node2(/data/sde1)、node3(/data/sde1)、node4(/data/sde1) |
6.1 分布式卷
建立分布式卷
[root@node1 data]# gluster volume create dis-volume node1:/data/sdb1 node2:/data/sdb1 force
启动分布式卷
#启动新建分布式卷
gluster volume start dis-volume
查看创建分布式卷信息
#查看创建分布式卷信息
gluster volume info dis-volume
查看卷列表
#查看卷列表
gluster volume list
在客户端挂载
创建挂载目录
mkdir -p /test/{dis,stripe,rep,dis_stripe,dis_rep}
ls /test
[root@node1 data]# mount.glusterfs node1:dis-volume /test/dis
#node1 主机名
dis-volume 卷名
/test/dis 挂载点
#永久挂载
vim /etc/fstab
node1:dis-volume /test/dis glusterfs defaults,_netdev 0 0
存储文件验证,在客户端执行
cd /test/dis
方法一
for i in {1..5}
do
dd if=/dev/zero of=log${i} count=1 bs=40M
done
方法二
dd if=/dev/zero of=log1 bs=1M count=40
dd if=/dev/zero of=log2 bs=1M count=40
dd if=/dev/zero of=log3 bs=1M count=40
dd if=/dev/zero of=log4 bs=1M count=40
dd if=/dev/zero of=log5 bs=1M count=40
在服务器端验证
cd /data/sdb1
6.2 条带卷
创建条带卷
gluster volume create stripe-volume stripe 2 node1:/data/sdc1 node2:/data/sdc1 force
#stripe 2 条带数为2 服务器数也要为2
开启条带卷
gluster volume start stripe-volume
查看条带卷信息
gluster volume info stripe-volume
在客户端挂载
mount.glusterfs node1:stripe-volume /test/stripe
vim /etc/fstab
node1:stripe-volume /test/stripe glusterfs defaults,_netdev 0 0
在客户端建立文件
cd /test/stripe
for i in {1..5}
do
dd if=/dev/zero of=log${i} count=1 bs=40M
done
dd if=/dev/zero of=log1 bs=1M count=40
dd if=/dev/zero of=log2 bs=1M count=40
dd if=/dev/zero of=log3 bs=1M count=40
dd if=/dev/zero of=log4 bs=1M count=40
dd if=/dev/zero of=log5 bs=1M count=40
服务端验证
#数据被分片50% 没副本 没冗余
6.3 复制卷
创建复制卷
gluster volume create rep-volume replica 2 node3:/data/sdb1 node4:/data/sdb1 force
开启复制卷
gluster volume start rep-volume
查看复制卷
gluster volume info rep-volume
客户端上挂载
mount.glusterfs node1:dis-rep /test/rep/
#挂载就一直挂载在 node1上
永久挂载
vim /etc/fstab
node1:rep-volume /test/rep glusterfs defaults,_netdev 0 0
在客户端上生成文件测试
cd /test/rep
for i in {1..5}
do
dd if=/dev/zero of=log${i} count=1 bs=40M
done
dd if=/dev/zero of=log1 bs=1M count=40
dd if=/dev/zero of=log2 bs=1M count=40
dd if=/dev/zero of=log3 bs=1M count=40
dd if=/dev/zero of=log4 bs=1M count=40
dd if=/dev/zero of=log5 bs=1M count=40
在服务器查看
6.4 分布式条带卷
创建分布式条带卷
#指定类型为 stripe,数值为 2,而且后面跟了 4 个 Brick Server,是 2 的两倍,所以创建的是分布式条带卷
gluster volume create dis-stripe stripe 2 node1:/data/sdd1 node2:/data/sdd1 node3:/data/sdd1 node4:/data/sdd1 force
开启分布式条带卷
gluster volume start dis-stripe
查看分布式条带卷
gluster volume info dis-stripe
在客户端挂载
cd /test/dis_stripe
mount.glusterfs node1:dis-stripe /test/dis_stripe
vim /etc/fstab
node1:dis-stripe /test/dis_stripe glusterfs defaults,_netdev 0 0
在客户端建立文件测试
for i in {1..8}
do
dd if=/dev/zero of=log${i} count=1 bs=40M
done
dd if=/dev/zero of=log bs=1M count=40
dd if=/dev/zero of=log bs=1M count=40
dd if=/dev/zero of=log bs=1M count=40
dd if=/dev/zero of=log bs=1M count=40
dd if=/dev/zero of=log bs=1M count=40
服务端切换到/data/sdd1下查看
6.5 分布式复制卷
创建分布式复制卷
#指定类型为 replica,数值为 2,而且后面跟了 4 个 Brick Server,是 2 的两倍,所以创建的是分布式复制卷
gluster volume create fbfz replica 2 node1:/data/sde1 node2:/data/sde1 node3:/data/sde1 node4:/data/sde1 force
开启分布式复制卷
gluster volume start fbfz
查看分布式卷
gluster volume info fbfz
在客户端挂载
cd /test/dis_rep
mount.glusterfs node1:fbfz /test/dis_rep
vim /etc/fstab
node1:fbfz /test/dis_rep glusterfs defaults,_netdev 0 0
在主上创建文件验证
for i in {1..8}
do
dd if=/dev/zero of=log${i} count=1 bs=40M
done
dd if=/dev/zero of=log bs=1M count=40
dd if=/dev/zero of=log bs=1M count=40
dd if=/dev/zero of=log bs=1M count=40
dd if=/dev/zero of=log bs=1M count=40
dd if=/dev/zero of=log bs=1M count=40
服务端切换到/data/sde1下查看
6.7 破化性测试
----- 破坏性测试 -----
#挂起 node2 节点或者关闭glusterd服务来模拟故障
[root@node2 ~]# systemctl stop glusterd.service
#在客户端上查看文件是否正常
#分布式卷数据查看
[root@localhost test]# ll /test/dis/ #在客户机上发现少了demo5.log文件,这个是在node2上的
总用量 163840
-rw-r--r-- 1 root root 41943040 12月 18 14:50 demo1.log
-rw-r--r-- 1 root root 41943040 12月 18 14:50 demo2.log
-rw-r--r-- 1 root root 41943040 12月 18 14:50 demo3.log
-rw-r--r-- 1 root root 41943040 12月 18 14:50 demo4.log
#条带卷
[root@localhost test]# cd /test/stripe/ #无法访问,条带卷不具备冗余性
[root@localhost stripe]# ll
总用量 0
#分布式条带卷
[root@localhost test]# ll /test/dis_stripe/ #无法访问,分布条带卷不具备冗余性
总用量 40960
-rw-r--r-- 1 root root 41943040 12月 18 14:51 demo5.log
#分布式复制卷
[root@localhost test]# ll /test/dis_rep/ #可以访问,分布式复制卷具备冗余性
总用量 204800
-rw-r--r-- 1 root root 41943040 12月 18 14:52 demo1.log
-rw-r--r-- 1 root root 41943040 12月 18 14:52 demo2.log
-rw-r--r-- 1 root root 41943040 12月 18 14:52 demo3.log
-rw-r--r-- 1 root root 41943040 12月 18 14:52 demo4.log
-rw-r--r-- 1 root root 41943040 12月 18 14:52 demo5.log
#挂起 node2 和 node4 节点,在客户端上查看文件是否正常
#测试复制卷是否正常
[root@localhost rep]# ls -l /test/rep/ #在客户机上测试正常 数据有
总用量 204800
-rw-r--r-- 1 root root 41943040 12月 18 14:51 demo1.log
-rw-r--r-- 1 root root 41943040 12月 18 14:51 demo2.log
-rw-r--r-- 1 root root 41943040 12月 18 14:51 demo3.log
-rw-r--r-- 1 root root 41943040 12月 18 14:51 demo4.log
-rw-r--r-- 1 root root 41943040 12月 18 14:51 demo5.log
#测试分布式条卷是否正常
[root@localhost dis_stripe]# ll /test/dis_stripe/ #在客户机上测试没有数据
总用量 0
#测试分布式复制卷是否正常
[root@localhost dis_rep]# ll /test/dis_rep/ #在客户机上测试正常 有数据
总用量 204800
-rw-r--r-- 1 root root 41943040 12月 18 14:52 demo1.log
-rw-r--r-- 1 root root 41943040 12月 18 14:52 demo2.log
-rw-r--r-- 1 root root 41943040 12月 18 14:52 demo3.log
-rw-r--r-- 1 root root 41943040 12月 18 14:52 demo4.log
-rw-r--r-- 1 root root 41943040 12月 18 14:52 demo5.log
7.维护命令
#查看GlusterFS卷
gluster volume list
#查看所有卷的信息
gluster volume info
#查看所有卷的状态
gluster volume status
#停止一个卷
gluster volume stop dis-stripe
#删除一个卷,注意:删除卷时,需要先停止卷,且信任池中不能有主机处于宕机状态,否则删除不成功
gluster volume delete dis-stripe
#设置卷的访问控制
#仅拒绝
gluster volume set dis-rep auth.deny 192.168.240.10
#仅允许
gluster volume set dis-rep auth.allow 192.168.240.* #设置192.168.240.0网段的所有IP地址都能访问dis-rep卷(分布式复制卷)