一:Glusterfs概述
1.1Glusterfs简介
GlusterFS是Scale-Out存储解决方案Gluster的核心,它是一个开源的分布式文件系统,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。GlusterFS借助TCP/IP或InfiniBandRDMA网络将物理分布的存储资源聚集在一起,使用单一全局命名空间来管理数据。
1.2Glusterfs特点
1:扩展性和高性能
GlusterFS利用双重特性来提供几TB至数PB的高扩展存储解决方案。Scale-Out架构允许通过简单地增加资源来提高存储容量和性能,磁盘、计算和I/O资源都可以独立增加,支持10GbE和InfiniBand等高速网络互联。Gluster弹性哈希(ElasticHash)解除了GlusterFS对元数据服务器的需求,消除了单点故障和性能瓶颈,真正实现了并行化数据访问。
2:高可用性
GlusterFS可以对文件进行自动复制,如镜像或多次复制,从而确保数据总是可以访问,甚至是在硬件故障的情况下也能正常访问。自我修复功能能够把数据恢复到正确的状态,而且修复是以增量的方式在后台执行,几乎不会产生性能负载。GlusterFS没有设计自己的私有数据文件格式,而是采用操作系统中主流标准的磁盘文件系统(如EXT3、ZFS)来存储文件,因此数据可以使用各种标准工具进行复制和访问。
3:弹性卷管理
数据储存在逻辑卷中,逻辑卷可以从虚拟化的物理存储池进行独立逻辑划分而得到。存储服务器可以在线进行增加和移除,不会导致应用中断。逻辑卷可以在所有配置服务器中增长和缩减,可以在不同服务器迁移进行容量均衡,或者增加和移除系统,这些操作都可在线进行。文件系统配置更改也可以实时在线进行并应用,从而可以适应工作负载条件变化或在线性能调优。
4:全局统一命名空间
全局统一命名空间将所有的存储资源聚集成一个单一的虚拟存储池,对用户和应用屏蔽了物理存储信息。存储可以根据生产环境中的需要进行弹性扩展或收缩,在多节点场景中,全局统一命名还可以给予不同节点做负载均衡,大大提高存取效率。
5:Infiniband RDMA
无限宽带技术,是一种高性能计算和数据中心网络技术。它提供了一种低延迟、高带宽和可靠性的连接方式,用于连接服务器、存储设备和其他计算资源。InfiniBand 能够绕过操作系统内核,创建应用程序间通信的直接通道,为应用程序提供延迟极低的消息传输服务。
1.3术语介绍
GlusterFS:是一个开源的分布式文件系统。
Brick:GFS中的存储单元,通过是一个受信存储池中的服务器的一个导出目录。可以通过主机名和目录名来标识,如'SERVER:EXPORT'
Client:挂载了GFS卷的设备
FUSE:Filesystem Userspace是一个可加载的内核模块,其支持非特权用户创建自己的文件系统而不需要修改内核代码。通过在用户空间运行文件系统的代码通过FUSE代码与内核进行桥接。Node:一个拥有若干brick的设备
Volume:一组bricks的逻辑集合
Metadata:元数据,关于数据的数据,用于描述文件、目录等的信息。
VFS:内核空间对用户空间提供的访问磁盘的接口
POSIX:指可移植操作系统接口
二.GFS的工作原理
2.1GFS的工作流程
(1)客户端或应用程序通过GFS的挂载点访问数据
(2)Linux系统内核通过VFS API收到请求并处理
(3)VFS将数据递交给FUSE内核文件系统,并向系统注册一个实际的文件系统FUSE,而FUSE文件系统则是将数据通过/dev/Fuse设备文件递交给了GFS的client端。可以将FUSE文件系统理解为一个代理。
(4)GFS client收到数据后,client根据配置文件对数据进行处理
(5)经过GFS client处理后,通过网络将数据传递至远端的GFS Server,并且将数据写入服务器存储设备
2.2弹性HASH算法
GlusterFS目前使用Davies-Meyer算法计算文件名hash值,获得一个32位整数。Davies-Meyer算法具有非常好的hash分布性,计算效率很高,假设逻辑卷中的存储单元Brick有N个,则32位整数空间被平均划分为N个连续子空间,每个空间分别映射到一个存储单元Brick,计算得到的32位hash值就会被投射到一个存储单元Brick。
三.GlusterFS的卷类型
3.1卷的类型
1:基本卷
(1)distribute volume:分布式卷
文件通过hash算法分布到所有brick server上,这种卷是glusterfs的基础和最大特点;实只是扩大的磁盘空间,如果有一个磁盘坏了,对应的数据也丢失,文件级RAID 0,不具有容错能力。
(2)stripe volume:条带卷
类似RAID0,文件分成数据块以Round Robin方式分布到brick server上,并发粒度是数据块,支持超大文件,大文件性能高;
条带卷,在6的版本以后不在支持
(3)replica volume:复制卷
文件同步复制到多个brick上,文件级RAID 1,具有容错能力,写性能下降,读性能提升
(4)分散卷
是基于ErasureCodes(纠错码)的一种新类型的Volume(3.6版本正式发布该特性),类似于RAID5/6----分散卷基于纠错码。存储大文件时,性能尤为突出
通过配置Redundancy(冗余)级别提高可靠性,在保证较高的可靠性同时,可以提升物理存储空间的利用率
2:复合卷
(5)distribute stripe volume:分布式条带卷
brickserver数量是条带数的倍数,兼具distribute和stripe卷的特点;
(6)distribute replica volume:分布式复制卷
brickserver数量是镜像数的倍数,兼具distribute和replica卷的特点,可以在2个或多个节点之间复制数据。
(7)stripe replica volume:条带复制卷
类似RAID 10。同时具有条带卷和复制卷的特点
(8)distribute stripe replicavolume:分布式条带复制卷
三种基本卷的复合卷。通常用于类Map Reduce应用
(9)分布式分散卷
分布式分散卷在分散的子卷上分发文件。
分布式分散卷等效于分布式复制卷,但是使用分散子卷而不是复制子卷
结合distibuted和dispersed的优点,HA+LB+可扩容,HA+LB+可扩容
实验:
卷类型:
卷名称 |
卷类型 |
空间大小 |
Brick |
dis-volume |
分布式卷 |
12G |
node1(/e6)、node2(/e6) |
rep-volume |
复制卷 |
5G |
node3(/d5)、node4(/d5) |
stripe-volume |
分散卷 |
10G |
node1(/b3)、node2(/b3)、node3(/b3)、node4(/b3) |
dis-rep |
分布式复制卷 |
8G |
node1(/c4)、node2(/c4)、node3(/c4)、node4(/c4) |
dis-stripe |
分布式分散卷 |
12G |
node1(/f7)、node2(/f7)、node3(/f7)、node4(/f7) |
设备列表:
操作系统 |
系统IP |
主机名 |
挂载磁盘 |
挂载目录 |
Centos 7.9 |
192.168.10.101 |
node1 |
/dev/sdb(3G) /dev/sdc(4G) /dev/sdd(5G) /dev/sde(6G) /dev/sdf(7G) |
/b3 /c4 /d5 /e6 /f7 |
Centos 7.9 |
192.168.10.102 |
node2 |
/dev/sdb(3G) /dev/sdc(4G) /dev/sdd(5G) /dev/sde(6G) /dev/sdf(7G) |
/b3 /c4 /d5 /e6 /f7 |
Centos 7.9 |
192.168.10.103 |
node3 |
/dev/sdb(3G) /dev/sdc(4G) /dev/sdd(5G) /dev/sde(6G) /dev/sdf(7G) |
/b3 /c4 /d5 /e6 /f7 |
Centos 7.9 |
192.168.10.104 |
node4 |
/dev/sdb(3G) /dev/sdc(4G) /dev/sdd(5G) /dev/sde(6G) /dev/sdf(7G) |
/b3 /c4 /d5 /e6 /f7 |
Centos 7.9 |
192.168.10.105 |
node5 |
/dev/sdb(3G) /dev/sdc(4G) /dev/sdd(5G) /dev/sde(6G) /dev/sdf(7G) |
/b3 /c4 /d5 /e6 /f7 |
Centos 7.9 |
192.168.10.106 |
node6 |
/dev/sdb(3G) /dev/sdc(4G) /dev/sdd(5G) /dev/sde(6G) /dev/sdf(7G) |
/b3 /c4 /d5 /e6 /f7 |
Centos 7.9 |
192.168.10.107 |
client |
备注:在glusterfs 6.1版本之后,不在支持stripe ,分布式条带卷不再多说,在官方的安装文档卷的介绍中已经把条带卷移除了,因为这个卷的可用性太差,只要一个brick挂掉,整个就挂掉,客户端就不能访问,显然不符合生产环境。
一:部署集群环境
1.准备环境(六台相同)
(1)添加磁盘
- 六个虚拟机,各添加五块硬盘。
- 101、102、103、104、105、106:3,4,5,6,7G
- 开启同步,在xshell中重启六台,reboot
- fidsk -l
vi /tec/host
192.168.10.101 node1
192.168.10.102 node2
192.168.10.103 node3
…
192.168.10.106 node6
(2)为所有节点的新磁盘分区
fdisk /dev/sdb
fdisk /dev/sdc
fdisk /dev/sdd
fdisk /dev/sde
fdisk /dev/sdf
(3)为每个节点的每个磁盘格式化
mkfs -t xfs /dev/sdb1
mkfs -t xfs /dev/sdc1
mkfs -t xfs /dev/sdd1
mkfs -t xfs /dev/sde1
mkfs -t xfs /dev/sdf1
(4)挂载磁盘
mkdir /b3
mkdir /c4
mkdir /d5
mkdir /e6
mkdir /f7
(5)挂载磁盘
mount /dev/sdb1 /b3
mount /dev/sdc1 /c4
mount /dev/sdd1 /d5
mount /dev/sde1 /e6
mount /dev/sdf1 /f7
(6)修改fstab文件,使挂载永久生效
vi /etc/fstab
/dev/sdb1 /b3 xfs defaults 0 0
/dev/sdc1 /c4 xfs defaults 0 0
/dev/sdd1 /d5 xfs defaults 0 0
/dev/sde1 /e6 xfs defaults 0 0
/dev/sde1 /f7 xfs defaults 0 0
(7)在所有节点上关闭防火墙和selinux
systemctl stop firewalld
setenforce 0
(8)在所有节点上修改hosts文件
vi /etc/hosts
192.168.10.101 node1
192.168.10.102 node2
192.168.10.103 node3
192.168.10.104 node4
192.168.10.105 node5
192.168.10.106 node6
EOF
2:在所有节点上安装gfs
dnf -y install glusterfs glusterfs-server glusterfs-fuse
注释:
glusterfs:gluster客户端主程序
glusterfs-server:gluster服务端主程序
glusterfs-fuse:Filesystem Userspace是一个可加载的内核模块,其支持非特权用户创建自己的文件系统而不需要修改内核代码。通过在用户空间运行文件系统的代码通过FUSE代码与内核进行桥接。
glusterfs-rdma:为gluster提供远程直接内存访问,支持不通过双方的OS进行直接内存访问。
3:在所有节点上启动GFS
systemctl start glusterd.service
systemctl enable glusterd.service
4:添加节点(只在node1节点上)
gluster peer probe node1
gluster peer probe node2
gluster peer probe node3
gluster peer probe node4
gluster peer probe node5
gluster peer probe node6
5:在每个节点上查看状态
gluster peer status
备注:
重置GlusterFS集群(所有节点)
systemctl stop glusterd.service
rm -rf /var/lib/glusterd/*
systemctl start glusterd.service
二.创建卷
1:创建分布式卷(在node1上)
注释:默认创建的就是分布式卷
gluster volume create dist-volume node1:/e6 node2:/e6 force
gluster volume info dist-volume
gluster volume start dist-volume
2:创建复制卷
注释:复制卷要求复制的数量和Brick Server的数量(node的数量)相同
gluster volume create rep-volume replica 2 node3:/d5 node4:/d5 force
gluster volume info rep-volume
gluster volume start rep-volume
3:分散卷
gluster volume create disp-volume disperse 3 redundancy 1 node1:/b3 node2:/b3 node3:/b3 force
gluster volume info disp-volume
gluster volume start disp-volume
备注:
用三个分区创建分散卷,允许一个分区失效
分散卷中每三个brick允许有一个失效(3*1或6*2)
是基于ErasureCodes(纠错码)的一种新类型的Volume(3.6版本正式发布该特性),类似于RAID5/6。通过配置Redundancy(冗余)级别提高可靠性,在保证较高的可靠性同时,可以提升物理存储空间的利用率。redundancy 必须大于0,并且bricks的总数必须大于2 *redundancy 。 这意味着dispersed卷必须至少包含3个bricks。类似raid5/raid6,防止单点故障(HA),提升IO性能(LB)。
disperse 3 redundancy 1:需要3个brick
disperse 4 redundancy 1:需要4个brick
每个分散卷至少3个brick,冗余级别最小为1(一个brick失效)
在创建Dispersed volume时,如若redundancy值设置为0,则Dispersed volume等同于分布式卷,若redundancy设置为#Bricks/2,则Dispersed volume等同于复制卷,因此,在创建Dispersed volume时,redundancy值的设定应遵循以下公式: 0< redundancy<#Bricks /2
(disperse-data)+redundancy=disperse
1)3 bricks,创建Dispersed Type为1*(2+1),存储磁盘空间利用率66.7%;
2)10bricks,创建Dispersed Type为2*(4+1)的卷,存储磁盘空间利用率为80%。
备注:
原来的条带卷,在6的版本以后不在支持
gluster volume create strip-volume stripe 2 node1:/d5 node2:/d5 force
4:创建分布式复制卷
注释:分布式复制卷要求Brick Server的数量必须是复制数的倍数(两倍或更高的倍数)
gluster volume create dist-rep replica 2 node1:/c4 node2:/c4 node3:/c4 node4:/c4 force
gluster volume info dist-rep
gluster volume start dist-rep
5:分布式分散卷
gluster volume create dist-disp disperse 3 redundancy 1 node1:/f7 node2:/f7 node3:/f7 node4:/f7 node5:/f7 node6:/f7 force
gluster volume start dist-disp
备注:分布式分散卷需要用六个节点,每三个节点做一个分散卷,两组分散卷做成复制卷
三:部署GFS客户端
1:安装客户端软件
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# yum -y install glusterfs glusterfs-fuse
注释:上面两个包centos7系统已经默认安装过了
2:创建挂载目录
[root@localhost ~]# mkdir -p /test/{dist,rep,disp,dist_and_rep,dist_and_disp}
[root@localhost ~]# ls /test
3:修改hosts文件
[root@localhost ~]# cat <<EOF> /etc/hosts
192.168.10.101 node1
192.168.10.102 node2
192.168.10.103 node3
192.168.10.104 node4
192.168.10.105 node5
192.168.10.106 node6
EOF
4:挂载Gluster文件系统
[root@localhost ~]# mount -t glusterfs node1:dist-volume /test/dist
[root@localhost ~]# mount -t glusterfs node1:rep-volume /test/rep
[root@localhost ~]# mount -t glusterfs node1:disp-volume /test/disp
[root@localhost ~]# mount -t glusterfs node1:dist-rep /test/dist_and_rep
[root@localhost ~]# mount -t glusterfs node1:dist-disp /test/dist_and_disp
[root@localhost ~]# df -h
5:修改fstab配置文件
[root@localhost ~]# vi /etc/fstab
在末尾添加:
node1:dist-volume /test/dist glusterfs defaules,_netdev 0 0
node1:rep-volume /test/rep glusterfs defaules,_netdev 0 0
node1:dist-rep /test/dist_and_rep glusterfs defaules,_netdev 0 0
node1:disp-volume /test/disp glusterfs defaules,_netdev 0 0
node1:disp-rep /test/disp_and_rep glusterfs defaules,_netdev 0 0
四:在客户端测试Gluster文件系统
1:在卷中写入文件
(1)创建测试文件
dd if=/dev/zero of=/root/demo1.log bs=1M count=43
dd if=/dev/zero of=/root/demo2.log bs=1M count=43
dd if=/dev/zero of=/root/demo3.log bs=1M count=43
dd if=/dev/zero of=/root/demo4.log bs=1M count=43
dd if=/dev/zero of=/root/demo5.log bs=1M count=43
(2)卷中写入文件
[root@localhost ~]# cp demo* /test/dist/
[root@localhost ~]# cp demo* /test/rep/
[root@localhost ~]# cp demo* /test/dist_and_rep/
2:查看文件分布
(1)在node1和node2中查看分布式卷文件分布
node1:
[root@localhost ~]# ll -h /e6
总用量 173M
-rw-r--r--. 2 root root 43M 4月 17 22:06 demo1.log
-rw-r--r--. 2 root root 43M 4月 17 22:06 demo2.log
-rw-r--r--. 2 root root 43M 4月 17 22:06 demo3.log
-rw-r--r--. 2 root root 43M 4月 17 22:06 demo4.log
node2:
[root@localhost ~]# ll -h /e6
总用量 44M
-rw-r--r--. 2 root root 43M 4月 17 22:06 demo5.log
(3)在node3和node4中查看复制卷文件分布
node3:
[root@localhost ~]# ll -h /d5
总用量 216M
-rw-r--r--. 2 root root 43M 4月 17 22:06 demo1.log
-rw-r--r--. 2 root root 43M 4月 17 22:06 demo2.log
-rw-r--r--. 2 root root 43M 4月 17 22:06 demo3.log
-rw-r--r--. 2 root root 43M 4月 17 22:06 demo4.log
-rw-r--r--. 2 root root 43M 4月 17 22:06 demo5.log
node4:
[root@localhost ~]# ll -h /d5
总用量 216M
-rw-r--r--. 2 root root 43M 4月 17 22:06 demo1.log
-rw-r--r--. 2 root root 43M 4月 17 22:06 demo2.log
-rw-r--r--. 2 root root 43M 4月 17 22:06 demo3.log
-rw-r--r--. 2 root root 43M 4月 17 22:06 demo4.log
-rw-r--r--. 2 root root 43M 4月 17 22:06 demo5.log
(5)在node1、node2、node3、node4中查看分布式复制卷文件分布
node1:
[root@localhost ~]# ll -h /c4
总用量 173M
-rw-r--r--. 2 root root 43M 4月 17 22:06 demo1.log
-rw-r--r--. 2 root root 43M 4月 17 22:07 demo2.log
-rw-r--r--. 2 root root 43M 4月 17 22:07 demo3.log
-rw-r--r--. 2 root root 43M 4月 17 22:07 demo4.log
node2:
[root@localhost ~]# ll -h /c4
总用量 173M
-rw-r--r--. 2 root root 43M 4月 17 22:07 demo1.log
-rw-r--r--. 2 root root 43M 4月 17 22:07 demo2.log
-rw-r--r--. 2 root root 43M 4月 17 22:07 demo3.log
-rw-r--r--. 2 root root 43M 4月 17 22:07 demo4.log
node3:
[root@localhost ~]# ll -h /c4
总用量 44M
-rw-r--r--. 2 root root 43M 4月 17 22:07 demo5.log
node4:
[root@localhost ~]# ll -h /c4
总用量 44M
-rw-r--r--. 2 root root 43M 4月 17 22:07 demo5.log
五:破坏性测试
(1)挂起node2节点,在客户端上测试各个文件是否可以正常使用
(2)再挂起node4,在客户端继续测试各个文件的读取
六:其他维护命令
1:查看GFS卷
[root@localhost ~]# gluster volume list
dist-rep
dist-disp
dist-volume
rep-volume
disp-volume
[root@localhost ~]# gluster volume info
[root@localhost ~]# gluster volume status
2:停止删除卷
[root@localhost ~]# gluster volume stop dist-volume
Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y
volume stop: dis-stripe: success
[root@localhost ~]# gluster volume delete dist
Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y
volume delete: dis-stripe: failed: Some of the peers are down
3:设置卷的访问控制
[root@localhost ~]# gl