GlusterFS概述
GlusterFS简介
●开源的分布式文件系统
●由存储服务器,客户端以及NFS/Samba存储网关组成
●无元数据服务器
GlusterFS特点
●扩展性和高性能
●高可用性
●全局统一命名空间
●弹性卷管理
●基于标准协议
GlusterFS术语
- Brick:GFS中的存储单元
- Volume:一组bricks的逻辑集合
- FUSE:GFS的内核模块
- VFS:Linux核心概念
- Glusterd:glusterd服务
模块化堆栈式架构
●模块化,堆栈式架构
●通过对模块的组合,实现复杂的功能
GlusterFS工作原理
GlusterFS工作流程
弹性HASH算法
●通过HASH算法得到一个32位的整数
●划分为N个连续的子空间,每个空间对应一个Brick
●弹性HASH算法的优点
- 保证数据平均分布在每一个Brick中
- 解决了对元数据服务器的依赖,进而解决了单点故障以及访问瓶颈
GlusterFS的卷类型
- 分布式卷:分布式存储
- 条带卷:同时去读写
- 复制卷:复制一份到节点上
- 分布式条带卷
- 分布式复制卷
- 条带复制卷
- 分布式条带复制卷
分布式卷
●没有对文件进行分块处理
●通过扩展文件属性保存HASH值
●支持的底层文件系统有EXT3 EXT4 ZFS XFS等
分布式卷的特点
●文件分布在不同的服务器,不具备冗余性
●更容易和廉价地扩展卷地大小
●单点故障会造成数据丢失
●依赖底层的数据保护
创建分布式卷
在web1上面将web1的sdb1卷和web2的sdb1卷创建分布卷,名为dis-vol
[root@web1 yum.repos.d]# gluster volume create dis-vol web1:/data/sdb1 web2:/data/sdb1 force
条带卷
●根据偏移量将文件分成N块(N个条带点),轮询的内存在每个Brick Sever节点
●存储大文件时,性能尤为突出
●不具备冗余性,类似于Raid 0
●读写速度快,不具备安全性
特点
●数据被分割成更小块分布到块服务器群中的不同条带区
●分布减少了负载且更小的文件加速了存取的速度
●没有数据冗余
创建条带卷
在web3上面将web3的sdd1卷和web4的sdd1卷创建条带卷,名为stripe-volume
Stripe:分块
[root@web1 sdb1]# gluster volume create stripe-volume stripe 2 web3:/data/sdd1 web4:/data/sdd1 force
复制卷
●同一文件保存一份或多分副本
●因为要保存副本,所以磁盘利用率较低
●若多个节点上的存储空间不一致,将按照木桶效应取最低节点的容量作为该卷的总容量
木桶效应:以最小的内存空间为决定
特点
●卷中所有的服务器均保存一个完整的副本
●卷的副本数量可由客户创建的时候决定
●至少由两个块服务器或更多服务器
●具备冗余性
创建复制卷
在web3上面将web3的sdb1卷和web4的sdb1卷创建复制卷,名为rep-vol
[root@web1 sdb1]# gluster volume create rep-vol replica 2 web3:/data/sdb1 web4:/data/sdb1 force
分布式条带卷
●兼顾分布式卷和条带卷的功能
●主要用于大文件访问处理
●至少最少需要 4 台服务器
创建分布式条带卷
gluster volume create rep-volume replica 2 transport tcp server1:/dir1 server2:/dir2
分布式复制卷
●兼顾分布式卷和复制卷的功能
●用于需要冗余的情况下
创建分布式复制卷
在web3上面将web1的sde1卷和web2的sde1卷,web3的sde1,web4的sde1创建复制卷,名为dis-rep
[root@web3 ~]# gluster volume create dis-rep replica 2 web1:/data/sde1 web2:/data/sde1 web3:/data/sde1 web4:/data/sde1 force
GFS分布式存储实验
实验环境
推荐步骤
1.服务端的虚拟机插入4块硬盘,并进行挂载(4台服务端都需要插入4块磁盘做测试),这边举例web1
[root@promote ~]# setenforce 0 ##关闭防护系统
[root@promote ~]# systemctl stop firewalld.service ##关闭防火墙(这边一定要关闭防火墙)
[root@localhost ~]# hostnamectl set-hostname web1 ##修改主机名方便区分
[root@localhost ~]# su
[root@web1 ~]# fdisk -l ##查看磁盘分区情况
2.GFS集群开局设置
[root@web1 ~]# vim /etc/hosts ##修改主机配置文件
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.148.131 web1 ##尾行添加IP地址和对应的主机名
192.168.148.132 web2
192.168.148.133 web3
192.168.148.134 web4
[root@web1 ~]# scp /etc/hosts root@192.168.148.132:/etc/hosts ##用scp将修改过的配置文件拷贝到其他服务端,这样就不需要手动修改了
The authenticity of host '192.168.148.132 (192.168.148.132)' can't be established.
ECDSA key fingerprint is SHA256:vKFOoLyl7u5ksnUke5l4S+PbtZE1ZlisHuyy6PbCphU.
ECDSA key fingerprint is MD5:b9:f8:9d:9b:ae:95:fa:fd:5b:1f:db:eb:bf:e1:f1:e3.
Are you sure you want to continue connecting (yes/no)? yes ##输入yes
Warning: Permanently added '192.168.148.132' (ECDSA) to the list of known hosts.
root@192.168.148.132's password: ##输入密码
hosts 100% 243 140.0KB/s 00:00
Web3:
[root@web1 ~]# scp /etc/hosts root@192.168.148.133:/etc/hosts
Web4:
[root@web1 ~]# scp /etc/hosts root@192.168.148.134:/etc/hosts
[root@web1 ~]# cd /opt/
[root@web1 opt]# vim 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)
fdisk -l /dev/sda
break ;;
sd[b-z])
#create partitions
echo "n
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
[root@web1 opt]# chmod +x fdisk.sh
[root@web1 opt]# ./fdisk.sh ##执行脚本
查看挂载情况
将脚本拷贝到其他节点服务器,直接执行脚本查看挂载情况
[root@web1 opt]# scp fdisk.sh root@192.168.148.132:/opt/ ##拷贝到web2的/opt目录下,并执行
root@192.168.148.132's password:
fdisk.sh 100% 790 391.1KB/s 00:00
[root@web1 opt]# scp fdisk.sh root@192.168.148.133:/opt/ ##拷贝到web3,并执行
root@192.168.148.133's password:
fdisk.sh 100% 790 515.3KB/s 00:00
[root@web1 opt]# scp fdisk.sh root@192.168.148.134:/opt/ ####拷贝到web4,并执行
root@192.168.148.134's password:
fdisk.sh
2.四台web主机都安装GLFS软件并启动gluster服务,此处仅展示web1主机
[root@web2 opt]# yum -y install centos-release-gluster ##安装软件包
[root@web1 yum.repos.d]# yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
[root@web2 opt]# systemctl start glusterd ##启动服务
WEB2:
[root@web1 yum.repos.d]# ntpdate ntp1.aliyun.com ##所有服务器配置时间同步
3.添加存储信任池只要一台主机上添加其他节点即可
[root@web1 yum.repos.d]# gluster peer probe web2 ##添加web2节点
peer probe: success.
[root@web1 yum.repos.d]# gluster peer probe web3 ##添加web3节点
peer probe: success.
[root@web1 yum.repos.d]# gluster peer probe web4 ##添加web4节点
peer probe: success.
[root@web1 yum.repos.d]# gluster peer status ##查看节点状况
4.根据规划创建如下卷,分布卷;复制卷;分布复制卷;(6.1版本的gluster中的条带卷被移除了)
分布卷创建
1.在web1上面将web1的sdb1卷和web2的sdb1卷创建分布卷,名为dis-vol
[root@web1 yum.repos.d]# gluster volume create dis-vol web1:/data/sdb1 web2:/data/sdb1 force
[root@web1 yum.repos.d]# gluster volume info dis-vol ##查看卷组状态
[root@web1 yum.repos.d]# gluster volume start dis-vol ##将分布卷启动
[root@web1 yum.repos.d]# gluster volume stop dis-vol ##停止卷组
Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y ##输入yes
[root@web1 yum.repos.d]# gluster volume delete dis-vol ##删除卷组(删除前一定要先将卷组停止)
客户端做存储测试
[root@kehu ~]# yum -y install centos-release-gluster
[root@kehu ~]# yum -y install glusterfs glusterfs-server glusterfs-fuse ##安装glusterfs包
[root@kehu ~]# setenforce 0
[root@kehu ~]# systemctl stop firewalld
[root@kehu ~]# vim /etc/hosts ##客户端也需要修改主机配置文件
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.148.131 web1
192.168.148.132 web2
192.168.148.133 web3
192.168.148.134 web4
[root@kehu ~]# mkdir -p /test/dis ##创建一个挂载点
[root@kehu ~]# mount.glusterfs web3:dis-vol /test/dis/ ##将分布卷挂载到/test/dis目录下
在/OPT目录下创建5个垃圾文件做测试
[root@kehu ~]# cd /opt/
[root@kehu opt]# dd if=/dev/zero of=/opt/demo1.log bs=1M count=40
记录了40+0 的读入
记录了40+0 的写出
41943040字节(42 MB)已复制,0.0162679 秒,2.6 GB/秒
[root@kehu opt]# ls
demo1.log inotify-tools-3.14 inotify-tools-3.14.tar.gz redis-5.0.7 rh
[root@kehu opt]# dd if=/dev/zero of=/opt/demo2.log bs=1M count=40
记录了40+0 的读入
记录了40+0 的写出
41943040字节(42 MB)已复制,0.05392 秒,778 MB/秒
[root@kehu opt]# dd if=/dev/zero of=/opt/demo3.log bs=1M count=40
记录了40+0 的读入
记录了40+0 的写出
41943040字节(42 MB)已复制,0.144482 秒,290 MB/秒
[root@kehu opt]# dd if=/dev/zero of=/opt/demo4.log bs=1M count=40
记录了40+0 的读入
记录了40+0 的写出
41943040字节(42 MB)已复制,0.167853 秒,250 MB/秒
[root@kehu opt]# dd if=/dev/zero of=/opt/demo5.log bs=1M count=40
记录了40+0 的读入
记录了40+0 的写出
41943040字节(42 MB)已复制,0.173962 秒,241 MB/秒
[root@kehu opt]# ls
demo1.log demo2.log demo3.log demo4.log demo5.log inotify-tools-3.14 inotify-tools-3.14.tar.gz redis-5.0.7 rh
[root@kehu opt]# cp demo* /test/dis/ ##将测试文件拷贝到/挂载点目录下
[root@kehu opt]# cd /test/dis/
[root@kehu dis]# ls
demo1.log demo2.log demo3.log demo4.log demo5.log
回到服务端查看存储情况
Web1的存储情况,文件是完整的
Web2的存储情况
复制卷创建
服务端:
1.在web3上面将web3的sdb1卷和web4的sdb1卷创建复制卷,名为rep-vol
[root@web1 sdb1]# gluster volume create rep-vol replica 2 web3:/data/sdb1 web4:/data/sdb1 force
[root@web1 sdb1]# gluster volume start rep-vol ##将复制卷启动
客户端
[root@kehu dis]# mkdir /test/rep-vol
[root@kehu dis]# mount.glusterfs web3:rep-vol /test/rep-vol/
[root@kehu opt]# cp demo* /test/rep-vol/
回到服务端查看存储情况;发现复制卷是保存一份完整的
分布式复制卷
服务端:
在web3上面将web1的sde1卷和web2的sde1卷,web3的sde1,web4的sde1创建复制卷,名为dis-rep
[root@web3 ~]# gluster volume create dis-rep replica 2 web1:/data/sde1 web2:/data/sde1 web3:/data/sde1 web4:/data/sde1 force
[root@web3 ~]# gluster volume start dis-rep ##启动分布式复制卷
客户端配置
[root@kehu ~]# mkdir /test/dis-rep ##创建挂载目录
[root@kehu ~]# mount.glusterfs web1:dis-rep /test/dis-rep/ ##将卷组挂载到挂载目录下
[root@kehu ~]# cd /opt/
[root@kehu opt]# cp demo* /test/dis-rep/
回到服务端查看:
访问控制:
仅拒绝
[root@web4 sde1]# gluster volume set dis-vol auth.reject 192.168.148.135
仅允许
[root@web4 sde1]# gluster volume set dis-vol auth.allow 192.168.148.135