理论+实验——GFS分布式文件系统

文章目录

  • 一、GlusterFS概述
    • 1.1 GlusterFS简介
    • 1.2 GlusterFS的特点
    • 1.3 GlusterFS术语
    • 1.4 模块化堆栈式架构
  • 二、GlusterFS工作原理
    • 2.1 GlusterFS工作流程
    • 2.2 弹性HASH算法
  • 三、GlusterFS 的卷类型
    • 3.1 分布式卷
    • 3.2 条带卷
    • 3.3 复制卷
    • 3.4 分布式条带卷
    • 3.5 分布式复制卷
  • 四、实验:GlusterFS部署
    • 4.1 开局
    • 4.2 glusterd的yum源配置
    • 4.3 4个节点均时间同步
    • 4.4 添加存储信息池,只要在一台节点主机上添加即可
    • 4.4 创建分布式卷
    • 4.5 创建条带卷
    • 4.6 创建复制卷
    • 4.7 创建分布式条带
    • 4.8 创建分布式复制卷
  • 五、客户端配置
  • 六、测试

一、GlusterFS概述

1.1 GlusterFS简介

  • 开源的分布式文件系统,是Scale存储的核心,能够处理千数量级的客户端
  • 由存储服务器、客户端以及NFS/Samba 存储网关组成
  • 无元数据服务器

1.2 GlusterFS的特点

  • 扩展性和高性能
  • 高可用性
  • 全局统一命名空间
  • 弹性卷管理
  • 基于标准协议

1.3 GlusterFS术语

  • Brick:GFS中的存储单元,通过是一个受信存储池中的服务器的一个导出目录。可以通过主机名和目录名来标识,如’SERVER:EXPORT’
  • Volume:卷
  • FUSE:内核文件系统,Filesystem Userspace是一个可加载的内核模块,其支持非特权用户创建自己的文件系统而不需要修改内核代码。通过在用户空间运行文件系统的代码通过FUSE代码与内核进行桥接。
  • VFS:虚拟文件系统
  • Glusterd:Gluster management daemon,要在trusted storage pool中所有的服务器上运行

1.4 模块化堆栈式架构

  • 模块化、堆栈式的架构
  • 通过对模块的组合,实现复杂的功能
    理论+实验——GFS分布式文件系统_第1张图片
    注:
    RDMA协议:去中心化

二、GlusterFS工作原理

2.1 GlusterFS工作流程

理论+实验——GFS分布式文件系统_第2张图片

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

2.2 弹性HASH算法

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

三、GlusterFS 的卷类型

■ 分布式卷
■ 条带卷
■ 复制卷
■ 分布式条带卷
■ 分布式复制卷
■ 条带复制卷
■ 分布式条带复制卷

3.1 分布式卷

  • 没有对文件进行分块处理
  • 通过扩展文件属性保存HASH值
  • 支持的底层文件系统有EXT3、EXT4、ZFS、XFS等

理论+实验——GFS分布式文件系统_第3张图片
分布式卷的特点

  • 文件分布在不同的服务器,不具备冗余性
  • 更容易和廉价地扩展卷的大小
  • 单点故障会造成数据丢失
  • 依赖底层的数据保护

创建分布式卷

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

3.2 条带卷

  • 根据偏移量将文件分成N块(N个条带节点),轮询的存储在每个Brick Server节点
  • 存储大文件时,性能尤为突出
  • 不具备冗余性,类似Raid0

理论+实验——GFS分布式文件系统_第4张图片
特点

  • 数据被分割成更小块分布到块服务器群中的不同条带区
  • 分布减少了负载且更小的文件加速了存取的速度
  • 没有数据冗余

创建条带卷

  • 创建了一个名为stripe-volume的条带卷,文件将被分块轮询的存储在server1:/dir1 server2:/dir2两个Brick中
gluster volume create stripe-volume stripe 2 transport tcp server1:/dir1 server2:/dir2

3.3 复制卷

  • 同一文件保存一份或多分副本
  • 复制模式因为要保存副本,所以磁盘利用率较低
  • 多个节点上的存储空间不一致,那么将按照木桶效应取最低节点的容量作为该卷的总容量

理论+实验——GFS分布式文件系统_第5张图片
特点

  • 卷中所有的服务器均保存一个完整的副本
  • 卷的副本数量可由客户创建的时候决定
  • 至少由两个块服务器或更多服务器
  • 具备冗余性

创建复制卷

  • 创建名为rep-volume的复制卷,文件将同时存储两个副本,分别在server1:/dir1 server2:/dir2两个Brick中
gluster volume create rep-volume replica 2 transport tcp server1:/dir1 server2:/dir2

3.4 分布式条带卷

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

理论+实验——GFS分布式文件系统_第6张图片
创建分布式条带卷

  • 创建了名为dis-stripe的分布式条带卷,配置分布式的条带卷时,卷中Brick所包含的存储服务器数必须为条带数的偶数倍数(>=2倍)
gluster volume create dis-stripe stripe 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4

3.5 分布式复制卷

  • 兼顾分布式卷和复制卷的功能
  • 用于需要冗余的情况下

理论+实验——GFS分布式文件系统_第7张图片
创建分布式复制卷

  • 创建名为dis-rep的分布式条带卷,配置分布复制卷时,卷中Brick所包含的存储服务器数必须为条带数的偶数倍数(>=2倍)
gluster volume create dis-rep replica 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4

四、实验:GlusterFS部署

群集环境
理论+实验——GFS分布式文件系统_第8张图片
卷类型
理论+实验——GFS分布式文件系统_第9张图片
设备列表

操作系统 IP 主机名
CentOS 7.4 20.0.0.21 node1
CentOS 7.4 20.0.0.22 node2
CentOS 7.4 20.0.0.23 node3
CentOS 7.4 20.0.0.24 node4
CentOS 7.4 20.0.0.25 client

4.1 开局

关闭防火墙、核心防护
所有node节点都需要

[root@node1 ~]# vi /etc/hosts
20.0.0.21 node1
20.0.0.22 node2
20.0.0.23 node3
20.0.0.24 node4

###更改主机名
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3
hostnamectl set-hostname node4

node1上:
scp /etc/hosts [email protected]:/etc/hosts
scp /etc/hosts [email protected]:/etc/hosts
scp /etc/hosts [email protected]:/etc/hosts

getenforce: 查看selinux的状态
Enforing: 强制模式,代表SELinux在运行中,且已经开始限制domain/type之间的验证关系
Permissive: 宽容模式,代表SELinux在运行中,不过不会限制domain/type之间的验证关系,即使验证步正确,进程仍可以对文件进行操作,不过如果验证不正确会发出警告
Disabled: 关闭模式,SELinux没有实际运行
创建自动格式化,自动永久挂载脚本

[root@node1 ~]# vi gsf.sh
#!/bin/bash
for V in $(ls /dev/sd[b-z])
do
  echo -e "n\np\n\n\n\nw\n" |fdisk $V
  mkfs.xfs -i size=512 ${V}1 &>/dev/null
  sleep 1
  M=$(echo "$V" |awk -F "/" '{print $3}')
  mkdir -p /data/${M}1 &>/dev/null
  echo -e "${V}1 /data/${M}1 xfs defaults 0 0\n" >>/etc/fstab
  mount -a &>/dev/null
done

4.2 glusterd的yum源配置

[root@node1 yum.repos.d]# vim local.repo
[GLFS]
name=glfs
baseurl=http://mirror.centos.org/centos/$releasever/storage/$basearch/gluster-3.12/
gpgcheck=0
enabled=1
[root@node1 yum.repos.d]# yum clean all
[root@node1 yum.repos.d]# yum makecache
[root@node1 yum.repos.d]# yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
[root@node1 yum.repos.d]# systemctl start glusterd.service
[root@node1 yum.repos.d]# systemctl enable glusterd.service
[root@node1 yum.repos.d]# systemctl status glusterd.service

4.3 4个节点均时间同步

ntpdate ntp.aliyun.com

4.4 添加存储信息池,只要在一台节点主机上添加即可

[root@node1 yum.repos.d]# gluster peer probe node2
peer probe: success. 
[root@node1 yum.repos.d]# gluster peer probe node3
peer probe: success. 
[root@node1 yum.repos.d]# gluster peer probe node4
peer probe: success. 

'查看节点池'
[root@node1 ~]# gluster peer status

4.4 创建分布式卷

[root@node1 yum.repos.d]# gluster volume create dis-vol node1:/data/sdb1 node2:/data/sdb1 force          ###创建分布式卷,force:强制执行
volume create: dis-vol: success: please start the volume to access data
[root@node1 yum.repos.d]# gluster volume info dis-vol           ###查看分布式卷信息
 
Volume Name: dis-vol
Type: Distribute
Volume ID: 5ced04aa-1fa5-42e1-b273-2da41bb31469
Status: Created
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
[root@node1 yum.repos.d]# gluster volume list               ###查看卷列表
dis-vol[root@node1 yum.repos.d]# gluster volume start dis-vol       ###开启分布式卷
volume start: dis-vol: success
[root@node1 yum.repos.d]# gluster volume info dis-vol               ###查看分布式卷信息
 
Volume Name: dis-vol
Type: Distribute
Volume ID: 5ced04aa-1fa5-42e1-b273-2da41bb31469
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

4.5 创建条带卷

[root@node2 yum.repos.d]# gluster volume create strip-vol strip 2 node1:/data/sdc1 node2:/data/sdc1 force
volume create: strip-vol: success: please start the volume to access data
[root@node2 yum.repos.d]# gluster volume start strip-vol 
volume start: strip-vol: success
[root@node2 yum.repos.d]# gluster volume info strip-vol 
 
Volume Name: strip-vol
Type: Stripe
Volume ID: 66d151bd-7790-4774-a1c8-513bd0c9e796
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

4.6 创建复制卷

[root@node1 yum.repos.d]#  gluster volume create rep-vol replica 2 node3:/data/sdb1 node4:/data/sdb1 force
volume create: rep-vol: success: please start the volume to access data
[root@node1 yum.repos.d]# gluster volume list
dis-vol
rep-vol
strip-vol
[root@node1 yum.repos.d]# gluster volume start rep-vol 
volume start: rep-vol: success

4.7 创建分布式条带

[root@node1 yum.repos.d]# gluster volume create dis-strip stripe 2 node1:/data/sdd1 node2:/data/sdd1 node3:/data/sdd1 node4:/data/sdd1 force
volume create: dis-strip: success: please start the volume to access data
[root@node1 yum.repos.d]# gluster volume list
dis-strip
dis-vol
rep-vol
strip-vol
[root@node1 yum.repos.d]# gluster volume start dis-strip 
volume start: dis-strip: success
[root@node1 yum.repos.d]# gluster volume info dis-strip 
 
Volume Name: dis-strip
Type: Distributed-Stripe
Volume ID: 19a0b846-fc67-4e08-b81a-9cdb10b77bf8
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

4.8 创建分布式复制卷

[root@node3 yum.repos.d]# 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@node3 yum.repos.d]# gluster volume list
dis-rep
dis-strip
dis-vol
rep-vol
strip-vol
[root@node3 yum.repos.d]# gluster volume start dis-rep 
volume start: dis-rep: success
[root@node3 yum.repos.d]# gluster volume info dis-rep 
 
Volume Name: dis-rep
Type: Distributed-Replicate
Volume ID: 1d542149-6ce1-468f-b81f-96b876181d64
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
performance.client-io-threads: off

五、客户端配置

[root@localhost yum.repos.d]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
20.0.0.21 node1
20.0.0.22 node2
20.0.0.23 node3
20.0.0.24 node4
[root@localhost yum.repos.d]# yum -y install glusterfs glusterfs-fuse
[root@localhost yum.repos.d]# yum -y install glusterfs glusterfs-fuse
[root@localhost ~]# mkdir -p /test/dis                    
[root@localhost ~]# mkdir -p /test/strip
[root@localhost ~]# mkdir -p /test/rep
[root@localhost ~]# mkdir -p /test/dis_stripe
[root@localhost ~]# mkdir -p /test/dis_rep
[root@localhost ~]# mount.glusterfs node1:dis-vol /test/dis                     
[root@localhost ~]# mount.glusterfs node2:stripe-vol /test/strip              
[root@localhost ~]# mount.glusterfs node3:rep-vol /test/rep                   
[root@localhost ~]# mount.glusterfs node4:dis-stripe /test/dis_stripe    
[root@localhost ~]# mount.glusterfs node1:dis-rep /test/dis_rep   

创建5个大小为40M的文件

[root@localhost test]# dd if=/dev/zero of=/demo1.log bs=1M count=40
[root@localhost test]# dd if=/dev/zero of=/demo2.log bs=1M count=40
[root@localhost test]# dd if=/dev/zero of=/demo3.log bs=1M count=40
[root@localhost test]# dd if=/dev/zero of=/demo4.log bs=1M count=40
[root@localhost test]# dd if=/dev/zero of=/demo5.log bs=1M count=40

复制5个文件,存到刚才创的文件进行存储

[root@localhost test]# cp /demo* dis
[root@localhost test]# cp /demo* strip/
[root@localhost test]# cp /demo* rep/
[root@localhost test]# cp /demo* dis_stripe/
[root@localhost test]# cp /demo* dis_rep/
[root@localhost test]# ls dis
demo1.log  demo2.log  demo3.log  demo4.log  demo5.log
[root@localhost test]# ls dis-rep/
demo1.log  demo2.log  demo3.log  demo4.log  demo5.log

六、测试

查看分布式卷

[root@node1 yum.repos.d]# ll -h /data/sdb1
total 160M
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo1.log
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo2.log
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo3.log
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo4.log

[root@node2 yum.repos.d]# ll -h /data/sdb1/
总用量 40M
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo5.log

查看条带卷文件分布

[root@node1 yum.repos.d]# ll -h /data/sdc1
total 100M
-rw-r--r-- 2 root root 20M Oct 28 01:09 demo1.log
-rw-r--r-- 2 root root 20M Oct 28 01:09 demo2.log
-rw-r--r-- 2 root root 20M Oct 28 01:09 demo3.log
-rw-r--r-- 2 root root 20M Oct 28 01:09 demo4.log
-rw-r--r-- 2 root root 20M Oct 28 01:09 demo5.log

[root@node2 yum.repos.d]# ll -h /data/sdc1/
总用量 100M
-rw-r--r-- 2 root root 20M 10月 27 17:09 demo1.log
-rw-r--r-- 2 root root 20M 10月 27 17:09 demo2.log
-rw-r--r-- 2 root root 20M 10月 27 17:09 demo3.log
-rw-r--r-- 2 root root 20M 10月 27 17:09 demo4.log
-rw-r--r-- 2 root root 20M 10月 27 17:09 demo5.log

查看复制卷文件分布

[root@node3 yum.repos.d]# ll -h /data/sdb1
total 200M
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo1.log
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo2.log
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo3.log
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo4.log
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo5.log

[root@node4 yum.repos.d]# ll -h /data/sdb1/
总用量 200M
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo1.log
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo2.log
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo3.log
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo4.log
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo5.log

查看分布式条带卷

[root@node1 yum.repos.d]# ll -h /data/sdd1
total 80M
-rw-r--r-- 2 root root 20M Oct 28 01:09 demo1.log
-rw-r--r-- 2 root root 20M Oct 28 01:09 demo2.log
-rw-r--r-- 2 root root 20M Oct 28 01:09 demo3.log
-rw-r--r-- 2 root root 20M Oct 28 01:09 demo4.log

[root@node2 yum.repos.d]# ll -h /data/sdd1/
总用量 80M
-rw-r--r-- 2 root root 20M 10月 27 17:09 demo1.log
-rw-r--r-- 2 root root 20M 10月 27 17:09 demo2.log
-rw-r--r-- 2 root root 20M 10月 27 17:09 demo3.log
-rw-r--r-- 2 root root 20M 10月 27 17:09 demo4.log

[root@node3 yum.repos.d]# ll -h /data/sdd1
total 20M
-rw-r--r-- 2 root root 20M Oct 28 01:09 demo5.log

[root@node4 yum.repos.d]# ll -h /data/sdd1/
总用量 20M
-rw-r--r-- 2 root root 20M 10月 27 17:09 demo5.log

查看分布式复制卷

[root@node1 yum.repos.d]# ll -h /data/sde1
total 160M
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo1.log
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo2.log
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo3.log
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo4.log

[root@node2 yum.repos.d]# ll -h /data/sde1/
总用量 160M
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo1.log
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo2.log
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo3.log
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo4.log

[root@node3 yum.repos.d]# ll -h /data/sde1
total 40M
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo5.log

[root@node4 yum.repos.d]# ll -h /data/sde1/
总用量 40M
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo5.log

破坏

[root@node2 yum.repos.d]# init 0
[root@localhost ~]# ls /text/
dis  dis-rep  dis-scrip  rep  strip
[root@localhost text]# ls -lh /data/sdb1
ls: 无法访问/data/sdb1: 没有那个文件或目录
[root@localhost text]# ^C
[root@localhost text]# cd ~
[root@localhost ~]# ls /text/
dis  dis-rep  dis-scrip  rep  strip
[root@localhost ~]# ls /text/dis
demo1.log  demo2.log  demo3.log  demo4.log
[root@localhost ~]# ls /text/dis-rep/
demo1.log  demo2.log  demo3.log  demo4.log  demo5.log
[root@localhost ~]# ls /text/dis-scrip/
demo5.log
[root@localhost ~]# ls /text/rep/
demo1.log  demo2.log  demo3.log  demo4.log  demo5.log
[root@localhost ~]# ls /text/strip/
ls: 正在读取目录/text/strip/: 传输端点尚未连接

删除卷

[root@node1 yum.repos.d]# gluster volume list 
dis-rep
dis-strip
dis-vol
rep-vol
strip-vol
[root@node1 yum.repos.d]# gluster volume stop rep-vol 
Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y
volume stop: dis-vol: success
[root@node1 yum.repos.d]# gluster volume delete rep-vol 
Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y
volume delete: dis-vol: failed: Some of the peers are down
'###这里说明需要将关了的机器开启'

[root@node1 yum.repos.d]# gluster volume stop rep-vol 
Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y
volume stop: rep-vol: success
[root@node1 yum.repos.d]# gluster volume delete rep-vol 
Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y
volume delete: rep-vol: success

访问控制

[root@node1 yum.repos.d]# gluster volume set dis-vol auth.reject 20.0.0.33
volume set: success
[root@node1 yum.repos.d]# gluster volume set dis-vol auth.allow 20.0.0.33
volume set: success

你可能感兴趣的:(理论+实验)