GFS分布式文件系统(理论+实验+故障模拟)

Posted TaKe___Easy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GFS分布式文件系统(理论+实验+故障模拟)相关的知识,希望对你有一定的参考价值。

GFS

一、前言理论概述

1.1 概述

  • GFS(GlusterFS)是一款开源的分布式文件系统。
  • FS:文件系统。由文件系统接口(API)、对对象管理的软件集合、对象及属性组成
  • 文件系统作用
    • 从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。
    • 具体的说文件系统就是负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取
  • 文件系统的挂载使用
    • 除根(/)文件系统以外的文件系统创建后要使用的话,需要先挂载到挂载点后才可以被访问
    • 挂载点即分区设备文件关联的某个目录文件
  • GFS组成
    • 存储服务器
    • 客户端(其中客户端的定位比较重要,因为它是无元数据服务器)
    • NFS/Samba存储网关
  • 元数据服务器的作用
    • 存储元数据,帮用户定位文件的位置、索引等信息
    • 有元数据服务器文件系统中,如果元数据损坏,会直接导致文件系统不可用
  • GFS提供了一个全局统一命名空间。此命名空间提供了一个API,此API是用户访问GFS服务器中数据的唯一入口
  • 弹性卷管理:RAIN(基于容错、读写性能等技术)可以在分布式文件系统之上可以使用RAID卷的集中管理
  • 基于标准协议:客户端和存储服务器交互需要借助网络,而相关的网络协议包括TCP/IP协议

1.2 GFS特点

  • 1.扩展性和高性能
    • 可扩展性,扩展节点
    • 通过多节点提高性能
  • 2.高可用性
    • 不存在单点故障,有备份机制
    • 类似 Raid 的容灾机制
  • 3.全局统一命名空间
    • 集中化管理,类比 API 的性质/概念
    • 系统里根据他命名所定义的隔离区域,是一个独立空间
    • 统一的名称空间,与客户端交互,把请求存放至后端的块数据服务器
  • 4.弹性卷管理
    • 方便扩容及对后端存储集群的管理与维护
    • 较为复杂
  • 5.基于标准协议
    • 基于标准化的文件使用协议

1.3 GFS术语

  • 1.Brick(块存储服务器):实际存储用户数据的服务器
  • 2.Volume:本地文件系统的“分区”
  • 3.FUSE:用户空间的文件系统(类比EXT4),这是一个伪文件系统,用户端的交换模块
  • 4.VFS(虚拟端口):虚拟的内核态文件系统。
  • 5.Glusterd(服务):运行在存储节点的进程(客户端运行的是gluster client)

1.4 GFS构成与架构

  • GFS的架构
    • 存储服务器
    • 存储节点信息
  • GFS是模块化堆栈式架构
    • 模块化:类似linux的编译安装。很多功能都可以做定制的,通过软件开发的方式封装为模块,然后按需使用或者不使用。GFS也是这样把功能封装为一个个模块,通过加载/调用/启动的方式就可以实现对应的功能
    • 堆栈式架构设计:通过对模块不同功能的组合来实现复杂功能

二、GFS的卷类型

2.1 分布式卷

  • 没有对文件进行分块处理
  • 通过扩展文件属性保存HASH值
  • 支持的底层文件系统有EXT3、EXT4、ZFS、XFS等等
  • 特点:
    • 文件分布在不同的服务器,不具备冗余性
    • 更容易和廉价地扩展卷的大小
    • 单点故障会造成数据丢失
    • 依赖底层的数据保护

2.2 条带卷

  • 根据偏移量将文件分成N块(N个条带节点),轮询的存储在每个Brick Server节点
  • 存储大文件时,性能尤为突出
  • 不具备冗余性,开始Raid0
  • 特点
    • 数据被分割成更小块分布到块服务器群中的不同条带区
    • 分布减少了负载且更小的文件加速了存取的速度
    • 没有数据冗余

2.3 复制卷

  • 同一文件保存一份或多份副本
  • 因为要保存副本,所以磁盘利用率较低
  • 若多个节点上的存储空间不一致,将按照木桶消息取最低节点的容量作为该卷的总容量
  • 特点
    • 卷中所有的服务器均保存一个完整的副本
    • 卷的副本数量可由客户在创建的时候决定
    • 至少有两个块服务器或更多服务器
    • 具备冗余性

2.4 分布式条带卷

  • 兼顾分布式卷和条带卷的功能
  • 主要用于大文件访问处理
  • 至少需要4台服务器

2.5 分布式复制卷

  • 健步分布式卷和复制卷的功能
  • 用于需要冗余的情况

三、GFS工作原理(工作流程)

  • 1、客户端或应用程序通过GlusterFS的挂载点访问数据
  • 2、linux系统内核通过VFS API收到请求并处理
  • 3、VFS将数据递交给FUSE内核文件系统, fuse文件系统则是将数据通过/dev/fuse设备文件递交给GlusterFS client端
  • 4、GlusterFS client 收到数据后,client根据配置文件的配置对数据进行处理
  • 5、通过网络将数据传递至远端的GlusterFS Server,并且将数据写入到服务器存储设备上

四、弹性HASH算法

  • 通过HASH算法得到一个32位的整数
  • 划分为N个连续的子空间,每个空间对应一个Brick
  • 弹性HASH算法的优点
  • 保证数据平均分布在每一个Brick中
  • 解决了对元数据服务器的依赖,进而解决了单点故障以及访问瓶颈

五、 GFS群集部署

5.1 部署环境

  • node1 IP:192.168.131.10 五块磁盘大小分别为30G,40G,50G,60G
  • node2 IP:192.168.131.11 五块磁盘大小分别为30G,40G,50G,60G
  • node3 IP:192.168.131.12 五块磁盘大小分别为30G,40G,50G,60G
  • node4 IP:192.168.131.13 五块磁盘大小分别为30G,40G,50G,60G
  • 以上四台为GFS服务端,以下一台为GFS客户端(测试用)
  • Server IP:192.168.131.14

5.2 脚本批量格式化创建(所有节点执行)

[root@localhost ~]# hostnamectl set-hostname node1     【分别将4台node节点主机名修改】
[root@localhost ~]# su
[root@node1 ~]# systemctl stop firewalld.service 
[root@node1 ~]# setenforce 0
[root@node1 ~]# systemctl disable firewalld.service 
[root@node1 ~]# vim /opt/fdisk.sh

#!/bin/bash
NEWDEV=`ls /dev/sd* | grep -o 'sd[b-z]' | uniq`
for VAR in $NEWDEVdo
   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
[root@node1 ~]# chmod +x /opt/fdisk.sh 
[root@node1 ~]# cd /opt/
[root@node1 opt]# ./fdisk.sh 
[root@node1 opt]# df -hT                      【查看下/dev/sdb-e是否创建成功】
[root@node1 opt]# mkfs.xfs /dev/sdc1          【如果不成功需要手动格式化后刷新】
[root@node1 opt]# mount -a                    【刷新】
文件系统       类型      容量  已用  可用 已用% 挂载点
/dev/sda3      xfs        26G  3.7G   22G   15% /
devtmpfs       devtmpfs  978M     0  978M    0% /dev
tmpfs          tmpfs     993M     0  993M    0% /dev/shm
tmpfs          tmpfs     993M  9.1M  984M    1% /run
tmpfs          tmpfs     993M     0  993M    0% /sys/fs/cgroup
/dev/sda1      xfs       497M  151M  346M   31% /boot
tmpfs          tmpfs     199M   12K  199M    1% /run/user/42
tmpfs          tmpfs     199M     0  199M    0% /run/user/0
/dev/sdb1      xfs        30G   33M   30G    1% /data/sdb1
/dev/sdd1      xfs        50G   33M   50G    1% /data/sdd1
/dev/sde1      xfs        60G   33M   60G    1% /data/sde1
/dev/sr0       iso9660   4.3G  4.3G     0  100% /mnt
/dev/sdc1      xfs        40G   33M   40G    1% /data/sdc1

5.3 配置host文件并安装启动GFS(所有node节点上操作)

[root@node1 opt]# vim /etc/hosts            【添加四个节点的域名解析】

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.131.10 node1
192.168.131.11 node2
192.168.131.12 node3
192.168.131.13 node4


[root@node1 opt]# cd /etc/yum.repos.d/
[root@node1 yum.repos.d]# ls
local.repo  repos.bak
[root@node1 yum.repos.d]# mv *.repo repo.bakbak     【将所有文件移动到备份目录】
[root@node1 yum.repos.d]# ls
repo.bakbak  repos.bak
[root@node1 yum.repos.d]# vim glfs.repo             【配置glfs本地源】

[glfs]
name=glfs
baseurl=file:///opt/gfsrepo
gpgcheck=0
enabled=1

[root@node1 yum.repos.d]# cd /opt/
[root@node1 opt]# rz -E
rz waiting to receive.
[root@node1 opt]# ls
fdisk.sh  gfsrepo.zip  rh
[root@node1 opt]# unzip gfsrepo.zip 
[root@node1 opt]# yum clean all && yum makecache 
【本地安装GFS服务、GFS服务端、GFS客户端、GFS减少延迟工具包】
[root@node1 opt]# yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma

【开启并设置开机自启GFS服务,最后查看GFS状态】
[root@node1 opt]# systemctl start glusterd.service 
[root@node1 opt]# systemctl enable glusterd.service 
[root@node1 opt]# systemctl status glusterd.service 
● glusterd.service - GlusterFS, a clustered file-system server
   Loaded: loaded (/usr/lib/systemd/system/glusterd.service; enabled; vendor preset: disabled)
   Active: active (running) since 四 2021-05-20 16:48:39 CST; 1min 42s ago
 Main PID: 2371 (glusterd)
   CGroup: /system.slice/glusterd.service
           └─2371 /usr/sbin/glusterd -p /var/run/glusterd.pid --log-level INFO

520 16:48:39 node1 systemd[1]: Starting GlusterFS, a clustered file-system server...
520 16:48:39 node1 systemd[1]: Started GlusterFS, a clustered file-system server.


[root@node1 opt]# ntpdate ntp1.aliyun.com       【时间同步,没有配置过DNS需先配置DNS】

5.4 在存储信任池中添加节点(Node1节点)

  • 只需再一台Node节点上添加其他节点即可
[root@node1 opt]# gluster peer probe node1
peer probe: success. Probe on localhost not needed
[root@node1 opt]# gluster peer probe node2
peer probe: success. 
[root@node1 opt]# gluster peer probe node3
peer probe: success. 
[root@node1 opt]# gluster peer probe node4
peer probe: success. 
[root@node1 opt]# gluster peer status         【在每个node节点上查看群集状态,是否成功添加其他3台】
Number of Peers: 3

Hostname: node2
Uuid: 6d7cd413-66d2-427f-8948-c089dd57de09
State: Peer in Cluster (Connected)

Hostname: node3
Uuid: 74f1661c-b918-409c-84e5-0e46da1a88f7
State: Peer in Cluster (Connected)

Hostname: node4
Uuid: 13a59ff2-1b4b-40c6-8553-d94340435282
State: Peer in Cluster (Connected)

5.5 根据规划创建卷

5.5.1 规划如下表

卷名称卷类型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)

5.5.2 创建分布式卷

  • 创建分布式卷,没有指定类型,默认创建的就是分布式卷
[root@node1 opt]# gluster volume create dis-volume node1:/data/sdb1 node2:/data/sdb1 force
volume create: dis-volume: success: please start the volume to access data
[root@node1 opt]# gluster volume list                      【查看卷列表】
dis-volume
[root@node1 opt]# gluster volume start dis-volume          【启动新建分布式卷】
volume start: dis-volume: success
[root@node1 opt]# gluster volume info dis-volume           【查看创建分布式卷信息】
 
Volume Name: dis-volume
Type: Distribute
Volume ID: 5a7fd5a6-d5b6-41e3-a7f7-dcd705e6061c
Status: Started
Snapshot Count: 0
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: node1:/data/sdb1
Brick2: node2:/data/sdb1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on

5.5.3 条带卷创建

  • 指定类型为stripe,数值为2,后面有2个Brick Server。所以创建的事条带卷
[root@node1 opt]# gluster volume create stripe-volume stripe 2 node1:/data/sdc1 node2:/data/sdc1 force
volume create: stripe-volume: success: please start the volume to access data
[root@node1 opt]# gluster volume start stripe-volume
volume start: stripe-volume: success
[root@node1 opt]# gluster volume info stripe-volume
 
Volume Name: stripe-volume
Type: Stripe
Volume ID: ea8fb539-fcbd-4349-97d3-c55570c5a0bf
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: node1:/data/sdc1
Brick2: node2:/data/sdc1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on

5.5.4 复制卷创建

  • 指定类型为 replica,数值为 2,且后面跟了 2 个 Brick Server,所以创建的是复制卷
[root@node1 opt]# gluster volume create rep-volume replica 2 node3:/data/sdb1 node4:/data/sdb1 force
volume create: rep-volume: success: please start the volume to access data
[root@node1 opt]# gluster volume start rep-volume
volume start: rep-volume: success
[root@node1 opt]# gluster volume info rep-volume
 
Volume Name: rep-volume
Type: Replicate
Volume ID: 684418dc-1e38-4294-9f87-37f582666df6
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: node3:/data/sdb1
Brick2: node4:/data/sdb1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on

5.5.5 分布式条带卷创建

  • 指定类型为 stripe,数值为 2,而且后面跟了 4 个 Brick Server,是 2 的两倍,所以创建的是分布式条带卷
[root@node1 opt]#  gluster volume create dis-stripe stripe 2 node1:/data/sdd1 node2:/data/sdd1 node3:/data/sdd1 node4:/data/sdd1 force
volume create: dis-stripe: success: please start the volume to access data
[root@node1 opt]# gluster volume start dis-stripe
volume start: dis-stripe: success
[root@node1 opt]# gluster volume info dis-stripe
 
Volume Name: dis-stripe
Type: Distributed-Stripe
Volume ID: fd24e048-cec6-48ee-8924-bfd09e4dc9a1
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: node1:/data/sdd1
Brick2: node2:/data/sdd1
Brick3: node3:/data/sdd1
Brick4: node4:/data/sdd1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on

5.5.6 分布式复制卷创建

  • 指定类型为 replica,数值为 2,而且后面跟了 4 个 Brick Server,是 2 的两倍,所以创建的是分布式复制卷
[root@node1 opt]# gluster volume create dis-rep replica 2 node1:/data/sde1 node2:/data/sde1 node3:/data/sde1 node4:/data/sde1 force
volume create: dis-rep: success: please start the volume to access data
[root@node1 opt]# gluster volume start dis-rep
volume start: dis-rep: success
[root@node1 opt]# gluster volume info dis-rep 
 
Volume Name: dis-rep
Type: Distributed-Replicate
Volume ID: a51ac773-d8af-4f2f-8512-6394eca36423
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: node1:/data/sde1
Brick2: node2:/data/sde1
Brick3: node3:/data/sde1
Brick4: node4:/data/sde1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
[root@node1 opt]# gluster volume list
dis-rep
dis-stripe
dis-volume
rep-volume
stripe-volume

5.6 GFS客户端部署

5.6.1 安装客户端软件

[root@localhost ~]# hostnamectl set-hostname server
[root@localhost ~]# su
[root@server ~]# systemctl stop firewalld.service 
[root@server ~]# setenforce 0
[root@server ~]# systemctl disable firewalld.service 
[root@server ~]# cd /opt/
[root@server opt]# rz -E
rz waiting to receive.
[root@server opt]# ls
gfsrepo.zip  rh
[root@server opt]# unzip gfsrepo.zip 
[root@server opt]# cd /etc/yum.repos.d/
[root@server yum.repos.d]# ls
local.repo  repos.bak
[root@server yum.repos.d]# mv * repos.bakbak
[root@server yum.repos.d]# ls
repos.bakbak
[root@server yum.repos.d]# yum clean all && yum makecache 
[root@server yum.repos.d]# yum -y install glusterfs glusterfs-fuse.x86_64 

5.6.2 创建挂载目录并配置host文件

[root@server yum.repos.d]# mkdir -p /qz/dis,stripe,rep,dis_stripe,dis_rep
[root@server yum.repos.d]# ls /qz/
dis  dis_rep  dis_stripe  rep  stripe


[root@server yum.repos.d]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.131.10 node1
192.168.131.11 node2
192.168.131.12 node3
192.168.131.13 node4

5.6.3 挂载Gluster文件系统