一、GlusterFS概述
1.1 GlusterFS简介
- 开源的分布式文件系统,是Scale存储的核心,能够处理千数量级的客户端
- 由存储服务器、客户端以及NFS/Samba 存储网关组成
- 无元数据服务器
1.2 GlusterFS的特点
- 扩展性和高性能
- 高可用性
- 全局统一命名空间
- 弹性卷管理
- 基于标准协议
1.3 GlusterFS术语
- Brick:GFS中的存储单元,通过是一个受信存储池中的服务器的一个导出目录。可以通过主机名和目录名来标识,如’SERVER:EXPORT’
- Volume:卷
- FUSE:内核文件系统,Filesystem Userspace是一个可加载的内核模块,其支持非特权用户创建自己的文件系统而不需要修改内核代码。通过在用户空间运行文件系统的代码通过FUSE代码与内核进行桥接。
- VFS:虚拟文件系统
- Glusterd:Gluster management daemon,要在trusted storage pool中所有的服务器上运行
1.4 模块化堆栈式架构
- 模块化、堆栈式的架构
- 通过对模块的组合,实现复杂的功能
注:
RDMA协议:去中心化
二、GlusterFS工作原理
2.1 GlusterFS工作流程
- 客户端或应用程序通过GlusterFS的挂载点访问数据
- Linux系统内核通过VFS API收到请求并处理
- VFS将数据递交给FUSE内核文件系统, fuse文件系统则是将数据通过/dev/fuse设备文件递交给了GlusterFS client端
- GlusterFS client 收到数据后,client根据配置文件的配置对数据进行处理
- 通过网络将数据传递至远端的GlusterFS Server,并且将数据写入到服务器存储设备上
2.2 弹性HASH算法
- 通过HASH算法得到一个32位的整数
- 划分为N个连续的子空间,每个空间对应一个Brick
- 弹性HASH算法的优点
◆ 保证数据平均分布在每一个Brick中
◆ 解决了对元数据服务器的依赖,进而解决了单点故障以及访问瓶颈
注: 通过HASH算法是随机存储,不是轮询
三、GlusterFS 的卷类型
■ 分布式卷
■ 条带卷
■ 复制卷
■ 分布式条带卷
■ 分布式复制卷
■ 条带复制卷
■ 分布式条带复制卷
3.1 分布式卷
- 没有对文件进行分块处理
- 通过扩展文件属性保存HASH值
- 支持的底层文件系统有EXT3、EXT4、ZFS、XFS等
分布式卷的特点
- 文件分布在不同的服务器,不具备冗余性
- 更容易和廉价地扩展卷的大小
- 单点故障会造成数据丢失
- 依赖底层的数据保护
创建分布式卷
- 创建命令:创建一个名为dis-volume的分布式卷,文件将根据HASH分布在server1:/dir1 、server2:/dir2和server3:/dir3中
gluster volume create dis-volume server1:/dir1 server2:/dir2
3.2 条带卷
- 根据偏移量将文件分成N块(N个条带节点),轮询的存储在每个Brick Server节点
- 存储大文件时,性能尤为突出
- 不具备冗余性,类似Raid0
特点
- 数据被分割成更小块分布到块服务器群中的不同条带区
- 分布减少了负载且更小的文件加速了存取的速度
- 没有数据冗余
创建条带卷
- 创建了一个名为stripe-volume的条带卷,文件将被分块轮询的存储在server1:/dir1 server2:/dir2两个Brick中
gluster volume create stripe-volume stripe 2 transport tcp server1:/dir1 server2:/dir2
3.3 复制卷
- 同一文件保存一份或多分副本
- 复制模式因为要保存副本,所以磁盘利用率较低
- 多个节点上的存储空间不一致,那么将按照木桶效应取最低节点的容量作为该卷的总容量
特点
- 卷中所有的服务器均保存一个完整的副本
- 卷的副本数量可由客户创建的时候决定
- 至少由两个块服务器或更多服务器
- 具备冗余性
创建复制卷
- 创建名为rep-volume的复制卷,文件将同时存储两个副本,分别在server1:/dir1 server2:/dir2两个Brick中
gluster volume create rep-volume replica 2 transport tcp server1:/dir1 server2:/dir2
3.4 分布式条带卷
- 兼顾分布式卷和条带卷的功能
- 主要用于大文件访问处理
- 至少最少需要4台服务器
创建分布式条带卷
- 创建了名为dis-stripe的分布式条带卷,配置分布式的条带卷时,卷中Brick所包含的存储服务器数必须为条带数的偶数倍数(>=2倍)
gluster volume create dis-stripe stripe 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4
3.5 分布式复制卷
- 兼顾分布式卷和复制卷的功能
- 用于需要冗余的情况下
创建分布式复制卷
- 创建名为dis-rep的分布式条带卷,配置分布复制卷时,卷中Brick所包含的存储服务器数必须为条带数的偶数倍数(>=2倍)
gluster volume create dis-rep replica 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4
四、实验:GlusterFS部署
群集环境
卷类型
设备列表
操作系统 | IP | 主机名 |
---|---|---|
CentOS 7.4 | 20.0.0.21 | node1 |
CentOS 7.4 | 20.0.0.22 | node2 |
CentOS 7.4 | 20.0.0.23 | node3 |
CentOS 7.4 | 20.0.0.24 | node4 |
CentOS 7.4 | 20.0.0.25 | client |
4.1 开局
关闭防火墙、核心防护
所有node节点都需要
[root@node1 ~]# vi /etc/hosts
20.0.0.21 node1
20.0.0.22 node2
20.0.0.23 node3
20.0.0.24 node4
###更改主机名
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3
hostnamectl set-hostname node4
node1上:
scp /etc/hosts root@20.0.0.22:/etc/hosts
scp /etc/hosts root@20.0.0.23:/etc/hosts
scp /etc/hosts root@20.0.0.24:/etc/hosts
getenforce: 查看selinux的状态
Enforing: 强制模式,代表SELinux在运行中,且已经开始限制domain/type之间的验证关系
Permissive: 宽容模式,代表SELinux在运行中,不过不会限制domain/type之间的验证关系,即使验证步正确,进程仍可以对文件进行操作,不过如果验证不正确会发出警告
Disabled: 关闭模式,SELinux没有实际运行
创建自动格式化,自动永久挂载脚本
[root@node1 ~]# vi gsf.sh
#!/bin/bash
for V in $(ls /dev/sd[b-z])
do
echo -e "n\np\n\n\n\nw\n" |fdisk $V
mkfs.xfs -i size=512 ${V}1 &>/dev/null
sleep 1
M=$(echo "$V" |awk -F "/" '{print $3}')
mkdir -p /data/${M}1 &>/dev/null
echo -e "${V}1 /data/${M}1 xfs defaults 0 0\n" >>/etc/fstab
mount -a &>/dev/null
done
4.2 glusterd的yum源配置
[root@node1 yum.repos.d]# vim local.repo
[GLFS]
name=glfs
baseurl=http://mirror.centos.org/centos/$releasever/storage/$basearch/gluster-3.12/
gpgcheck=0
enabled=1
[root@node1 yum.repos.d]# yum clean all
[root@node1 yum.repos.d]# yum makecache
[root@node1 yum.repos.d]# yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
[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
4.3 4个节点均时间同步
ntpdate ntp.aliyun.com
4.4 添加存储信息池,只要在一台节点主机上添加即可
[root@node1 yum.repos.d]# gluster peer probe node2
peer probe: success.
[root@node1 yum.repos.d]# gluster peer probe node3
peer probe: success.
[root@node1 yum.repos.d]# gluster peer probe node4
peer probe: success.
'查看节点池'
[root@node1 ~]# gluster peer status
4.4 创建分布式卷
[root@node1 yum.repos.d]# gluster volume create dis-vol node1:/data/sdb1 node2:/data/sdb1 force ###创建分布式卷,force:强制执行
volume create: dis-vol: success: please start the volume to access data
[root@node1 yum.repos.d]# gluster volume info dis-vol ###查看分布式卷信息
Volume Name: dis-vol
Type: Distribute
Volume ID: 5ced04aa-1fa5-42e1-b273-2da41bb31469
Status: Created
Snapshot Count: 0
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: node1:/data/sdb1
Brick2: node2:/data/sdb1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
[root@node1 yum.repos.d]# gluster volume list ###查看卷列表
dis-vol[root@node1 yum.repos.d]# gluster volume start dis-vol ###开启分布式卷
volume start: dis-vol: success
[root@node1 yum.repos.d]# gluster volume info dis-vol ###查看分布式卷信息
Volume Name: dis-vol
Type: Distribute
Volume ID: 5ced04aa-1fa5-42e1-b273-2da41bb31469
Status: Started
Snapshot Count: 0
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: node1:/data/sdb1
Brick2: node2:/data/sdb1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
4.5 创建条带卷
[root@node2 yum.repos.d]# gluster volume create strip-vol strip 2 node1:/data/sdc1 node2:/data/sdc1 force
volume create: strip-vol: success: please start the volume to access data
[root@node2 yum.repos.d]# gluster volume start strip-vol
volume start: strip-vol: success
[root@node2 yum.repos.d]# gluster volume info strip-vol
Volume Name: strip-vol
Type: Stripe
Volume ID: 66d151bd-7790-4774-a1c8-513bd0c9e796
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: node1:/data/sdc1
Brick2: node2:/data/sdc1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
4.6 创建复制卷
[root@node1 yum.repos.d]# gluster volume create rep-vol replica 2 node3:/data/sdb1 node4:/data/sdb1 force
volume create: rep-vol: success: please start the volume to access data
[root@node1 yum.repos.d]# gluster volume list
dis-vol
rep-vol
strip-vol
[root@node1 yum.repos.d]# gluster volume start rep-vol
volume start: rep-vol: success
4.7 创建分布式条带
[root@node1 yum.repos.d]# gluster volume create dis-strip stripe 2 node1:/data/sdd1 node2:/data/sdd1 node3:/data/sdd1 node4:/data/sdd1 force
volume create: dis-strip: success: please start the volume to access data
[root@node1 yum.repos.d]# gluster volume list
dis-strip
dis-vol
rep-vol
strip-vol
[root@node1 yum.repos.d]# gluster volume start dis-strip
volume start: dis-strip: success
[root@node1 yum.repos.d]# gluster volume info dis-strip
Volume Name: dis-strip
Type: Distributed-Stripe
Volume ID: 19a0b846-fc67-4e08-b81a-9cdb10b77bf8
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: node1:/data/sdd1
Brick2: node2:/data/sdd1
Brick3: node3:/data/sdd1
Brick4: node4:/data/sdd1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
4.8 创建分布式复制卷
[root@node3 yum.repos.d]# gluster volume create dis-rep replica 2 node1:/data/sde1 node2:/data/sde1 node3:/data/sde1 node4:/data/sde1 force
volume create: dis-rep: success: please start the volume to access data
[root@node3 yum.repos.d]# gluster volume list
dis-rep
dis-strip
dis-vol
rep-vol
strip-vol
[root@node3 yum.repos.d]# gluster volume start dis-rep
volume start: dis-rep: success
[root@node3 yum.repos.d]# gluster volume info dis-rep
Volume Name: dis-rep
Type: Distributed-Replicate
Volume ID: 1d542149-6ce1-468f-b81f-96b876181d64
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: node1:/data/sde1
Brick2: node2:/data/sde1
Brick3: node3:/data/sde1
Brick4: node4:/data/sde1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
五、客户端配置
[root@localhost yum.repos.d]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
20.0.0.21 node1
20.0.0.22 node2
20.0.0.23 node3
20.0.0.24 node4
[root@localhost yum.repos.d]# yum -y install glusterfs glusterfs-fuse
[root@localhost yum.repos.d]# yum -y install glusterfs glusterfs-fuse
[root@localhost ~]# mkdir -p /test/dis
[root@localhost ~]# mkdir -p /test/strip
[root@localhost ~]# mkdir -p /test/rep
[root@localhost ~]# mkdir -p /test/dis_stripe
[root@localhost ~]# mkdir -p /test/dis_rep
[root@localhost ~]# mount.glusterfs node1:dis-vol /test/dis
[root@localhost ~]# mount.glusterfs node2:stripe-vol /test/strip
[root@localhost ~]# mount.glusterfs node3:rep-vol /test/rep
[root@localhost ~]# mount.glusterfs node4:dis-stripe /test/dis_stripe
[root@localhost ~]# mount.glusterfs node1:dis-rep /test/dis_rep
创建5个大小为40M的文件
[root@localhost test]# dd if=/dev/zero of=/demo1.log bs=1M count=40
[root@localhost test]# dd if=/dev/zero of=/demo2.log bs=1M count=40
[root@localhost test]# dd if=/dev/zero of=/demo3.log bs=1M count=40
[root@localhost test]# dd if=/dev/zero of=/demo4.log bs=1M count=40
[root@localhost test]# dd if=/dev/zero of=/demo5.log bs=1M count=40
复制5个文件,存到刚才创的文件进行存储
[root@localhost test]# cp /demo* dis
[root@localhost test]# cp /demo* strip/
[root@localhost test]# cp /demo* rep/
[root@localhost test]# cp /demo* dis_stripe/
[root@localhost test]# cp /demo* dis_rep/
[root@localhost test]# ls dis
demo1.log demo2.log demo3.log demo4.log demo5.log
[root@localhost test]# ls dis-rep/
demo1.log demo2.log demo3.log demo4.log demo5.log
六、测试
查看分布式卷
[root@node1 yum.repos.d]# ll -h /data/sdb1
total 160M
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo1.log
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo2.log
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo3.log
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo4.log
[root@node2 yum.repos.d]# ll -h /data/sdb1/
总用量 40M
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo5.log
查看条带卷文件分布
[root@node1 yum.repos.d]# ll -h /data/sdc1
total 100M
-rw-r--r-- 2 root root 20M Oct 28 01:09 demo1.log
-rw-r--r-- 2 root root 20M Oct 28 01:09 demo2.log
-rw-r--r-- 2 root root 20M Oct 28 01:09 demo3.log
-rw-r--r-- 2 root root 20M Oct 28 01:09 demo4.log
-rw-r--r-- 2 root root 20M Oct 28 01:09 demo5.log
[root@node2 yum.repos.d]# ll -h /data/sdc1/
总用量 100M
-rw-r--r-- 2 root root 20M 10月 27 17:09 demo1.log
-rw-r--r-- 2 root root 20M 10月 27 17:09 demo2.log
-rw-r--r-- 2 root root 20M 10月 27 17:09 demo3.log
-rw-r--r-- 2 root root 20M 10月 27 17:09 demo4.log
-rw-r--r-- 2 root root 20M 10月 27 17:09 demo5.log
查看复制卷文件分布
[root@node3 yum.repos.d]# ll -h /data/sdb1
total 200M
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo1.log
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo2.log
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo3.log
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo4.log
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo5.log
[root@node4 yum.repos.d]# ll -h /data/sdb1/
总用量 200M
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo1.log
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo2.log
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo3.log
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo4.log
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo5.log
查看分布式条带卷
[root@node1 yum.repos.d]# ll -h /data/sdd1
total 80M
-rw-r--r-- 2 root root 20M Oct 28 01:09 demo1.log
-rw-r--r-- 2 root root 20M Oct 28 01:09 demo2.log
-rw-r--r-- 2 root root 20M Oct 28 01:09 demo3.log
-rw-r--r-- 2 root root 20M Oct 28 01:09 demo4.log
[root@node2 yum.repos.d]# ll -h /data/sdd1/
总用量 80M
-rw-r--r-- 2 root root 20M 10月 27 17:09 demo1.log
-rw-r--r-- 2 root root 20M 10月 27 17:09 demo2.log
-rw-r--r-- 2 root root 20M 10月 27 17:09 demo3.log
-rw-r--r-- 2 root root 20M 10月 27 17:09 demo4.log
[root@node3 yum.repos.d]# ll -h /data/sdd1
total 20M
-rw-r--r-- 2 root root 20M Oct 28 01:09 demo5.log
[root@node4 yum.repos.d]# ll -h /data/sdd1/
总用量 20M
-rw-r--r-- 2 root root 20M 10月 27 17:09 demo5.log
查看分布式复制卷
[root@node1 yum.repos.d]# ll -h /data/sde1
total 160M
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo1.log
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo2.log
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo3.log
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo4.log
[root@node2 yum.repos.d]# ll -h /data/sde1/
总用量 160M
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo1.log
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo2.log
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo3.log
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo4.log
[root@node3 yum.repos.d]# ll -h /data/sde1
total 40M
-rw-r--r-- 2 root root 40M Oct 28 01:09 demo5.log
[root@node4 yum.repos.d]# ll -h /data/sde1/
总用量 40M
-rw-r--r-- 2 root root 40M 10月 27 17:09 demo5.log
破坏
[root@node2 yum.repos.d]# init 0
[root@localhost ~]# ls /text/
dis dis-rep dis-scrip rep strip
[root@localhost text]# ls -lh /data/sdb1
ls: 无法访问/data/sdb1: 没有那个文件或目录
[root@localhost text]# ^C
[root@localhost text]# cd ~
[root@localhost ~]# ls /text/
dis dis-rep dis-scrip rep strip
[root@localhost ~]# ls /text/dis
demo1.log demo2.log demo3.log demo4.log
[root@localhost ~]# ls /text/dis-rep/
demo1.log demo2.log demo3.log demo4.log demo5.log
[root@localhost ~]# ls /text/dis-scrip/
demo5.log
[root@localhost ~]# ls /text/rep/
demo1.log demo2.log demo3.log demo4.log demo5.log
[root@localhost ~]# ls /text/strip/
ls: 正在读取目录/text/strip/: 传输端点尚未连接
删除卷
[root@node1 yum.repos.d]# gluster volume list
dis-rep
dis-strip
dis-vol
rep-vol
strip-vol
[root@node1 yum.repos.d]# gluster volume stop rep-vol
Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y
volume stop: dis-vol: success
[root@node1 yum.repos.d]# gluster volume delete rep-vol
Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y
volume delete: dis-vol: failed: Some of the peers are down
'###这里说明需要将关了的机器开启'
[root@node1 yum.repos.d]# gluster volume stop rep-vol
Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y
volume stop: rep-vol: success
[root@node1 yum.repos.d]# gluster volume delete rep-vol
Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y
volume delete: rep-vol: success
访问控制
[root@node1 yum.repos.d]# gluster volume set dis-vol auth.reject 20.0.0.33
volume set: success
[root@node1 yum.repos.d]# gluster volume set dis-vol auth.allow 20.0.0.33
volume set: success