GlusterFS分布式文件系统
是一个开源的分布式文件系统
GFS三个组件
- 存储服务器
- 客户端
- NFS/Samba存储网关
GFS没有元数据(就是没有保存数据的地方)
GFS的特点
- 扩展性和高性能:运用分布式
- 高可用性:有冗余(可以备份)
- 全局统一的命名空间
- 弹性卷管理:类似于redi0、redi1等
- 基于标准协议:基于tcp等协议
GFS术语
- brick(块存储):存储的服务器
- volume(逻辑卷):本地文件系统分区,逻辑卷等
- fuse(内核模块):用于存放的文件的文件系统,伪文件系统
- vfs(虚拟文件系统):虚拟文件系统,虚拟端口
- glusterd
弹性hash算法
- 通过hash算法得到一个32位的整数
- 划分为N个连续的子空间,每个空间对应一个brick
弹性hash的优点
- 保证数据平均分布在每一个brick中
- 解决了对于元数据服务器的依赖,进而解决了单点故障以及访问瓶颈
GFS工作原理
- 客户端通过GFS访问挂载点,通过系统内核、端口等发送数据到vfs虚拟文件系统端口
- 数据到达vfs后,由vfs转发到到fuse伪文件系统并且存在内存中
- fuse拿到数据后,会通过/dev/fuse/提交给gfs客户机
- gfs客户端接收到数据之后,通过进程,基于tcp协议,将数据转发给服务端
- 服务端接收到数据之后,转发给本地的gfs系统,通过内核、vfs虚拟接口转发给ext3等真实的文件系统存储起来
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
查看硬盘是否添加成功
[root@node1 ~]# lsblk
磁盘分区和挂载(以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
#运行
修改配置/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
安装和启动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
#查看服务状态是否开启
添加节点到存储信任池中(在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
#查看群集状态
扩展(添加节点排错)
如果显示传输点尚未连接的情况
- 查看防火墙是否关闭
- 查看/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
#查看创建分布式卷信息
创建条带卷
[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
#查看列表
创建复制卷
[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
创建分布式条带卷
[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
创建分布式复制卷
[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
#查看当前所有卷的列表
部署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
创建挂载目录
[root@client ~]# mkdir -p /test/{dis,stripe,rep,dis_stripe,dis_rep}
#创建挂在目录
[root@client ~]# ls /test/
配置/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
挂在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
测试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/
查看文件分布(在node节点上查看)
查看分布式文件分布
node1:
#数据没有被分片
[root@node1 ~]# ls -lh /mnt/sdb1
node2:
[root@node2 ~]# ll -h /data/sdb1
查看条带卷文件分布
#数据被分片50% 没副本 没冗余
node1:
[root@node1 ~]# ls -lh /mnt/sdc1
node2:
[root@node2 ~]# ll -h /data/sdc1
查看复制卷分布
#数据没有被分片 有副本 有冗余
node3:
[root@node3 ~]# ll -h /data/sdb1
node4:
[root@node4 ~]# ll -h /mnt/sdb1
查看分布式条带卷分布
#数据被分片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
查看分布式复制卷分布
#数据没有被分片 有副本 有冗余
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
破坏性测试
挂起node2节点或者关闭gluster服务去模拟故障
第一种方法:
[root@node2 ~]# systemctl stop glusterd.service
#关闭服务
[root@node1 ~]# gluster peer status
#可以看见node2不在开启中,虽然可以检测到
第二种方法:
可以打开虚拟机,直接将node2的机子给挂起,但是千万不要关机
第一种方法:
第二种方法:
分布式卷数据查看
[root@client ~]# ll /test/dis
#只会看见4个demo文件,因为demo5.log是在node2上的
条带卷
[root@client ~]# ll /test/stripe/
#会无法访问到数据,因为条带卷没有冗余性,所以节点挂了,数据也就消失了
分布式条带卷
[root@client ~]# ll /test/dis_stripe/
#只能访问demo5.log,无法访问到其他demo,因为条带卷不具有冗余功能
分布式复制卷
[root@client ~]# ll /test/dis_rep/
#都可以访问到,因为分布式复制卷具有备份冗余功能
再将node4节点挂起来
复制卷
[root@client ~]# ll /test/rep/
#都会访问到,因为复制卷有冗余功能
分布式条带卷
[root@client ~]# ll /test/dis_stripe/
#没有数据,因为没有备份冗余功能,所以节点挂了,数据就丢失了
分布式复制卷
[root@client ~]# ll /test/dis_rep/
#有冗余功能,所以数据不会消失
扩展
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个知道就可以