GFS分布式文件系统(理论+实验+故障模拟)
Posted TaKe___Easy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GFS分布式文件系统(理论+实验+故障模拟)相关的知识,希望对你有一定的参考价值。
GFS
- 一、前言理论概述
- 二、GFS的卷类型
- 三、GFS工作原理(工作流程)
- 四、弹性HASH算法
- 五、 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
5月 20 16:48:39 node1 systemd[1]: Starting GlusterFS, a clustered file-system server...
5月 20 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文件系统
- GFS分布式文件系统(理论+实验+故障模拟)