目录
一、概述
1、开源的分布式文件系统
2、由存储服务器(块block服务器)、客户端及NFS/Samba存储网关组成
3、无元数据服务器
4、模块化、堆栈式建构
5、通过模块的组合,实现复杂的功能
二、特点
一、分布式特点
1、扩展性和高性能
2、高可用性
二、GFS特点
1、全局同一命名空间(共享资源)
2、弹性管理卷(RAID)
3、基于标准协议(客户端和存储服务器之间交互需要借助网络)
三、术语
术语 | 含义 |
---|---|
brick | 存储服务器:实际存储用户数据的服务器 |
volume | 本地文件系统的"分区” |
FUSE | 用户空间的文件系统(类比EXT4)(伪文件系统)以本地文件系统为例,用户想要读写一个文件,会借助于EXT4文件系统,然后把数据写在磁盘上而如果是远端的GFS,客户端的请求则应该交给FUSE(伪文件系统),就可以实现跨界点存储在GFS上 |
FUSE(用户空间的文件系统) | 伪文件系统用户端的交互模块 |
VFS(虚拟端口) | 内核态的虚拟文件系统,用户是先提交请求交给VFS然后VFS交给FUSE再交给GFS客户端,最后由客户端交给远端的存储 |
四、GFS工作过程
Application
客户端或应用程序通过GlusterFSync的挂载点访问数据。
VFS
linux系统内核通过VFS API收到请求并处理。
FUSE
VPS将数据递交给FUSE内核文件系统,fuse文件系统则是将数据通过/dev/fuse设备文件递交给了GFS client端。
GFS Client
通过网络将数据传递至远端的GFS Server,并且写入到服务器存储设备上。
一、写
客户端在本地发出读写请求,然后交由VFS 的API接受请求,接受请求后会交给FUSE(内核伪文件系统),FUSE可以模拟操作系统,所以可以对文件系统进行转存,转存的设备位置为:/dev/fuse(用于传输的设备-虚拟设备文件)交给GFs客户端,client会根据配置文件对数据进行处理,然后再通过TCP/ib/rdma网络发送到GFs服务端,并且将数据写到服务器存储设备上。
二、读
通过page函数调用模块read,读取缓存,如果缓存没有,gfs就数据保存到缓存中。
五、如何提高GFS工作效率
1、gige: 千兆网/干兆接口
2、TCP/IP:网络协议
3、InfiniBand:网络协议,与TCP/IP相比,TCP/IP具有转发丢失数据包的特性,基于此通讯协议可能导致通讯变慢,而1s使用基于信任的、流控制的机制来确保连接完整性,数据包丢失几率小。
4、RDMA:负责数据传输,有一种数据传输协议。
功能:为了解决传输中客户端与服务器端数据处理的延迟。
5、POSIX:可移植操作系统接口,主要解决不同操作系统间的移植性。
6、转换为逻辑存储(EXT4 +BRICK)。
六、卷分类
GFS支持七种卷,即分布式卷、条带卷、复制卷、分布式条带卷、分布式复制卷、条带复制卷和分布式条带复制卷。
一、分布式卷
分布式卷(默认):文件通过HASH算法分布到所有 Brick Server 上,是GFS的基础。以文件为单位根据HASH算法散列到不同的Brick,其实只是扩大了磁盘空间,如果有一块磁盘损坏,数据也将丢失,属于文件级的RAID 0,不具有容错能。
ps
两个brick中,文件的存放:n-1:1
二、条带卷
条带卷(默认):类似RAID0,文件被分成数据块并以轮询的方式分布到多个Brick Server上,文件存储以数据块为单位,支持大文件存储,文件越大,读取效率越高。
ps
文件的存放:1:1
三、复制卷
复制卷(Replica volume):将文件同步到多个Brick 上,使其具备多个文件副本,属于文件级RAID1,具有容错能力。因为数据分散在多个Brick 中,所以读性能得到很大提升,但写性能下降。
ps
文件存放为brick服务器中的文件一致,冗余。
四、分布式条带卷
分布式条带卷(Distribute Stripe volume) : Brick Server 数量是条带数(数据块分布的Brick数量)的倍数,兼具分布式卷和条带卷的特点。
五、分布式复制卷
分布式复制卷(Distribute Replica volume) : Brick Server 数量是镜像数(数据副本数量)的倍数,兼具分布式卷和复制卷的特点。
六、条带复制卷
条带复制卷(stripe Replica volume):类似RAID 10,同时具有条带卷和复制卷的特点。
七、分布式条带复制卷
分布式条带复制卷(Distribute stripe Replicavolume):三种基本卷的复合卷,通常用于类Map Reduce应用。
七、实验
一、部署
实验环境
GFS:
Node1:129.168.238.150
Node2:129.168.238.100
Node3:129.168.238.99
Node4:129.168.238.133
client:192.168.238.134
四台GFS节点
[root@node1 opt]# cd /opt
[root@node1 opt]# vim fdisk.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 fdisk.sh #赋予可执行权限
[root@node1 opt]# ./fdisk.sh #进行磁盘分区
[root@node1 opt]# df -Th #查看分区和挂载
[root@node1 opt]# vim /etc/hosts #每个节点做地址映射
安装GFS
[root@node1 opt]# cd /etc/yum.repos.d/
[root@node1 yum.repos.d]# mkdir repo.bak
[root@node1 yum.repos.d]# mv *.repo repo.bak
[root@node1 yum.repos.d]# cd /opt
[root@node1 opt]# rz #上传gfsrepo软件包
[root@node1 opt]# unzip gfsrepo.zip #解包
[root@node1 opt]# vim /etc/yum.repos.d/gfs.repo #配置yum本地源
[glfs]
name=glfs
baseurl=file:///opt/gfsrepo
gpgcheck=0 #不做检测
enabled=1 #启用
[root@node1 opt]# cd /etc/yum.repos.d/
[root@node1 yum.repos.d]# yum clean all && yum makecache
[root@node1 yum.repos.d]# yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma #yum安装GFS及其组件
[root@node1 yum.repos.d]# systemctl start glusterd #开启服务
[root@node1 yum.repos.d]# netstat -antp | grep glusterd #查看端口
tcp 0 0 0.0.0.0:24007 0.0.0.0:* LISTEN 20705/glusterd
[root@node1 yum.repos.d]# ntpdate ntp1.aliyun.com #同步阿里云时钟服务器
添加节点到存储信任池中 (在node1中添加)
[root@node1 yum.repos.d]# gluster peer probe node1
[root@node1 yum.repos.d]# gluster peer probe node2
[root@node1 yum.repos.d]# gluster peer probe node3
[root@node1 yum.repos.d]# gluster peer probe node4
#在每台node节点中查看
[root@node1 yum.repos.d]# gluster peer status #查看集群状态
二、创建卷
根据规则划分:
卷名称 | 卷类型 | 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) |
一、分布式卷
[root@node1 yum.repos.d]# gluster volume create dis-volume node1:/data/sdb1 node2:/data/sdb1 force #创建分布式卷,没有指定类型,默认创建的是分布式卷
[root@node1 yum.repos.d]# gluster volume list #查看卷列表
[root@node1 yum.repos.d]# gluster volume start dis-volume #启动新建的分布式卷
[root@node1 yum.repos.d]# gluster volume info dis-volume #查看出创建的分布式卷的信息
二、条带卷
[root@node1 yum.repos.d]# gluster volume create stripe-volume stripe 2 node1:/data/sdc1 node2:/data/sdc1 force #创建条带卷
[root@node1 yum.repos.d]# gluster volume start stripe-volume #开启条带卷
[root@node1 yum.repos.d]# gluster volume info stripe-volume #查看创建的条带卷信息
三、复制卷
[root@node1 yum.repos.d]# gluster volume create rep-volume replica 2 node3:/data/sdb1 node4:/data/sdb1 force #创建复制卷
[root@node1 yum.repos.d]# gluster volume start rep-volume #开启卷
[root@node1 yum.repos.d]# gluster volume info rep-volume 查看卷
四、分布式条带卷
[root@node1 yum.repos.d]# gluster volume create dis-stripe stripe 2 node1:/data/sdd1 node2:/data/sdd1 node3:/data/sdd1 node4:/data/sdd1 force #创建卷
[root@node1 yum.repos.d]# gluster volume start dis-stripe #快开启卷
[root@node1 yum.repos.d]# gluster volume info dis-stripe #查看卷
五、分布式复制卷
[root@node1 yum.repos.d]# gluster volume create dis-rep replica 2 node1:/data/sde1 node2:/data/sde1 node3:/data/sde1 node4:/data/sde1 force #创建卷
[root@node1 yum.repos.d]# gluster volume start dis-rep #开启卷
[root@node1 yum.repos.d]# gluster volume info dis-rep #查看卷
八、验证
一、部署客户端
[root@localhost ~]# cd /opt
[root@localhost opt]# rz #上传软件包
[root@localhost opt]# unzip gfsrepo.zip #解包
[root@localhost opt]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# mkdir repo.bak
[root@localhost yum.repos.d]# mv *.repo repo.bak
[root@localhost yum.repos.d]# vim glfs.repo
[root@localhost yum.repos.d]# ntpdate ntp.aliyun.com #同步时间
13 Aug 22:05:28 ntpdate[22083]: adjust time server 203.107.6.88 offset 0.000712 sec
[root@localhost yum.repos.d]# yum clean all && yum makecache
[root@localhost yum.repos.d]# yum -y install glusterfs glusterfs-fuse #更新软件包
创建挂载目录
[root@localhost yum.repos.d]# mkdir -p /test/{dis,stripe,rep,dis_stripe,dis_rep}
域名映射
[root@localhost yum.repos.d]# vim /etc/hosts
挂载目录
[root@localhost yum.repos.d]# mount.glusterfs node1:dis-volume /test/dis
[root@localhost yum.repos.d]# mount.glusterfs node1:stripe-volume /test/stripe
[root@localhost yum.repos.d]# mount.glusterfs node1:rep-volume /test/rep
[root@localhost yum.repos.d]# mount.glusterfs node1:dis-stripe /test/dis_stripe
[root@localhost yum.repos.d]# mount.glusterfs node1:dis-rep /test/dis_rep
[root@localhost yum.repos.d]# cd /opt
[root@localhost opt]# dd if=/dev/zero of=/opt/demo1.log bs=1M count=20
[root@localhost opt]# dd if=/dev/zero of=/opt/demo2.log bs=1M count=20
[root@localhost opt]# dd if=/dev/zero of=/opt/demo3.log bs=1M count=20
[root@localhost opt]# dd if=/dev/zero of=/opt/demo4.log bs=1M count=20
[root@localhost opt]# dd if=/dev/zero of=/opt/demo5.log bs=1M count=20
[root@localhost opt]# cp demo* /test/dis
[root@localhost opt]# cp demo* /test/stripe/
[root@localhost opt]# cp demo* /test/rep/
[root@localhost opt]# cp demo* /test/dis_stripe/
[root@localhost opt]# cp demo* /test/dis_rep/
1、分布式卷
2、条带卷
3、复制卷
4、分布式条带卷
5、分布式复制卷
九、破坏性测试
node2关闭服务
[root@node2 ~]# systemctl stop glusterd
查看客户端/test目录下的文件
由上图可见,只有带有复制卷的才有冗余,文件才安全。
维护命令
#查看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.238.150
##仅允许
gluster volume set dis-rep auth.allow 192.168.238.* #设置192.168.238.0网段的所有IP地址都能访问dis-rep卷(分布式复制卷)
小结:
分布式卷:数据没有被分片,没有冗余
条带卷:数据被分片50%,没有冗余
复制卷:数据没有被分片,有冗余
分布式条带卷:数据被分片50%,没有冗余
分布式复制卷:数据没有被分片,有冗余