目录
一、文件系统简介
1、组成
①:接口:文件系统接口
②:功能模块(管理、存储的工具):对对像管理的软件集合
③:对象及属性:(使用此文件系统的消费者)
2、文件系统的作用
从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存
入的文件进行保护和检索的系统;主要负责为用户建立文件,存入、读出、修改、转储文件,控制
文件的存取。
3、文件系统的挂载使用
除根文件系统以外的文件系统创建后要使用需要先挂载至挂载点后才可以被访问,挂载点即
分区设备文件关联的某个目录文件;类比: NFS。
二、GlusterFSt分布式文件系统概述
用于存储、管理物理文件(保存磁盘时使用)
1、GlusterFSt简介
开源的分布式文件系统。
GFS的组成:由存储服务器(比如块服务器block)、客户端(对象)以及NFS/Samba存储网关组成(接
口),三个部分组成。
无元数据的服务器。(客户端的定位比较重要,因为他是无元数据服务器的)
1.1、元数据服务器的作用
存储元数据,帮用户定位文件的位置、索引等信息。
在元数据服务器文件系统中,如果元数据损坏,会直接导致文件系统不可用( 单点故障-服务器定
位)。即当客户端通过服务器查询数据时,服务器通过元数据库a,若是a宕机,数据也就丢失了,
客户端就无法获取数据。
而GFS把元数据服务器舍弃了,使用的是数据挂载形式挂载到客户端,挂载的网关是
NFS/Samba,实现abc三台GFS服务器数据共享,即使服务器a宕机,也可以从服务器B/C拿取数
据。
2、GlusterFS特点
扩展性和高性能:分布式特点
高可用性:分布式特点
全局统一命名空间:共享资源(名称空间:隔离、独立的整体/环境,与其他名称空间是隔离独立的)
弹性卷管理:条带、复制、分布式、分布式条带、分布式复制;类似raid
基于标准协议
3、GlusterFS术语
◆Brick存储服务器:实际存储用户数据的服务器
◆Volume:本地文件系统的"分区”
◆FUSE:用户 空间的文件系统(类比EXT4),“这是一个伪文件系统”;以本地文件系统为例,用户想
要读写一个文件,会借助于EXT4文件系统,然后把数据写在磁盘上;而如果是远端的GFS,客户
端的请求则应该交给FUSE(为文件系统),就可以实现跨界点存储在GFS上
◆VFS(虚拟端口) :内核态的虚拟文件系统,用户是先提交请求交给VFS然后VFS交给FUSE,再交
给GFS客户端,最后由客户端交给远端的存储
◆Glusterd(服务):是允许在存储节点的进程
4、模块化堆栈式架构
模块化、堆栈式的架构;通过对模块的组合,实现复杂的功能。
模块化:类似linux 编译安装;很多功能都可以做定制的,通常都是通过软件开发的方式封装为模
块,按需使用/不使用。
GlusterFs也是这个思想:把功能封装为一个个模块,通过加载/调用/启用的方式就可以调用对应的功能。
5、GFS工作流程
①、写的过程
GFS客户端服务器
需求:将数据保存在GFS文件系统中(客户端在本地发出写请求)
——首先,交由VFS的API接受请求——>组合功能模块,将数据交给FUSE(内核伪文件系统);
FUSE可以模拟操作系统,可以对文件系统进行转存,转存的设备位置为: /dev/fuse (用于传输的设
备-虚拟设备文件);
——接着,/dev/fuse 虚拟设备文件会将数据交给GFS客户端;
——接着,GFS客户端client会根据配置文件对数据进行处理,然后再通过TCP/IB/rdma网络发送
到GFS服务端;
——最后,GFS服务端服务器接收到数据之后,会将数据保存在对应的存储节点上。
详见下图
②、读取过程:
客户端在本地发出读请求
——首先,交由VFS的API接受请求——>组合功能模块,将数据交给FUSE(内核伪文件系统)
——接着,FUSE在/dev/fuse (用于传输的设备-虚拟设备文件)查询缓存,执行page函数读取(read)内存,若缓存有,则返回客户端;若没有缓存,GFS客户端会去GFS服务端获取数据,GFS服务端通过VFS接口去本地读取缓存;
——最后,再把缓存存储在/dev/fuse,读取了缓存数据之后再通过VFS返回给客户端
详见下图
注释:Application:客户端或应用程序通过GlusterFSync的挂载点访问数据
VFS:linux系统内核通过VFS的API 收到请求并处理
FUSE :VFS将数据递交给FUSE内核文件系统,fuse文件系统则是将数据通过/dev/fuse设备文件递
交给了GlusterFS
GlusterFS Client ;通过网络将数据传递至远端的GlusterFS Server, 并且写入到服务器存储设备上
6、提高GFS的工作效率的架构模式
gige: 千兆网/千兆接口
TCP/IP :网络协议
InfiniBand:网络协议,与TCP/IP相比,TCP/IP具有转发丢失数据包的特性,基于此通讯协议可能
导致通讯变慢,而IB使用基于信1、流控制的机制来确保连接完整性,数据包丢失几率小。
RDMA:负责数据传输,有一种数据传输协议,功能:为了解决传输中客户端与服务器端数据处理的
延迟。
POSIX:可移植操作系统接口,主要解决不同操作系统间的移植性然后再转换为逻辑存储(EXT4
+BRICK)。
7、分布式(平均分配)的好处
当数据量越来越大的时候,相对每个存储节点的数据量(几率)是相等的,而如果考虑到单点故
障问题,当数据存储再c存储节点,对此GFS是会有备份机制的,默认3备份,所以GFS本身的机
制会对数据产生冗余,以此解决单点故障。
三、卷的基本分类
为了解决分布式文件数据索引、定位的复杂程度,而使用了HASH算法来辅助。
GlusterFS支持七种卷,即分布式卷、条带卷、复制卷、分布式条带卷、分布式复制卷、条带复制
卷和分布式条带复制卷。
1、基本卷(分布式卷、条带卷、复制卷)
①、分布式卷(默认)(distribute volume)
文件通过HASH算法分布到所有Brick Server上,这种卷是Glusterfs的基础;以文件为单位根据
HASH算法散列到不同的Brick, 其实只是扩大了磁盘空间,如果有一块磁盘损坏,数据也将丢失,
属于文件级的RAID 0, 不具有容错能力。
分布式卷没有对文件进行分块处理,文件只能存在一个server中,效率不提升;它通过扩展文件属
性保存HASH值,支持的底层文件系统有EXT3、EXT4、 ZFS、 XFS等。
特点:
文件分布在不同的服务器,不具备冗余性;
更容易和廉价地扩展卷的大小;
单点故障会造成数据丢失;
依赖底层的数据保护。
②、条带卷(stripe volume)
类似RAID 0,文件被分成数据块并以轮询的方式分布到多个BrickServer上,文件存储以数据
块为单位,支持大文件存储,文件越大,读取效率越高。
比如:100m的数据分成50m+50m分不到不同的服务器上,分布之后是以数据块为单位进行存储。
条带卷根据偏移量将文件分成N块(N个条带节点),轮询的存储在每个Brick Server节点;存储
大文件时,性能尤为突出;不具备冗余性,类似Raid0。(从多个server中同时读取文件,效率提
升)。
● 特点:
数据被分割成更小块分布到块服务器群中的不同条带区
分布减少了负载且更小的文件加速了存取的速度
没有数据冗余
③、复制卷
将文件同步到多个Brick上,使其具备多个文件副本, 属于文件级RAID 1,具有容错能力。因
为数据分散在多个Brick中,所以读性能得到很大提升,但写性能下降。
同一文件保存一份或多分副本;因为要保存副本,所以磁盘利用率较低;若多个节点上的存储空间
不一致,将按照木桶效应取最低节点的容量作为该卷的总容量。
● 特点:
卷中所有的服务器均保存一个完整的副本
卷的副本数量可由客户创建的时候决定
至少由两个块服务器或更多服务器
具备冗余性
2、复合卷(分布式条带、分布式复制、……)
④、分布式条带卷(Distribute Stripe volume)
Brick Server 数量是条带数(数据块分布的Brick数量)的倍数,兼具分布式卷和条带卷的特点
⑤、分布式复制卷(Distribute Replica volume)
Brick Server 数量是镜像数(数据副本数量)的倍数,兼具分布式卷和复制卷的特点
⑥、条带复制卷(Stripe Replica volume)
类似RAID 10, 同时具有条带卷和复制卷的特点
⑦、分布式条带复制卷(Distribute Stripe Replicavolume)
三种基本卷的复合卷,通常用于类Map Reduce.应用
3、相关维护命令
#查看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.allow 192.168.163.100 #设置卷的访问控制,黑白名单,仅允许
gluster volume set dis-rep auth.allow 192.168.163.* #设置192.168.163.0网段的所有IP地址都能访问dis-rep卷(分布式复制卷)
四、部署GlusterFSt群集
1、实验环境
各节点名称、IP及部分配置 | |||
节点 | ip | 磁盘 | 挂载点 |
node1 | 192.168.110.128 | sdb1、sdc1、sdd1、sde1 | /data |
node2 | 192.168.110.129 | sdb1、sdc1、sdd1、sde1 | /data |
node3 | 192.168.110. 130 | sdb1、sdc1、sdd1、sde1 | /data |
node4 | 192.168.110. 131 | sdb1、sdc1、sdd1、sde1 | /data |
client | 192.168.110.132 | / | / |
四台服务器均配置如下环境:
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
#时间同步
ntpdate ntp1.aliyun.com
#修改对应主机名
hostname node1 ##临时修改主机名;四台节点服务器均需要修改
2、使用脚本对硬盘进行分区挂载
所有服务器节点上都需要做如下操作。
vim /opt/fdisk.sh
#!/bin/bash
echo "the disks exist list:"
##grep出系统所带磁盘
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])
#create partitions
echo "n ##创建磁盘,注意下面p后面三行空的,代表确认键
p
w" | fdisk /dev/$VAR
#make filesystem
##格式化
mkfs.xfs -i size=512 /dev/${VAR}"1" &> /dev/null
#mount the system
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/
sh -x fdisk.sh #执行脚本4次
3、配置/etc/hosts文件
echo "192.168.110.128 node1" >> /etc/hosts
echo "192.168.110.129 node2" >> /etc/hosts
echo "192.168.110.130 node3" >> /etc/hosts
echo "192.168.110.131 node4" >> /etc/hosts
echo "192.168.110.132 client" >> /etc/hosts
cat /etc/hosts #查看
4、安装、启动GFS分布式文件系统
所有节点上都需要做如下操作(包括client端)。
#####编辑GFS的源
gfsrepo压缩包上传至opt目录下
unzip gfsrepo.zip #解压
cd /etc/yum.repos.d/
mkdir bak
mv CentOS-* bak
vim glfs.repo ##配置yum本地源
[glfs]
name=glfs
baseurl=file:///opt/gfsrepo
gpgcheck=1
enabled=1
:wq
yum clean all && yum makecache
df -hT
#####安装gluster软件包
yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
# -glusterfs-server服务端软件、glusterfs-fuse使用gfs文件系统软件
systemctl start glusterd #开启gluster服务
systemctl enable glusterd.service #开机自启
systemctl status glusterd.service #查看状态
netstat -antp | grep glusterd
#####添加存储信任池(只在节点1操作即可)
gluster peer probe node1
gluster peer probe node2
gluster peer probe node3
gluster peer probe node4
#查看群集状态(可以在每个节点上使用)
gluster peer status
5、创建五种卷
根据规划创建如下卷
卷名称 | 卷类型 | 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) |
①创建分布式卷
#没有指定类型,默认创建的是分布式卷.
###利用node1和node2上的两块磁盘创建,dis-vol为磁盘名,force表示强制
gluster volume create dis-vol node1:/data/sdb1 node2:/data/sdb1 force
gluster volume list ##查看卷列表
gluster volume start dis-vol ##启动新建分布式卷
gluster volume info dis-vol ##查看创建分布式卷信息
②创建条带卷
#指定类型为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 ##查看创建条带卷信息
③创建复制卷
#指定类型为replica, 数值为2,且后面跟了2个Brick Server,所以创建的是复制卷。
gluster volume create rep-vol replica 2 node3:/data/sdb1 node4:/data/sdb1 force
gluster volume start rep-vol ##启动新建复制卷
gluster volume info rep-vol ##查看创建复制卷信息
④创建分布式条带卷
#指定类型为stripe,数值为2,而且后面跟了4个BrickServer,是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 ##查看创建分布式条带卷信息
⑤创建分布式复制卷(需要四个节点)
指定类型为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、客户端操作
客户端的操作:在node1上创建五个卷后,在客户端上把卷挂载在指定的五个目录内,在目录
内写入了五个文件,五个文件分别保存在五个目录里面
①、环境配置及安装客户端软件
systemctl stop firewalld
setenforce 0
vim /etc/resolv.conf #添加如下
nameserver 114.114.114.114
ntpdate ntp1.aliyun.com #同步时间
#配置 /etc/hosts 文件,做地址映射
echo "192.168.110.128 node1" >> /etc/hosts
echo "192.168.110.129 node2" >> /etc/hosts
echo "192.168.110.130 node3" >> /etc/hosts
echo "192.168.110.131 node4" >> /etc/hosts
#配置源
cd /etc/yum.repos.d/
mkdir repo.bak
mv *.repo repo.bak
vim glfs.repo #添加如下内容
[glfs]
name=glfs
baseurl=file:///opt/gfsrepo
gpgcheck=0
enabled=1
cd /opt/ #在此目录下准备gfsrepo压缩包
unzip gfsrepo.zip
yum clean all && yum makecache
yum -y install glusterfs glusterfs-fuse
②、创建挂载目录,并对应进行临时挂载
mkdir -p /test/{dis,strip,rep,dis_str,dis_rep}
mount.glusterfs node1:dis-vol /test/dis
mount.glusterfs node1:stripe-vol /test/strip
mount.glusterfs node1:rep-vol /test/rep
mount.glusterfs node1:dis-stripe /test/dis_str
mount.glusterfs node1:dis-rep /test/dis_rep
##永久挂载在文件 中添加如下
vim /etc/fstab #添加如下
nodel :dis-volume /test/dis glusterfs defaults,_ netdev 0 0
node1 : stripe-volume /test/stripel glusterfs defaults,_ netdev 0 0
nodel : 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
7、测试gluster文件系统
①、卷中写入文件,客户端操作
#在opt目录下做如下操作,创建文件
cd /opt
##从/dev/zero内复制文件到opt目录下,命名demo1,大小1M,20次,一共20M
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
ls -lh /opt
#卷中写入文件
#将前面创建的满文件拷贝到每个卷下面
cp /opt/demo* /test/dis
cp /opt/demo* /test/dis_str/
cp /opt/demo* /test/dis_rep/
cp /opt/demo* /test/rep/
cp /opt/demo* /test/strip/
②、在gluster服务器上面查看分布式文件分布
ls -lh /data/sdb1 ##没有被分片,文件分开节点存放
现象:分布式只会将demo文件分开存储(5个文件不在同一磁盘分区上),不会将数据分片和备
份。
③、查看条带卷文件分布
ls -lh /data/sdc1 ##查询数据被分片50% 没副本 没冗余
现象:条带卷会将每个demo文件中的数据分片存储(两个分区各有10M的文件),没有备份。
④、查看复制卷分布
复制卷放在了node3、node4
ll -h /data/sdb1 ##没有被分片,有副本,有冗余
现象:复制卷会将每个文件放入卷中的磁盘分区中(两分区的文件一样)
⑤、查看分布式条带卷分布
ll -h /data/sdd1 ##文件被分片50%,没副本,没冗余
现象:分布式条带卷中,带有分布式和条带卷的特点,即将数据分片,又将文件分开存储,没有备
份。
⑥、查看分布式复制卷分布
ll -h /data/sde1 ##数据没有被分片 有副本 有冗余
现象:分布式复制卷中,带有分布式和复制卷的特点,即将文件分开存储,又复制一遍文件(备
份)。
8、冗余测试
挂起 node2 节点或者关闭glusterd服务来模拟故障
systemctl stop glusterd ##关闭glusterd服务node2节点来模拟故障
#####在客户端上查看文件是否正常
①#测试分布式是否正常 #ls /test/dis
结论:数据查看,缺少demo5,文件demo5是存储在node2上的,所以分布式卷不具备冗余
② #测试条带是否正常 #ls /test/stripe
结论:文件中没有数据,说明数据全部丢失,所以条带卷不具备冗余
③#测试分布式条带是否正常 #ll /test/dis_stripe
结论:存储在node1和node2上的4个文件不见了(数据是分片存储的),所以分布式条带卷不具
备冗余。
#####在node3和node4中选一个关闭的,关闭node4进行测试,
④#测试复制带是否正常 #ls /test/rep
结论:文件和数据都在,所以分布式复制卷具有冗余
⑤#测试分布复制带是否正常 #ls /test/dis_rep
实验结果证明:只要带复制卷特性的数据的相比而言,数据比较安全
总结
分布式卷:属于文件级的RAID0,不具备容错能力,如果有一块磁盘损坏,数据就丢失
条带卷:类似RAID0,文件将被分成数据块并以轮询方式分布到Brick server上
复制卷:将文件同步到多个Brick上,属于文件RAID1,数据分数在多个Brick中
分布式条带卷:Brick server 数量是条带数兼具分布式卷和条带卷的特定
分布式复制卷:Brick server数量是镜像数,兼具分布式卷和复制卷的特点
条带复制卷:类似RAID10,同时具有条带卷和复制卷的特点
分布式条带复制卷:三种基本卷的集合