CentOS7.6——如何构建GFS分布式文件系统?
一:GlusterFS(GFS)概述
1.1:GlusterFS简介
- 开源的分布式文件系统
- 有存储服务器、客户端以及NFS/Samba存储网关组成
- 无元数据服务器
1.2:GlusterFS特点
- 扩展性和高性能
- 高可用性
- 全局统一命名空间
- 弹性卷管理
- 基于标准协议
1.3:GlusterFS常用术语
- Brick:GFS中的存储单元,通过是一个受信存储池中的服务器的一个导出目录。可以通过主机名和目录名来标识,如’SERVER:EXPORT’
- Volume:卷
- FUSE:内核文件系统,Filesystem Userspace是一个可加载的内核模块,其支持非特权用户创建自己的文件系统而不需要修改内核代码。通过在用户空间运行文件系统的代码通过FUSE代码与内核进行桥接。
- VFS:虚拟文件系统
- Glusterd:Gluster management daemon,要在trusted storage pool中所有的服务器上运行。
1.4:GFS的结构
- 模块化堆栈式架构
- 模块化、堆栈式的架构
- 通过对模块的组合,实现复杂的功能
二:GlusterFS工作原理
2.1:GlusterFS工作流程
- 1、客户端或应用程序通过GlusterFS的挂载点访问数据
- 2、linux系统内核通过VFS API收到请求并处理
- 3、VFS将数据递交给FUSE内核文件系统, fuse文件系统则是将数据通过/dev/fuse设备文件递交给了GlusterFS client端
- 4、GlusterFS client 收到数据后,client根据配置文件的配置对数据进行处理
- 5、通过网络将数据传递至远端的GlusterFS Server,并且将数据写入到服务器存储设备上
2.2:弹性HASH算法
- 通过hash算法得到一个32位的整数
- 划分为n个连续的子空间,每个空间对应一个Brick
- 弹性hash算法的优点
- 保证数据平均分布在每一个Brick中
- 解决了对元数据服务器的依赖,进而解决了单点故障以及访问瓶颈
三:GlusterFS的卷类型
- 分布式卷
- 条带卷
- 复制卷
- 分布式条带卷
- 分布式复制卷
- 条带复制卷
- 分布式条带复制卷
3.1:分布式卷
- 没有对文件进行分块处理
- 通过扩展文件属性保存HASH值
- 支持的底层文件系统有ext3、ext4、ZFS、XFS等
- 特点
- 文件分布在不同的服务器,不具备冗余性
- 更容易和廉价地扩展卷的大小
- 单点故障会造成数据丢失
- 依赖底层的数据保护
- 使用场景:如果不知道文件有多大时,用分布式,安全性低
- 创建分布式卷
- 创建一个名为dis-volume的分布式卷,文件将根据hash分布在server1:/dir1、server2:/dir2
gluster volume create dis-volume server1:/dir1 server2:/dir2
3.2:条带卷
- 根据偏移量将文件分成N块(N个条带节点),轮询的存储在每个Brick Server节点
- 存储大文件时,性能尤为突出
- 不具备冗余性,类似Raid0
-
特点
- 数据被分割成更小块分布到块服务器群中的不同条带区
- 分布减少了负载且更小的文件加速了存取的速度
- 没有数据冗余
-
创建条带卷
- 创建一个名为Stripe-volume的条带卷,文件将被分块轮询的存储在Server1:/dir1和Server2:/dir2两个Brick中
gluster volume create stripe-volume stripe 2 transport tcp server1:/dir1 server2:/dir2
3.3:复制卷
- 同一文件保存一份或多分副本
- 复制模式因为要保存副本,所以磁盘利用率较低
- 多个节点上的存储空间不一致,那么将按照木桶效应取最低节点的容量作为该卷的总容量
-
特点
- 卷中所有的服务器均保存一个完整的副本
- 卷的副本数量可由客户创建的时候决定
- 至少由两个块服务器或更多服务器
- 具备冗余性
-
创建复制卷
- 创建名为rep-volume的复制卷,文件将同时存储两个副本,分别在Server1:/dir1和Server2:/dir2两个Brick中
gluster volume create rep-volume replica 2 transport tcp server1:/dir1 server2:/dir2
3.4:分布式条带卷
- 兼顾分布式卷和条带卷的功能
- 主要用于大文件访问处理
- 至少最少需要 4 台服务器
- 创建分布式条带卷
- 创建了名为dis-stripe的分布式条带卷,配置分布式的条带卷时,卷中Brick所包含的存储服务器数必须是跳袋鼠的倍数(>=2倍)
gluster volume create dis-stripe stripe 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server:/dir4
3.5:分布式复制卷
-
兼顾分布式卷和复制卷的功能
-
用于需要冗余的情况下
-
创建分布式复制卷
- 创建名为dis-rep的分布式条带卷,配置分布式复制卷时,卷中Brick所包含的存储服务器数必须是条带数的倍数(>=2)
gluster volume create dis-rep replica 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server:/dir4
四:GFS部署
4.1:群集环境
- 卷类型
卷名称 | 卷类型 | 节点 |
---|---|---|
dis-volume | 分布式卷 | node1,node2 |
stripe-volume | 条带卷 | node1,node2 |
rep-volume | 复制卷 | node3,node4 |
dis-stripe | 分布式条带卷 | node1,2,3,4 |
dis-rep | 分布式复制卷 | node1,2,3,4 |
4.2:实验步骤
-
添加磁盘并重启
- 添加磁盘–仅展示其中一个界面,添加步骤都相同
- 虚拟机设置----添加----硬盘,下一步----SCSI(推荐),下一步----创建新的虚拟磁盘,下一步----最大磁盘大小(自定义),勾选将虚拟磁盘拆分成多个文件,下一步----完成,相同方法添加其他的磁盘(除了client客户机),磁盘添加后需要重启一下才能识别到磁盘
-
init 6:重启
-
查看磁盘分区情况,仅以node1为例,写一个脚本,为指定的磁盘创建分区并格式化
[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# setenforce 0
[root@node1 ~]# fdisk -l '查看磁盘是否添加成功'
[root@node1 ~]# cd /opt
[root@node1 opt]# mkdir abc
[root@node1 opt]# vim disk.sh
#! /bin/bash
echo "the disks exist list:"
##grep出系统所带磁盘
fdisk -l |grep '磁盘 /dev/sd[a-z]'
echo "=================================================="
PS3="chose which disk you want to create:"
##选择需要创建的磁盘编号
select VAR in `ls /dev/sd*|grep -o 'sd[b-z]'|uniq` quit
do
case $VAR in
sda)
##本地磁盘就退出case语句
fdisk -l /dev/sda
break ;;
sd[b-z])
#create partitions
echo "n ##创建磁盘
p
w" | fdisk /dev/$VAR
#make filesystem
##格式化
mkfs.xfs -i size=512 /dev/${VAR}"1" &> /dev/null
#mount the system
mkdir -p /data/${
VAR}"1" &> /dev/null
###永久挂载
echo -e "/dev/${VAR}"1" /data/${VAR}"1" xfs defaults 0 0\n" >> /etc/fstab
###使得挂载生效
mount -a &> /dev/null
break ;;
quit)
break;;
*)
echo "wrong disk,please check again";;
esac
done
[root@node1 opt]# chmod +x disk.sh
[root@node1 opt]# ./disk.sh '执行脚本,进行自动挂载'
- 查看挂载情况
[root@node1 ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sdb1 xfs 20.0G 0 20.0G 1% /data/sdb1
/dev/sdc1 xfs 20.0G 0 20.0G 1% /data/sdc1
/dev/sdd1 xfs 20.0G 0 20.0G 1% /data/sdd1
/dev/sde1 xfs 20.0G 0 20.0G 1% /data/sde1
[root@node2 ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sdb1 xfs 20.0G 0 20.0G 1% /data/sdb1
/dev/sdc1 xfs 20.0G 0 20.0G 1% /data/sdc1
/dev/sdd1 xfs 20.0G 0 20.0G 1% /data/sdd1
/dev/sde1 xfs 20.0G 0 20.0G 1% /data/sde1
[root@node3 ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sdb1 xfs 20.0G 0 20.0G 1%