GFS分布式文件系统

172 阅读13分钟

GFS由一个master和多个chunck server构成。master负责维护文件和块命名空间、文件到块的映射和每个块副本的位置,以及对块租约、chunck server和块回收和迁移等进行管理。chunck server负责保存块的副本。

一、文件系统简介

1、组成

①:接口:文件系统接口
②:功能模块(管理、存储的工具):对对像管理的软件集合
③:对象及属性:(使用此文件系统的消费者)

2、作用

从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统;主要负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取

3、文件系统的挂载使用

除根文件系统以外的文件系统创建后要使用需要先挂载至挂载点后才可以被访问,挂载点即分区设备文件关联的某个目录文件;类比: NFS

二、GlusterFSt 文件系统概述

用于存储、管理物理文件(保存磁盘时使用)\

1、GlusterFSt简介

用于存储、管理物理文件(保存磁盘时使用)

  1. 开源的分布式文件系统
  2. GFS的组成:由存储服务器(比如块服务器block)、客户端(对象)以及NFS/Samba存储网关组成(接口),三个部分
  3. 无元数据的服务器; 客户端的定位比较重要,因为他是无元数据服务器的

元数据服务器的作用

存储元数据,帮用户定位文件的位置、索引等信息
有元数据服务器文件系统中,如果元数据损坏,会直接导致文件系统不可用( 单点故障-服务器定位)

而GFS把元数据服务器舍弃了,使用的是数据挂载形式挂载到客户端,挂载的网关是NFS/Samba,实现ABC三台GFS服务器数据共享,即使服务器A宕机,也可以从服务器B/C拿取数据

2、GlusterFS特点

  1. 扩展性和高性能:分布式特点
  2. 高可用性:分布式特点
  3. 全局统一命名空间:共享资源(名称空间:隔离、独立的整体/环境,与其他名称空间是隔离独立的)
  4. 弹性卷管理:条带、复制、分布式、分布式条带、分布式复制;类似raid
  5. 基于标准协议

3、GlusterFS术语

  1. Brick存储服务器:实际存储用户数据的服务器
  2. Volume:本地文件系统的"分区”
  3. FUSE:用户 空间的文件系统(类比EXT4),“这是一个伪文件系统”;以本地文件系统为例,用户想要读写一个文件,会借助于EXT4文件系统,然后把数据写在磁盘上;而如果是远端的GFS,客户端的请求则应该交给FUSE(为文件系统),就可以实现跨界点存储在GFS上
  4. VFS(虚拟端口) :内核态的虚拟文件系统,用户是先提交请求交给VFS然后VFS交给FUSE,再交给GFS客户端,最后由客户端交给远端的存储
  5. Glusterd(服务):是允许在存储节点的进程

4、模块化堆栈式架构

  1. 模块化、堆栈式的架构
  2. 通过对模块的组合,实现复杂的功能

模块化
类似linux 编译安装;很多功能都可以做定制的,通常都是通过软件开发的方式封装为模块,按需使用/不适用
GlusterFs也是这个思想:把功能封装为一个个模块,通过加载/调用/启用的方式就可以对应的功能
堆栈式架构设计
通过对模块不同功能的组合来实现复杂功能

5、GFS工作流程

  1. 写的过程 GFS客户端服务器
    需求:将数据保存在GFS文件系统中(客户端在本地发出写请求)
    交由VFS的API接受请求–>组合功能模块,将数据交给FUSE(内核伪文件系统)
    FUSE可以模拟操作系统,可以对文件系统进行转存,转存的设备位置为: /dev/fuse (用于传输的设备-虚拟设备文件)
    /dev/fuse 虚拟设备文件会将数据交给GFS客户端
    GFS客户端client会根据配置文件对数据进行处理,然后再通过TCP/IB/rdma网络发送到GFS服务端

GFS服务端服务器

  • 接收到数据之后
  • 会将数据保存在对应的存储节点上

读取过程:

  • 客户端在本地发出读请求
  • 交由VFS的API接受请求–>组合功能模块,将数据交给FUSE(内核伪文件系统)
  • FUSE在/dev/fuse (用于传输的设备-虚拟设备文件)查询缓存,执行page函数读取(read)内存,若缓存有,则返回客户端
  • 若没有缓存,GFS客户端会去GFS服务端获取数据,GFS服务端通过VFS接口去本地读取缓存
  • 再把缓存存储在/dev/fuse,读取了缓存数据之后再通过VFS返回给客户端
  • 提高GFS的工作效率的架构模式
  • gige: 千兆网/千兆接口
  • TCP/IP :网络协议
  • InfiniBand:网络协议,与TCP/IP相比,TCP/IP具有转发丢失数据包的特性,基于此通讯协议可能导致通讯变慢,而IB使用基于信1、流控制的机制来确保连接完整性,数据包丢失几率小。
  • RDMA:负责数据传输,有一种数据传输协议,功能:为了解决传输中客户端与服务器端数据处理的延迟 POSIX:可移植操作系统接口,主要解决不同操作系统间的移植性然后再转换为逻辑存储(EXT4 +BRICK)

image.png

6、卷的基本分类

为了解决分布式文件数据索引、定位的复杂程度,而使用了HASH算法来辅助 分布式(平均分配)的好处:

当数据量越来越大的时候,相对每个存储节点的数据量(几率)是相等的 而如果考虑到单点故障问题,当数据存储再c存储节点,对此GFS是会有备份机制的,默认3备份,所以GFS本身的机制会对数据产生冗余,以此解决单点故障 GlusterFS支持七种卷,即分布式卷、条带卷、复制卷、分布式条带卷、分布式复制卷、条带复制卷和分布式条带复制卷 基本卷

(1) 分布式卷(默认)(distribute volume)

文件通过HASH算法分布到所有Brick Server上,这种卷是Glusterfs的基础;以文件为单位根据HASH算法散列到不同的Brick, 其实只是扩大了磁盘空间,如果有一块磁盘损坏,数据也将丢失,属于文件级的RAID 0, 不具有容错能力 比如:4个文件2个brick存储服务器3个文件放在第一个brick块中,第四个文件放在第二个brick块中

 #创建一个名为dis-volume的分布式卷,文件将根据HASH分布在serverl:/dir1、server2:/dir2 和 server3:/dir3中。
 gluster volume create dis-volume server1:/dir1 server2:/dir2 server3:/dir3

(2) 条带卷(stripe volume)

类似RAID 0,文件被分成数据块并以轮询的方式分布到多个BrickServer上,文件存储以数据块为单位,支持大文件存储,文件越大,读取效率越高 比如:100m的数据分成50m+50m分不到不同的服务器上,分布之后是以数据块为单位的
条带复制卷(Stripe Replica volume) :类似RAID 10, 同时具有条带卷和复制卷的特点

 #创建了一个名为stripe-volume的条带卷,文件将被分块轮询的存储在Server1:/dir1和Server2:/dir2两个Brick中。
 gluster volume create stripe-volume stripe 2 transport tcp server1:/dir1 server2:/dir2
 ​
 #注意:分片数量需要是brick的倍数。

(3) 分布式条带复制卷(Distribute Stripe Replicavolume)

三种基本卷的复合卷,通常用于类Map Reduce应用,将文件同步到多个Brick上,使其具备多个文件副本, 属于文件级RAID 1,具有容错能力。因为数据分散在多个Brick中,所以读性能得到很大提升,但写性能下降
比如:100m 4个文件,2个brick服务器
100*4 文件均存在第一个和第二个brick

 #创建名为rep-volume的复制卷,文件将同时存储两个副本,分别在Server1:/dir1和Server2:/dir2两个Brick中。
 gluster volume create rep-volume replica 2 transport tcp server1:/dir1 server2:/dir2
 ​
 #replica 2 :复制数,一般要等于brick的数量。
 #transport tcp :通过tcp协议进行传输。

复合卷

(4) 分布式条带卷(Distribute Stripe volume)

Brick Server 数量是条带数(数据块分布的Brick数量)的倍数,兼具分布式卷和条带卷的特点
比如:503 放在第一个brick
501 放在第二个brick
503 放在第三个brick
501 放在第四个brick

 gluster volume create dis-stripe stripe 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4
 ​
 #文件先分布存储,之后再分块存储。

(5) 分布式复制卷(Distribute Replica volume)

Brick Server 数量是镜像数(数据副本数量)的倍数,兼具分布式卷和复制卷的特点
比如:503 放在第一个brick
501 放在第二个brick
503 放在第三个brick
501 放在第四个brick

创建一个名为dis-rep的分布式复制卷,配置分布式的复制卷时,卷中Brick所包含的存储服务器数必须是复制数的倍数(>=2倍)。Brick 的数量是 4(Server1:/dir1、Server2:/dir2、Server3:/dir3 和 Server4:/dir4),复制数为 2(replica 2)。

 gluster volume create dis-rep replica 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4

(6) 条带复制卷(Stripe Replica volume)

类似RAID 10, 同时具有条带卷和复制卷的特点

(7) 分布式条带复制卷(Distribute Stripe Replicavolume)

三种基本卷的复合卷,通常用于类Map Reduce.应用

三、部署 GlusterFS 群集

实验环境:

 Node1节点:node1/192.168.37.101      磁盘:/dev/sdb1           挂载点:/data/sdb1
                                         /dev/sdc1                  /data/sdc1
                                         /dev/sdd1                  /data/sdd1
                                         /dev/sde1                  /data/sde1
  
 Node2节点:node2/192.168.37.201      磁盘:/dev/sdb1          挂载点:/data/sdb1
                                          /dev/sdc1                 /data/sdc1
                                          /dev/sdd1                 /data/sdd1
                                          /dev/sde1                 /data/sde1
  
 Node3节点:node3/192.168.37.133       磁盘:/dev/sdb1          挂载点:/data/sdb1
                                          /dev/sdc1                 /data/sdc1
                                          /dev/sdd1                 /data/sdd1
                                          /dev/sde1                 /data/sde1
  
 Node4节点:node4/192.168.37.128       磁盘:/dev/sdb1          挂载点:/data/sdb1
                                          /dev/sdc1                 /data/sdc1
                                          /dev/sdd1                 /data/sdd1
                                          /dev/sde1                 /data/sde1
 客户端节点:192.168.37.135

部署Gluster集群环境(所有node节点操作)

1)关闭防火墙和selinux

 systemctl stop firewalld
 setenforce 0

2)写一个脚本,批量分区、格式化、挂载

 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
 ​
 #先在一个节点上操作,之后通过scp命令将脚本传给其他主机,统一执行。

3)修改主机名,配置/etc/hosts文件

 #修改每台主机的主机名,便于管理
 #以Node1节点为例:
 hostnamectl set-hostname node1
 su
 ​
 #配置/etc/hosts文件,添加所有主机的映射关系
 echo "192.168.37.101 node1" >> /etc/hosts
 echo "192.168.37.201 node2" >> /etc/hosts
 echo "192.168.37.133 node3" >> /etc/hosts
 echo "192.168.37.128 node4" >> /etc/hosts

4)安装、启动GlusterFS

 #将gfsrepo 软件上传到/opt目录下
 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 源安装,可以直接指向互联网仓库
 yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
 ​
 systemctl start glusterd.service 
 systemctl enable glusterd.service
 systemctl status glusterd.service

5)添加节点到存储信任池中(在 node1 节点上操作)

添加集群信任池,node1-node4 之间添加互信关系。将其他节点加入到我的存储池中。只要在一台Node节点上添加其它节点即可。

 #只要在一台Node节点上添加其它节点即可
 gluster peer probe node1
 gluster peer probe node2
 gluster peer probe node3
 gluster peer probe node4
 ​
 #在每个Node节点上查看群集状态
 gluster peer status

2 创建卷

根据规划创建如下卷:

卷名称卷类型Brick
dis-volume分布式卷node1(/data/sdb1)、node2(/data/sdb1)、node3(/data/sdb1)、node4(/data/sdb1)
stripe-volum条带卷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)

1)node1 - node4,/dev/sdb1,分布式卷

 #创建分布式卷
 gluster volume create dis-volume node1:/data/sdb1 node2:/data/sdb1 node3:/data/sdb1  node4:/data/sdb1 force
 ​
 #查看卷列表
 gluster volume list
 ​
 #启动新建的分布式卷
 gluster volume start dis-volume
 ​
 #查看卷信息
 gluster volume info dis-volume

2)node1 - node2,/dev/sdc1,条带卷

条带数要等于brick数量。

 #指定类型为 stripe,数值为 2,且后面跟了 2Brick 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

3)node3 - node4,/dev/sdc1,复制卷

复制数等于brick数量。

 #指定类型为 replica,数值为 2,且后面跟了 2Brick 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

4)node1 - node4,/dev/sdd1,分布式条带卷

brick数量必须是条带的2倍及以上。

 #指定类型为 stripe,数值为 2,而且后面跟了 4Brick 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

5)node1 - node4,/dev/sde1 分布式复制卷

brick数量必须是复制数的2倍及以上。

 #指定类型为 replica,数值为 2,而且后面跟了 4Brick 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、部署 Gluster 客户端

1)安装客户端软件

 #将gfsrepo 软件上传到/opt目下 
 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

2)配置 /etc/hosts 文件

 echo "192.168.37.101 node1" >> /etc/hosts
 echo "192.168.37.201 node2" >> /etc/hosts
 echo "192.168.37.133 node3" >> /etc/hosts
 echo "192.168.37.128 node4" >> /etc/hosts

3)创建挂载目录

 mkdir -p /test/{dis,stripe,rep,dis_stripe,dis_rep}
 ls /test

4)挂载 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
 ​
 df -Th
 ​
 #永久挂载
 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     

四、补充指令

其他的维护命令

 1.查看GlusterFs卷
 gluster volume list
 ​
 2.查看所有卷的信息
 gluster volume info
 ​
 3.查看所有卷的状态
 gluster volume status
 ​
 4.停止一个卷
 gluster volume stop dis-stripe
 ​
 5.删除一个卷,注意:删除卷时,需要先停止卷,且信任池中不能有主机处于宕机状态,否则删除不成功
 gluster volume delete dis-stripe
 ​
 6.设置卷的访问控制
 #仅拒绝
 gluster volume set dis-rep auth.deny 192.168.41.46
 ​
 #仅允许
 gluster volume set dis-rep auth.allow 192.168.41.*   
 #设置192.168.41.0网段的所有IP地址都能访问dis-rep卷(分布式复制卷)