GFS分布式文件系统
一、文件系统简介
1.1文件系统的组成
接口:文件系统接口
功能模块(管理、存储的工具):对对象管理里的软件集合
对象及属性:(使用此文件系统的消费者)
1.2文件系统的作用
从系统角度来看,文件系统时对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统
主要负责为用户建立文件、存入、读出、修改、转储文件,控制文件的存取
1.3文件系统的挂载使用
除跟文件系统以外的文件系统创建后要使用需要先挂载至挂载点后才可以被访问
挂载点即分区设备文件关联的某个目录文件
二、GFS分布式文件系统
2.1 GFS简介
GFS是一个可扩展、开源的分布式文件系统(可以很好的体现出弹性伸缩的特点),用于大型的、分布式的、对大量数据进行访问的应用,在传统的解决方案中,GFS 能够灵活的结合物理的,虚拟的和云资源去体现高可用和企业级的性能存储
GFS由三个组件组成
①存储服务器(Brick Server)
② 客户端(不在本地)(且,有客户端,也会有服务端,这点类似于 NFS,但是更为复杂)
③ 存储网关(NFS/Samaba)
2.2 GFS的特点
扩展性和高性能:可扩展性,扩展节点,通过多节点提高性能
高可用性:不存在单点故障,有备份机制,类似Raid的容灾机制
全局同意命名空间:类比 API 的性质/概念,系统里根据他命名所定义的隔离区域,是一个独立空间;统一的名称空间,与客户端交互,把请求存放至后端的块数据服务器
弹性卷管理:方便扩容及对后端存储集群的管理与维护,较为复杂
基于标准协议:基于标准化的文件使用协议,让 CentOS 兼容 GFS
2.3 GFS专业术语
Brick 存储服务器:实际存储用户数据的服务器
Volume:本地文件系统的"分区”
FUSE:用户 空间的文件系统(类比EXT4)
VFS(虚拟端口) :内核态的虚拟文件系统
Glusterd(服务):是允许在存储节点的进程
2.4 GFS 工作流程
2.5 服务器详解
Application:客户端或应用程序通过GlusterFSync的挂载点访问数据
VFS:linux系统内核通过VFS的API 收到请求并处理
FUSE:VFS将数据递交给FUSE内核文件系统,fuse文件系统则是将数据通过/dev/fuse设备文件递交给了GlusterFS
GlusterFS Client :通过网络将数据传递至远端的GlusterFS Server, 并且写入到服务器存储设备上
三、GFS卷类型
1、分布式卷(Distribute volume)
简单来说,就是如果有10个文件,如果不用分布式卷,这是个文件会放在一台服务器上,对于分布式而言,这是个文件是会分布在不同的服务器节点上进行保存。
①特点
文件分布在不同的服务器,不具备冗余性更容易和廉价地扩展卷的大小单点故障会造成数据丢失以来低层的数据保护
②原理
File1 和 File2 存放在 Server1,而 File3 存放在 Server2,文件都是随机存储,一个文件(如 File1)要么在 Server1 上,要么在 Server2 上,不能分块同时存放在 Server1和 Server2 上
2、条带卷 (Stripe volume)
类似 RAID0,文件被分成数据块并**以轮询的方式分布到多个 Brick Server 上**,文件存储以数据块为单位,支持大文件存储, 文件越大,读取效率越高,但是不具备冗余性
①原理
File 被分割为 6 段,1、3、5 放在 Server1,2、4、6 放在 Server2
②特点
根据偏移量将文件分成N块(N个条带点),轮询的存储在每个Brick Serve 节点.分布减少了负载,在存储大文件时,性能尤为突出.没有数据冗余,类似于Raid 0
3、复制卷(Replica volume)
将文件同步到多个 Brick 上,比如说我有五个文件,这5个文件是一个整体,放在服务器A上,复制卷会帮我们复制一份复制在服务器B上。属于文件级 RAID 1,具有容错能力。因为数据分散在多个 Brick 中,所以读性能得到很大提升,但写性能下降。复制卷具备冗余性,即使一个节点损坏,也不影响数据的正常使用。但因为要保存副本,所以磁盘利用率较低
①原理
File1 同时存在 Server1 和 Server2,File2 也是如此,相当于 Server2 中的文件是 Server1 中文件的副本
②特点
卷中所有的服务器均保存一个完整的副本。具备冗余性.卷的副本数量可由客户创建的时候决定,但复制数必须等于卷中 Brick 所包含的存储服务器数。至少由两个块服务器或更多服务器。若多个节点上的存储空间不一致,将按照木桶效应取最低节点的容量作为改卷的总容量
4、分布式条带卷(Distribute Stripe volume)
Brick Server 数量是条带数(数据块分布的 Brick 数量)的倍数,兼具分布式卷和条带卷的特点。 主要用于大文件访问处理,创建一个分布式条带卷最少需要 4 台服务器
①原理
File1 和 File2 通过分布式卷的功能分别定位到Server1和 Server2。
②创建分布式条带卷
创建卷时,存储服务器的数量如果等于条带或复制数,那么创建的是条带卷或者复制卷;如果存储服务器的数量是条带或复制数的 2 倍甚至更多,那么将创建的是分布式条带卷或分布式复制卷
5、分布式复制卷(Distribute Replica volume):Brick Server 数量是镜像数(数据副本数量)的倍数,兼具分布式卷和复制卷的特点,主要用于需要冗余的情况下
①原理
File1 和 File2 通过分布式卷的功能分别定位到 Server1 和 Server2。在存放 File1 时,File1 根据复制卷的特性,将存在两个相同的副本,分别是 Server1 中的exp1 目录和 Server2 中的 exp2 目录。在存放 File2 时,File2 根据复制卷的特性,也将存在两个相同的副本,分别是 Server3 中的 exp3 目录和 Server4 中的 exp4 目录
②创建分布式复制卷
建一个名为dis-rep的分布式复制卷,配置分布式的复制卷时,卷中Brick所包含的存储服务器数必须是复制数的倍数(>=2倍)。
四、GlusterFS群集部署
1、实验环境
主机名 | 主机地址 | 磁盘(4块) | 挂载点 |
node1 | 192.168.30.12 | /dev/sdb1--/dev/sde1 | /date/sdb1--/date/sde1 |
node2 | 192.168.30.13 | /dev/sdb1--/dev/sde1 | /date/sdb1--/date/sde1 |
node3 | 192.168.30.14 | /dev/sdb1--/dev/sde1 | /date/sdb1--/date/sde1 |
node4 | 192.168.30.15 | /dev/sdb1--/dev/sde1 | /date/sdb1--/date/sde1 |
pc1 | 192.168.30.11 |
2、磁盘配置
工具所有会话
systemctl stop firewalld setenforce 0 #关闭防火墙和selinux node1-node4执行 vim /etc/fdisk.sh #编写脚本分区格式化挂载4个磁盘,内容如下 #!/bin/bash NEWDEV=`ls /dev/sd* | grep -o 'sd[b-z]' | uniq` #定义变量调用命令执行结果,命令意思为显示/dev下的所有sd开头的文件过滤sdb-sdz去重显示 for VAR in $NEWDEV #for循环如果VAR在变量NEWDEV里面则执行 do echo -e "n\np\n\n\n\nw\n" | fdisk /dev/$VAR &> /dev/null #自动分区,输入回车然然后n添加硬盘p选择主分区然后回车w到保存回车传给分区命令,过程传给垃圾桶不显示 mkfs.xfs /dev/${VAR}"1" &> /dev/null #格式化新建的分区 mkdir -p /data/${VAR}"1" &> /dev/null #在/data/下创建以变量var1命名的文件夹,过程传给垃圾桶不显示 echo "/dev/${VAR}"1" /data/${VAR}"1" xfs defaults 0 0" >> /etc/fstab #挂载磁盘写入/etc/fstab中 done mount -a &> /dev/null #循环执行完毕检查加载/etc/fstab文件 chmod +x /opt/fdisk.sh #给脚本添加执行权限 /opt/fdisk.sh #绝对路径执行脚本 ③修改主机名配置hosts #根据规定的实验环境修改主机名,配置/etc/hosts文件 #以Node1节点为例: hostnamectl set-hostname node1 echo "192.168.30.12 node1" >> /etc/hosts echo "192.168.30.13 node2" >> /etc/hosts echo "192.168.30.14 node3" >> /etc/hosts echo "192.168.30.15 node4" >> /etc/hosts ④安装、启动GlusterFS node1-node4执行: #将gfsrepo 软件上传到/opt目录下解压,本博客资源中有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 #创建本地glfs的yum源并使用 yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma #yum 安装Gluster #此处若出现依赖关系错误问题则执行一下命令,原因是系统中存在的版本过高需要卸载 yum remove glusterfs-api.x86_64 glusterfs-cli.x86_64 glusterfs.x86_64 glusterfs-libs.x86_64
glusterfs-client-xlators.x86_64 glusterfs-fuse.x86_64 -y node1执行: #添加节点到存储信任池中 gluster peer probe node1 gluster peer probe node2 gluster peer probe node3 gluster peer probe node4 node1-node4执行: #在每个Node节点上查看群集状态 gluster peer status ⑤规划创建Gluster五种卷 卷名称 卷类型 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) ⑥创建分布式卷 #创建分布式卷,没有指定类型,默认创建的是分布式卷 gluster volume create dis-volume node1:/data/sdb1 node2:/data/sdb1 force #查看卷列表 gluster volume list #启动新建分布式卷 gluster volume start dis-volume #查看创建分布式卷信息 gluster volume info dis-volume ⑦创建条带卷 #指定类型为 stripe,数值为 2,且后面跟了 2 个 Brick Server,所以创建的是条带卷 gluster volume create stripe-volume stripe 2 node1:/data/sdc1 node2:/data/sdc1 force gluster volume start stripe-volume gluster volume info stripe-volume ⑧创建复制卷 #指定类型为 replica,数值为 2,且后面跟了 2 个 Brick Server,所以创建的是复制卷 gluster volume create rep-volume replica 2 node3:/data/sdb1 node4:/data/sdb1 force gluster volume start rep-volume gluster volume info rep-volume ⑨创建分布式条带卷 #指定类型为 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 ⑩创建分布式复制卷 #指定类型为 replica,数值为 2,而且后面跟了 4 个 Brick Server,是 2 的两倍,所以创建的是分布式复制卷 gluster volume create dis-rep replica 2 node1:/data/sde1 node2:/data/sde1 node3:/data/sde1 node4:/data/sde1 force gluster volume start dis-rep gluster volume info dis-rep #查看当前所有卷的列表 gluster volume list
3、客户端部署GlusterFS
客户端执行: #将gfsrepo 软件上传到/opt目录下解压,本博客资源中有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 #创建本地glfs的yum源并使用 yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma #yum 安装Gluster #此处若出现依赖关系错误问题则执行一下命令,原因是系统中存在的版本过高需要卸载 yum remove glusterfs-api.x86_64 glusterfs-cli.x86_64 glusterfs.x86_64
glusterfs-libs.x86_64 glusterfs-client-xlators.x86_64 glusterfs-fuse.x86_64 -y #创建挂载目录 mkdir -p /test/{dis,stripe,rep,dis_stripe,dis_rep} ls /test #配置/etc/hosts文件 echo "192.168.30.12 node1" >> /etc/hosts echo "192.168.30.13 node2" >> /etc/hosts echo "192.168.30.14 node3" >> /etc/hosts echo "192.168.30.15 node4" >> /etc/hosts #挂载Gluster文件系统 #临时挂载 mount.glusterfs node1:dis-volume /test/dis mount.glusterfs node1:stripe-volume /test/stripe mount.glusterfs node1:rep-volume /test/rep mount.glusterfs node1:dis-stripe /test/dis_stripe mount.glusterfs node1:dis-rep /test/dis_rep #永久挂载 vim /etc/fstab node1:dis-volume /test/dis glusterfs defaults,_netdev 0 0 node1:stripe-volume /test/stripe glusterfs defaults,_netdev 0 0 node1:rep-volume /test/rep glusterfs defaults,_netdev 0 0 node1:dis-stripe /test/dis_stripe glusterfs defaults,_netdev 0 0 node1:dis-rep /test/dis_rep glusterfs defaults,_netdev 0 0
4、验证卷正常功能
客户端操作: #卷中写入文件,客户端操作 cd /opt dd if=/dev/zero of=/opt/demo1.log bs=1M count=40 dd if=/dev/zero of=/opt/demo2.log bs=1M count=40 dd if=/dev/zero of=/opt/demo3.log bs=1M count=40 dd if=/dev/zero of=/opt/demo4.log bs=1M count=40 dd if=/dev/zero of=/opt/demo5.log bs=1M count=40 ls -lh /opt #产生五个40M的文件在/opt目录下 cp /opt/demo* /test/dis cp /opt/demo* /test/stripe/ cp /opt/demo* /test/rep/ cp /opt/demo* /test/dis_stripe/ cp /opt/demo* /test/dis_rep/ #将产生在/opt目录下的5个40m文件放入五个卷的挂载点中 ①验证分布式卷 node1-node2上查看/data/sdb1中是否是每台机器上有demo1-5的一部分且都是40M完整的文件 ll -h /data/sdb1 ②验证条带卷 node1-node2上查看/data/sdc1中是否每台机器上都有demo1-5文件且都为20M ll -h /data/sdc1 ③验证复制卷 node3-node4上查看/data/sdb1中是否每台机器上都有demo1-5文件且都为40M ll -h /data/sdb1 ④验证分布式条带卷分布 node1-node4上查看/data/sdd1中是否每台机器上都有demo1-5文件且都为20M ll -h /data/sdd1 ⑤验证分布式复制卷分布 node1-node4上查看/data/sde1中是否每台机器上都有demo1-5的一部分且都是40M完整的文件 ll -h /data/sde1