GFS分布式文件系统2

263 阅读12分钟

GlusterFS分布式文件系统

是一个开源的分布式文件系统

GFS三个组件

  • 存储服务器
  • 客户端
  • NFS/Samba存储网关

GFS没有元数据(就是没有保存数据的地方)

GFS的特点

  • 扩展性和高性能:运用分布式
  • 高可用性:有冗余(可以备份)
  • 全局统一的命名空间
  • 弹性卷管理:类似于redi0、redi1等
  • 基于标准协议:基于tcp等协议

GFS术语

  • brick(块存储):存储的服务器
  • volume(逻辑卷):本地文件系统分区,逻辑卷等
  • fuse(内核模块):用于存放的文件的文件系统,伪文件系统
  • vfs(虚拟文件系统):虚拟文件系统,虚拟端口
  • glusterd

弹性hash算法

  • 通过hash算法得到一个32位的整数
  • 划分为N个连续的子空间,每个空间对应一个brick

弹性hash的优点

  • 保证数据平均分布在每一个brick中
  • 解决了对于元数据服务器的依赖,进而解决了单点故障以及访问瓶颈

GFS工作原理

  1. 客户端通过GFS访问挂载点,通过系统内核、端口等发送数据到vfs虚拟文件系统端口
  2. 数据到达vfs后,由vfs转发到到fuse伪文件系统并且存在内存中
  3. fuse拿到数据后,会通过/dev/fuse/提交给gfs客户机
  4. gfs客户端接收到数据之后,通过进程,基于tcp协议,将数据转发给服务端
  5. 服务端接收到数据之后,转发给本地的gfs系统,通过内核、vfs虚拟接口转发给ext3等真实的文件系统存储起来

image.png

GFS卷类型

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

分布式卷-dis

将多个文件,分布在不同的服务器节点上进行保存

  • 不会对文件进行分块处理
  • 保留hash值
  • 支持底层文件系统:ext3、ext4、xfs等

特点

对于扩展卷的大小更容易,也便宜

缺点

  • 文件分布在不同的服务器,没有冗余功能
  • 单点故障会造成数据丢失
  • 依赖底层的数据保护

示例语句

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

uster volume create dis-volume server1:/dir1 server2:/dir2 server3:/dir3

条带卷-stripe

根据偏移量将文件分成N块(有N个条带节点的时候),并且以轮询的方式存储在每个brick server节点上,支持大文件存储, 文件越大,读取效率越高,

特点

  • 数据被分割成更小块分布到服务器群众的不同条带区
  • 分布式减少了负载且更小的文件加速了存取的速度
  • 性能高,可以存储大文件

缺点

没有数据冗余,坏一块,数据就丢失了

示例语句

创建了一个名为stripe-volume的条带卷,文件将被分块轮询的存储在Server1:/dir1和Server2:/dir2两个Brick中

gluster volume create stripe-volume stripe 2 transport tcp server1:/dir1 server2:/dir2

复制卷-rep

将文件同步到多个 Brick 上,文件存储在A服务器上,复制卷会再将数据复制一份保存在B服务器上

  • 若干个节点上的存储空间不一致,取最低节点的容量作为总容量
  • 至少有两块服务器或更多的服务器

特点

  • 卷中所有的服务器均保存一个完整的副本,不怕丢失
  • 卷的副本数量可由客户创建的时候决定
  • 具有数据冗余功能

缺点

  • 磁盘利用率低(要保存副本)

示例语句

创建名为rep-volume的复制卷,文件将同时存储两个副本,分别在Server1:/dir1和Server2:/dir2两个Brick中

gluster volume create rep-volume replica 2 transport tcp server1:/dir1 server2:/dir2

分布式条带卷-dis_stripe

将数据以分布式存入磁盘中

特点

  • 兼顾分布式卷和条带卷的功能
  • 主要用于大文件访问处理
  • 至少最少需要4台服务器
  • 具有数据冗余功能(可以备份)

示例语句

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

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

分布式复制卷-dis_rep

将单个文件复制到磁盘中,Brick Server数量是镜像数(数据副本数量)的2倍。

特点

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

示例语句

#创建一个名为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

了解5个即可

实验

部署GlusterFS群集

环境

客户端:192.168.42.11

node1:192.168.42.12

  • 磁盘:/dev/sdb1
  • 挂载点:
    • /mnt/adb1
    • /dev/sdc1
    • /dev/sdd1
    • /dev/sde1

node2:192.168.42.13

  • 磁盘:/dev/sdb1
  • 挂载点:
    • /data/adb1
    • /dev/sdc1
    • /dev/sdd1
    • /dev/sde1

node3:192.168.42.14

  • 磁盘:/dev/sdb1
  • 挂载点:
    • /data/adb1
    • /dev/sdc1
    • /dev/sdd1
    • /dev/sde1

node4:192.168.42.15

  • 磁盘:/dev/sdb1
  • 挂载点:
    • /mnt/adb1
    • /dev/sdc1
    • /dev/sdd1
    • /dev/sde1 每个机子,添加4块盘,一个盘5G就可以,然后重启,刷新硬盘

关闭防火墙

#关闭防火墙与增强功能
[root@client ~]# systemctl stop firewalld
[root@client ~]# setenforce 0

image.png

image.png

image.png

image.png

查看硬盘是否添加成功
[root@node1 ~]# lsblk

image.png

image.png

image.png

image.png

磁盘分区和挂载(以node1为例)

分区,有四个硬盘需要分区,太多太复杂,容易乱,可以直接使用脚本做分区。

[root@node1 ~]# 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 /mnt/${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
#运行

image.png

image.png

修改配置/etc/hosts文件(以node1为例)

做之前最好将主机名字修改好,这边是修改好的

[root@node1 opt]# echo "192.168.42.12 node1" >> /etc/hosts
[root@node1 opt]# echo "192.168.42.13 node2" >> /etc/hosts
[root@node1 opt]# echo "192.168.42.14 node3" >> /etc/hosts
[root@node1 opt]# echo "192.168.42.15 node4" >> /etc/hosts

image.png

安装和启动GFS(以node1为例)

#使用yum安装GFS,将GFS的安装包下载到/opt目录中
#使用unzip解压
[root@node1 opt]# unzip gfsrepo.zip

#编辑一个glfs源
[root@node1 ~]# cd /etc/yum.repos.d/
[root@node1 yum.repos.d]# mkdir repo.bak
[root@node1 yum.repos.d]# mv *.repo repo.bak
[root@node1 yum.repos.d]# vim glfs.repo
#编辑文件
[glfs]
name=glfs
baseurl= file:///opt/gfsrepo
gpgcheck=0
enabled=1

[root@node1 yum.repos.d]# yum clean all && yum makecache
#清理域名缓存,重新加载元数据
[root@node1 yum.repos.d]# yum -y install glusterfs glusterfs-server gluster-fuse gluster-rdma
#下载安装GFS等服务
[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
#查看服务状态是否开启

image.png

image.png

53d0616e282c4fb22a86a366ee39104.png

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

只要在一台node节点上添加其他节点就可以

#在node1上就不需要添加自己节点
[root@node1 ~]# gluster peer probe node2
[root@node1 ~]# gluster peer probe node3
[root@node1 ~]# gluster peer probe node4
#在node1节点没添加成功,在node2添加成功了

[root@node1 ~]# gluster peer status
#查看群集状态

image.png

image.png

扩展(添加节点排错)

如果显示传输点尚未连接的情况

  • 查看防火墙是否关闭
  • 查看/etc/hosts中节点对应ip是否正确
  • 查看节点是否开启
  • 查看节点是否存在

都有的话,就在其他机子上添加节点,也是可以,最后再查看节点开启情况

创建卷

创建分布式卷

[root@node1 ~]# gluster volume create node1:/mnt/sdb1 node2:/data/sdb1 force
#创建分布式卷,没有指定类型,默认创建的是分布式卷
[root@node1 ~]# gluster volume list
#查看卷列表
[root@node1 ~]# gluster volume start dis-volume
#启动新建的分布式卷
[root@node1 ~]# gluster volume info dis-volume
#查看创建分布式卷信息

image.png

创建条带卷

[root@node1 ~]# gluster volume create stripe-volume stripe 2 node1:/mnt/sdc1 node2:/data/sdc1 force
#指定类型为 stripe,数值为 2,且后面跟了 2 个 Brick Server,所以创建的是条带卷
[root@node1 ~]# gluster volume start stripe-volume
#开启条带卷
[root@node1 ~]# gluster volume info stripe-volume
#查看列表

image.png

创建复制卷

[root@node1 ~]# gluster volume create rep-volume replica 2 node3:/data/sdb1 node4:/mnt/sdb1 force
#指定类型为 replica,数值为 2,且后面跟了 2 个 Brick Server,所以创建的是复制卷
[root@node1 ~]# gluster volume start rep-volume
[root@node1 ~]# gluster volume info rep-volume

image.png

创建分布式条带卷

[root@node1 ~]# gluster volume create dis-stripe stripe 2 node1:/mnt/sdd1 node2:/data/sdd1 node3://data/sdd1 node4:/mnt/sdd1 force
#指定类型为 stripe,数值为 2,而且后面跟了 4 个 Brick Server,是 2 的两倍,所以创建的是分布式条带卷
[root@node1 ~]# gluster volume start dis-stripe
[root@node1 ~]# gluster volume info dis-stripe

image.png

创建分布式复制卷

[root@node1 ~]# gluster volume create dis-rep replica 2 node1:/mnt/sde1 node2:/data/sde1 node3:/data/sde1 node4:/mnt/sde1 force
#指定类型为 replica,数值为 2,而且后面跟了 4 个 Brick Server,是 2 的两倍,所以创建的是分布式复制卷
[root@node1 ~]# gluster volume start dis-rep
[root@node1 ~]# gluster volume info dis-rep

[root@node1 ~]# gluster volume list
#查看当前所有卷的列表

image.png

image.png

部署Gluster客户端

安装客户端软件

将gfsrepo 软件上传到/opt目下
[root@client ~]# cd /etc/yum.repos.d/
[root@client yum.repos.d]# mkdir repo.bak
[root@client yum.repos.d]# mv *.repo repo.bak
[root@client yum.repos.d]# vim glfs.repo
[glfs]
name=glfs
baseurl=file:///opt/gfsrepo
gpgcheck=0
enabled=1

[root@client yum.repos.d]# yum clean all
[root@client yum.repos.d]# yum makecache

[root@client ~]# yum -y install glusterfs glusterfs-fuse

image.png

image.png

image.png

创建挂载目录

[root@client ~]# mkdir -p /test/{dis,stripe,rep,dis_stripe,dis_rep}
#创建挂在目录
[root@client ~]# ls /test/

image.png

配置/etc/hosts文件

[root@client ~]# echo "192.168.42.12 node1" >> /etc/hosts
[root@client ~]# echo "192.168.42.13 node2" >> /etc/hosts
[root@client ~]# echo "192.168.42.14 node3" >> /etc/hosts
[root@client ~]# echo "192.168.42.15 node4" >> /etc/hosts

image.png

挂在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

这边使用临时挂载

[root@client ~]# mount.glusterfs node1:dis-volume /test/dis
[root@client ~]# mount.glusterfs node1:stripe-volume /test/stripe
[root@client ~]# mount.glusterfs node1:rep-volume /test/rep
[root@client ~]# mount.glusterfs node1:dis-stripe /test/dis_stripe
[root@client ~]# mount.glusterfs node1:dis-rep /test/dis_rep

image.png

image.png

测试gluster文件系统

客户端,卷中写入文件

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

[root@client ~]# cp /opt/demo* /test/dis
[root@client ~]# cp /opt/demo* /test/stripe/
[root@client ~]# cp /opt/demo* /test/rep/
[root@client ~]# cp /opt/demo* /test/dis_stripe/
[root@client ~]# cp /opt/demo* /test/dis_rep/

image.png

image.png

查看文件分布(在node节点上查看)

查看分布式文件分布
node1:
#数据没有被分片
[root@node1 ~]# ls -lh /mnt/sdb1
node2:
[root@node2 ~]# ll -h /data/sdb1

image.png

image.png

查看条带卷文件分布
#数据被分片50% 没副本 没冗余
node1:
[root@node1 ~]# ls -lh /mnt/sdc1
node2:
[root@node2 ~]# ll -h /data/sdc1

image.png

image.png

查看复制卷分布
#数据没有被分片 有副本 有冗余     
node3:
[root@node3 ~]# ll -h /data/sdb1
node4:
[root@node4 ~]# ll -h /mnt/sdb1

image.png

image.png

查看分布式条带卷分布
#数据被分片50% 没副本 没冗余
node1:
[root@node1 ~]# ls -lh /mnt/sdd1
node2:
[root@node2 ~]# ll -h /data/sdd1
node3:
[root@node3 ~]# ll -h /data/sdd1
node4:
[root@node4 ~]# ll -h /mnt/sdd1

image.png

image.png

image.png

image.png

查看分布式复制卷分布
#数据没有被分片 有副本 有冗余
node1:
[root@node1 ~]# ll -h /mnt/sde1
node2:
[root@node2 ~]# ll -h /data/sde1
node3:
[root@node3 ~]# ll -h /data/sde1
node4:
[root@node4 ~]# ll -h /mnt/sde1

image.png

image.png

image.png

image.png

破坏性测试

挂起node2节点或者关闭gluster服务去模拟故障

第一种方法:
[root@node2 ~]# systemctl stop glusterd.service
#关闭服务
[root@node1 ~]# gluster peer status
#可以看见node2不在开启中,虽然可以检测到
第二种方法:
可以打开虚拟机,直接将node2的机子给挂起,但是千万不要关机

第一种方法: image.png

image.png 第二种方法:

image.png

分布式卷数据查看

[root@client ~]# ll /test/dis
#只会看见4个demo文件,因为demo5.log是在node2上的

image.png

条带卷

[root@client ~]# ll /test/stripe/
#会无法访问到数据,因为条带卷没有冗余性,所以节点挂了,数据也就消失了

image.png

分布式条带卷

[root@client ~]# ll /test/dis_stripe/
#只能访问demo5.log,无法访问到其他demo,因为条带卷不具有冗余功能

image.png

分布式复制卷

[root@client ~]# ll /test/dis_rep/
#都可以访问到,因为分布式复制卷具有备份冗余功能

image.png

再将node4节点挂起来

复制卷

[root@client ~]# ll /test/rep/
#都会访问到,因为复制卷有冗余功能

image.png

分布式条带卷

[root@client ~]# ll /test/dis_stripe/
#没有数据,因为没有备份冗余功能,所以节点挂了,数据就丢失了

image.png

分布式复制卷

[root@client ~]# ll /test/dis_rep/
#有冗余功能,所以数据不会消失

image.png

扩展

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.80.100
#仅允许
gluster volume set dis-rep auth.allow 192.168.80.*	  #设置192.168.80.0网段的所有IP地址都能访问dis-rep卷(分布式复制卷)

解决报错

如果实在安装时候报错,那可能是版本过高,需要先解除依赖关系

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

总结

GFS是一个开源的分布式文件系统

  • 由存储服务器、客户端以及NFS/Samba存储网关组成
  • 没有元数据

特点

  • 高可用
  • 高性能
  • 弹性卷管理
  • 基于标准协议

GFS卷

  • 分布式卷
    • 没有冗余功能
    • 廉价
  • 条带卷
    • 没有冗余功能
    • 减少负载,加速数据存取速度
  • 复制卷
    • 具有冗余功能
    • 所有服务器保存在一个完整的副本中
    • 副本数量可以自定义
    • 需要两个或者两个以上服务器
  • 分布式条带卷
    • 至少需要4个服务器
    • 大文件访问处理
    • 具有分布式卷与条带卷的功能
  • 分布式复制卷
    • 具有冗余功能
    • 有分布式卷与复制卷的功能
    • 存储服务器数量必须为2倍
  • 条带复制卷
  • 分布式条带复制卷

其中前5个知道就可以