一、分布式文件系统介绍
分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源并不直接与本地节点相连,而是分布于计算网络中的一个或者多个节点的计算机上。目前意义上的分布式文件系统大多都是由多个节点计算机构成,结构上是典型的客户机/服务器模式。流行的模式是当客户机需要存储数据时,服务器指引其将数据分散的存储到多个存储节点上,以提供更快的速度,更大的容量及更好的冗余特性。
二、GlusterFS概述
GlusterFS系统是一个可扩展的网络文件系统,具有高扩展性、高可用性、高性能、可横向扩展等特点,并且其没有元数据服务器的设计,让整个服务没有单点故障的隐患。
三、GFS 专业术语
brick存储服务器:实际存储用户数据的服务器
volume:本地文件系统的“分区”
FUSE :用户空间的文件系统(类比EXT4),“这是一个伪文件系统”:以本地文件系统为例,用户想要读写一个文件,会借助于EXT4文件系统,然后把数据写在磁盘上,而如果是远端的GFS,客户端的请求则应该交给FUSE(伪文件系统),就可以实现跨节点存储在GFS上
FUSE(用户空间的文件系统)伪文件系统 用户端的交互模块
VFS(虚拟端口):内核态的虚拟文件系统,用户是先提交请求交给VFS 然后VFS交给FUSE 再交给GFS客户端,最后由客户端交给远端的存储
四、工作流程
客户端在本地发出读写请求,然后交由VFS 的API接受请求,接受请求后会交给FUSE(内核伪文件系统),FUSE可以模拟操作系统,所以可以对文件系统进行转存(交给GFS客户端),转存的设备位置为:/dev/fuse(用于传输的设备-虚拟设备文件),client 会根据配置文件对数据进行处理,然后再通过TCP/ib/rdma 网络发送到GFS服务端,并且将数据写到服务器存储设备上。
五、GlusterFS 支持卷的类型
基本卷
distribute volume:分布式卷
文件通过HASH算法分布到所有Brick Server上,一个节点的磁盘损坏,数据丢失
stripe volume:条带卷
文件被分成数据块并以轮询的方式分布到多个Brick Server上,文件存储以数据块为单位,支持大文件存储,文件越大,读取效率越高
replica volume:复制卷
将文件同步到多个Brick Server上,使其具备多个文件副本,具有容错能力。因为数据分散在多个 Brick 中,所以读性能得 到很大提升,但写性能下降。
复合卷
distribute stripe volume:分布式条带卷
Brick Server 数量是条带数(数据块分布 的 Brick 数量)的倍数,兼具分布式卷和条带卷的特点。
distribute replica volume:分布式复制卷
Brick Server 数量是镜像数(数据副本 数量)的倍数,兼具分布式卷和复制卷的特点
stripe replica volume:条带复制卷
类似 RAID 10,同时具有条带卷和复制卷的 特点
distribute stripe replicavolume:分布式条带复制卷
三种基本卷的复合卷,通常 用于类 Map Reduce 应用
六、实验
实验环境:所有节点添加四块磁盘
Node1节点:192.168.177.100
磁盘:/dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
挂载点:/data/sdb1 /data/sdc1 /data/sdd1 /data/sde1
Node2节点:192.168.177.110
磁盘:/dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
挂载点:/data/sdb1 /data/sdc1 /data/sdd1 /data/sde1
Node3节点:192.168.177.111
磁盘:/dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
挂载点:/data/sdb1 /data/sdc1 /data/sdd1 /data/sde1
Node4节点:192.168.177.130
磁盘:/dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
挂载点:/data/sdb1 /data/sdc1 /data/sdd1 /data/sde1
客户端节点:192.168.177.116
步骤一:环境准备:关闭防火墙、seLinux、ntp同步时钟(所有节点)
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
ntp ntp1.aliyun.com
步骤二:磁盘分区并挂载(所有node节点都做)
编辑分区挂载脚本
vim /opt/fdisk.sh
#!/bin/bash
#提示信息
echo "the disks exist list:"
#过滤出系统所带磁盘
fdisk -l |grep '磁盘 /dev/sd[a-z]'
echo "=================================================="
PS3="chose which disk you want to create:"
##选择需要创建的磁盘编号
select VAR in `ls /dev/sd*|grep -o 'sd[b-z]'|uniq` quit
do
case $VAR in
sda)
#本地磁盘就退出case语句
fdisk -l /dev/sda
break ;;
sd[b-z])
#免交互磁盘分区
echo "n ##创建磁盘
p
w" | fdisk /dev/$VAR
#格式化文件系统
mkfs.xfs -i size=512 /dev/${VAR}"1" &> /dev/null
#创建挂载目录
mkdir -p /data/${VAR}"1" &> /dev/null
#永久挂载
echo -e "/dev/${VAR}"1" /data/${VAR}"1" xfs defaults 0 0\n" >> /etc/fstab
#使得挂载生效
mount -a &> /dev/null
break ;;
quit)
break;;
*)
echo "wrong disk,please check again";;
esac
done
chmod +x /opt/fdisk.sh //给与执行权限
cd /opt/
./fdisk.sh //依次执行4次,分别将对应的磁盘挂载到对应的挂载点。示例:/dev/sdb1 --> /data/sdb1
步骤三:修改主机名,并添加映射(所有节点都做)
//以Node1节点为例:
hostnamectl set-hostname node1
echo "192.168.177.100 node1" >> /etc/hosts
echo "192.168.177.110 node2" >> /etc/hosts
echo "192.168.177.111 node3" >> /etc/hosts
echo "192.168.177.130 node4" >> /etc/hosts
echo "192.168.177.116 client" >> /etc/hosts
步骤四:安装并启动GlusterFS(所有node做)
提前上传软件库gfsrepo到opt目录下
//备份yum源的repo文件
cd /etc/yum.repos.d/
mkdir repo.bak
mv *.repo repo.bak
//解压
unzip gfsrepo.zip
//配置本地yum源
vim /etc/yum.repos.d/glfs.repo
[glfs]
name=glfs
baseurl=file:///opt/gfsrepo
gpgcheck=0
enabled=1
//重建yum源缓存
yum clean all && yum makecache
//安装需要的组件
yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
如果yum安装的时候报以上错误,是因为高低版本不兼容导致,手动卸载(又几个卸载几个)
例如上图的 glusterfs-libs-3.12.2-18.e17.x86_64 就需要手动卸载
rpm卸载需要忽略依赖关系,使用 --nodeps
示例:rpm -e --nodeps glusterfs-libs
//启动、开机自启并查看运行状态
systemctl start glusterd.service
systemctl enable glusterd.service
systemctl status glusterd.service
步骤五:添加节点到存储信任池中(在 node1 节点上操作)
gluster peer probe node1
gluster peer probe node2
gluster peer probe node3
gluster peer probe node4
步骤六:在每个Node节点上查看群集状态
gluster peer status
步骤七:根据规划创建如下卷
卷名称 | 卷类型 | 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) |
1、创建分布式卷
#创建分布式卷,没有指定类型,默认创建的是分布式卷
gluster volume create dis-volume node1:/data/sdb1 node2:/data/sdb1 force
#启动新建分布式卷
gluster volume start dis-volume
#查看创建分布式卷信息
gluster volume info dis-volume
2、创建条带卷
#指定类型为 stripe,数值为 2,且后面跟了 2 个 Brick 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、创建复制卷
#指定类型为 replica,数值为 2,且后面跟了 2 个 Brick 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、创建分布式条带卷
#指定类型为 stripe,数值为 2,而且后面跟了 4 个 Brick 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、创建分布式复制卷
指定类型为 replica,数值为 2,而且后面跟了 4 个 Brick 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
6、查看
查看卷列表
gluster volume list
步骤八:部署 Gluster 客户端
安装客户端软件,提前将gfsrepo 软件上传到/opt目下
cd /etc/yum.repos.d/
mkdir repo.bak
mv *.repo repo.bak
本地yum源配置
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
创建挂载目录
mkdir -p /test/{dis,stripe,rep,dis_stripe,dis_rep}
配置 /etc/hosts 文件
echo "192.168.226.128 node1" >> /etc/hosts
echo "192.168.226.129 node2" >> /etc/hosts
echo "192.168.226.130 node3" >> /etc/hosts
echo "192.168.226.131 node4" >> /etc/hosts
echo "192.168.226.132 client" >> /etc/hosts
挂载 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
测试 Gluster 文件系统
创建空文件
cd /opt
dd if=/dev/zero of=/opt/demo1.log bs=1M count=20
dd if=/dev/zero of=/opt/demo2.log bs=1M count=20
dd if=/dev/zero of=/opt/demo3.log bs=1M count=20
dd if=/dev/zero of=/opt/demo4.log bs=1M count=20
dd if=/dev/zero of=/opt/demo5.log bs=1M count=20
把创建的所有文件分别存到不同的卷中
cp demo* /test/dis
cp demo* /test/stripe/
cp demo* /test/rep/
cp demo* /test/dis_stripe/
cp demo* /test/dis_rep/
查看文件分布
1、查看分布式卷的文件分布:node1(/data/sdb1)、node2(/data/sdb1)
数据没有被分片,分别存储在node1(/data/sdb1)、node2(/data/sdb1)
2、查看条带卷的文件分布:node1(/data/sdc1)、node2(/data/sdc1)
数据被分片50%,平均的存储在 node1(/data/sdc1)、node2(/data/sdc1)
3、查看复制卷的文件分布:node3(/data/sdb1)、node4(/data/sdb1)
数据没有被分片 有副本 有冗余
4、查看分布式条带卷的文件分布:node1(/data/sdd1)、node2(/data/sdd1)、node3(/data/sdd1)、node4(/data/sdd1)
数据被分片50% 没副本 没冗余
5、查看分布式复制卷的文件分布:node1(/data/sde1)、node2(/data/sde1)、node3(/data/sde1)、node4(/data/sde1)
数据没有被分片 有副本 有冗余
破坏性测试
挂起 node2 节点,在客户端上查看文件是否正常
1、分布式卷数据查看,发现客户端少了demo5.log,这个文件按原本是在node2节点上的。
2、条带卷数据查看,因为条带卷将数据分片,此时的文件是不完整的,所以读取不到
3、复制卷数据查看,数据完整,因为有冗余
4、分布式条带卷数据查看,只有demo5.log,因为又做了分布式,又做了分片,而demo5.log这个文件是分片又分布在 node3和node4节点上,所以他的数据是完整的,可以看到,而node2节点故障,node1上的文件数据是不完整的,所以无法读取。
5、分布式复制数据查看,数据完整,具有冗余性
挂起 node2 和 node4 节点,在客户端上查看文件是否正常
6、再一次查看分布式条带卷数据,这一次demo5.log的文件也不完整了,所有所有数据都无法读取
7、查看分布式复制卷数据,依然是读取到数据的
通过以上的实验可以看出,凡是带复制的,数据都是比较安全的
其他的维护命令
查看GlusterFS卷
gluster volume list
查看所有卷的信息
gluster volume info
查看所有卷的状态
gluster volume status
停止一个卷
gluster volume stop dis-stripe
删除一个卷,注意:删除卷时,需要先停止卷,且信任池中不能有主机处于宕机状态,否则删除不成功
gluster volume delete dis-stripe
设置卷的访问控制
仅拒绝
gluster volume set dis-rep auth.deny 192.168.226.100
仅允许
gluster volume set dis-rep auth.allow 192.168.226.* #设置192.168.226.0网段的所有IP地址都能访问dis-rep卷(分布式复制卷)