开源的、可扩展的分布式文件系统。由存储服务器、客户端以及NFS/Samba 存储网关组成的无元数据服务器。用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上,并提供容错功能。它可以给大量的用户提供总体性能较高的服务。
扩展性和高性能
GlusterFS利用双重特性来提供几TB至数PB的高扩展存储解决方案。Scale-Out架构允许通过简单地增加资源来提高存储容量和性能,磁盘、计算和I/O资源都可以独立增加,支持10GbE和InfiniBand等高速网络互联。Gluster弹性哈希(ElasticHash)解除了GlusterFS对元数据服务器的需求,消除了单点故障和性能瓶颈,真正实现了并行化数据访问。
高可用性
GlusterFS可以对文件进行自动复制,如镜像或多次复制,从而确保数据总是可以访问,甚至是在硬件故障的情况下也能正常访问。自我修复功能能够把数据恢复到正确的状态,而且修复是以增量的方式在后台执行,几乎不会产生性能负载。GlusterFS没有设计自己的私有数据文件格式,而是采用操作系统中主流标准的磁盘文件系统(如EXT3、ZFS)来存储文件,因此数据可以使用各种标准工具进行复制和访问。
全局统一命名空间
全局统一命名空间将磁盘和内存资源聚集成一个单一的虚拟存储池,对上层用户和应用屏蔽了底层的物理硬件。存储资源可以根据需要在虚拟存储池中进行弹性扩展,比如扩容或收缩。当存储虚拟机映像时,存储的虚拟映像文件没有数量限制,成千虚拟机均通过单一挂载点进行数据共享。虚拟机I/O可在命名空间内的所有服务器上自动进行负载均衡,消除了SAN环境中经常发生的访问热点和性能瓶颈问题。
弹性卷管理
数据储存在逻辑卷中,逻辑卷可以从虚拟化的物理存储池进行独立逻辑划分而得到。存储服务器可以在线进行增加和移除,不会导致应用中断。逻辑卷可以在所有配置服务器中增长和缩减,可以在不同服务器迁移进行容量均衡,或者增加和移除系统,这些操作都可在线进行。文件系统配置更改也可以实时在线进行并应用,从而可以适应工作负载条件变化或在线性能调优。
基于标准协议
Gluster存储服务支持NFS,CIFS, HTTP, FTP以及Gluster原生协议,完全与POSIX标准兼容。现有应用程序不需要作任何修改或使用专用API,就可以对Gluster中的数据进行访问。这在公有云环境中部署Gluster时非常有用,Gluster对云服务提供商专用API进行抽象,然后提供标准POSIX接口
弹性HASH算法
数据储存在逻辑卷中,逻辑卷可以从虚拟化的物理存储池进行独立逻辑划分而得到。存储服务器可以在线进行增加和移除,不会导致应用中断。逻辑卷可以在所有配置服务器中增长和缩减,可以在不同服务器迁移进行容量均衡,或者增加和移除系统,这些操作都可在线进行。文件系统配置更改也可以实时在线进行并应用,从而可以适应工作负载条件变化或在线性能调优
GlusterFS是模块化堆栈式的架构设计,模块称为Translator。Translators是GlusterFS提供的一种强大文件系统功能扩展机制,这一设计思想借鉴于GNU/Hurd微内核操作系统。GlusterFS中所有的功能都通过Translator机制实现,借助这种良好定义的接口可以高效简便地扩展文件系统的功能。在Glusterfs中,每个translator都有自己的全局命名空间,并且使用自己的机制进行独立的维护和管理。
1、首先是在客户端, 用户通过glusterfs的挂载点来读写访问数据(对于用户来说, 集群系统的存在对用户是完全透明的,用户感觉不到是操作本地系统还是远端的集群系统)
2、用户的这个操作被递交给本地linux系统,系统内核通过VFS API收到请求并处理
3、VFS 将数据递交给FUSE 内核文件系统,(在启动 glusterfs 客户端以前, 需要向系统注册一个实际的文件系统FUSE,如上图所示,该文件系统与ext3在同一个层次上面, ext3 是对实际的磁盘进行处理),fuse 文件系统则是将数据通过/dev/fuse 这个设备文件递交给了glusterfs client端。所以, 我们可以将 fuse文件系统理解为一个代理
4、GlusterFS client 收到数据后,client根据配置文件的配置对数据进行处理
(在启动glusterfs client时需要指定这个文件。)
5、在glusterfs client的处理末端, 通过网络将数据递交给 Glusterfs Server,并且将数据写入到服务器所控制的存储设备上
6、这样, 整个数据流的处理就完成了
分布卷可以将某个文件随机的存储在卷内的一个brick内,通常用于扩展存储能力,不支持数据的冗余。除非底层的brick使用RAID等外部的冗余措施。
1)分布式卷特点
2)创建分布式卷
创建一个名为dis-volume的分布式卷,文件将根据HASH分布在server1:/dir1、server2:/dir2和server3:/dir3中
gluster volume create dis-volume server1:/dir1 server2:/dir2
1)条带卷特点
2)创建条带卷
创建了一个名为Stripe-volume的条带卷,文件将被分块轮询的存储在Server1:/dir1和Server2:/dir2两个Brick
gluster volume create stripe-volume stripe 2 transport tcp server1:/dir1 server2:/dir2
1)特点
2)创建复制卷
创建名为rep-volume的复制卷,文件将同时存储两个副本,分别在Server1:/dir1和Server2:/dir2两个Brick中
gluster volume create rep-volume replica 2 transport tcp server1:/dir1 server2:/dir2
兼顾分布式卷和条带卷的功能
主要用于大文件访问处理
至少需要 4 台服务器
创建分布式条带卷
创建了一个名为dis-stripe的分布式条带卷,配置分布式的条带卷时,卷中Brick所包含的存储服务器数必须是条带数的倍数(>=2倍)
gluster volume create rep-volume replica 2 transport tcp server1:/dir1 server2:/dir2
创建分布式复制卷
创建了一个名为dis-rep的分布式复制卷,配置分布式的复制卷时,卷中Brick所包含的存储服务器数必须是条带数的倍数(>=2倍)
gluster volume create rep-volume replica 2 transport tcp server1:/dir1 server2:/dir2
node01添加磁盘并格式化挂载(其余节点不在详述,与该节点配置方式相同)
[root@localhost ~]# fdisk -l #查看添加的硬盘,也可以用 ll /dev/ | grep sd 确认有几块硬盘的
#创建分区
[root@localhost ~]# fdisk /dev/sdb
n #创建分区
p #创建主分区
回车 #默认主分区1
回车 #默认块大小
回车 #默认主分区大小
w #保存分区信息
另外三块磁盘添加方式与sdb1配置相同
fdisk /dev/sdc
fdisk /dev/sdd
fdisk /dev/sde
#确认分区有无划分好
[root@localhost ~]# ll /dev/ | grep sd
brw-rw---- 1 root disk 8, 17 10月 17 18:47 sdb1
brw-rw---- 1 root disk 8, 33 10月 17 18:47 sdc1
brw-rw---- 1 root disk 8, 49 10月 17 18:48 sdd1
brw-rw---- 1 root disk 8, 65 10月 17 18:49 sde1
#格式化分区
[root@localhost ~]# mkfs -t ext4 /dev/sdb1
[root@localhost ~]# mkfs -t ext4 /dev/sdc1
[root@localhost ~]# mkfs -t ext4 /dev/sdd1
[root@localhost ~]# mkfs -t ext4 /dev/sde1
#创建挂载目录,添加挂载(node03、node04不需要创建及挂载/e6)
[root@localhost ~]# mkdir /b3 /c4 /d5 /e6
[root@localhost ~]# vim /etc/fstab
/dev/sdb1 /b3 ext4 defaults 0 0
/dev/sdc1 /c4 ext4 defaults 0 0
/dev/sdd1 /d5 ext4 defaults 0 0
/dev/sde1 /e6 ext4 defaults 0 0
#重启服务器或使用mount -a使挂载生效
[root@localhost ~]# init 6
#确认挂载的4块硬盘
[root@localhost ~]# df -Th
/dev/sdd1 ext4 4.8G 20M 4.6G 1% /d5
/dev/sdb1 ext4 2.9G 9.0M 2.8G 1% /b3
/dev/sdc1 ext4 3.9G 16M 3.7G 1% /c4
/dev/sde1 ext4 5.8G 24M 5.5G 1% /e6
[root@node1 ~]# systemctl stop firewalld.service #关闭防火墙
[root@node1 ~]# systemctl disable firewalld.service #取消开启自启
[root@node1 ~]# setenforce 0 #关闭核心防护
[root@node1 ~]# vim /etc/selinux/config
SELINUX=disabled #修改为disabled
[root@node1 ~]# vim /etc/hosts
192.168.11.25 node01
192.168.11.26 node02
192.168.11.27 node03
192.168.11.28 node04
将gfsrepo 软件上传到/opt目下 (rz)
#挂载光盘至本地
[root@node1 ~]# mount /dev/cdrom /mnt
#搭建yum仓库
[root@node1 opt]# cd /etc/yum.repos.d/
[root@node1 yum.repos.d]# mkdir bak
[root@node1 yum.repos.d]# mv C* bak
[root@node1 yum.repos.d]# vim local.repo #编辑本地yum.repo文件
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
enabled=1
[GLFS]
name=glfs
baseurl=file:///opt/gfsrepo
gpgcheck=0
enabled=1
[root@node1 yum.repos.d]# yum clean all #清除yum缓存
[root@node1 yum.repos.d]# yum makecache #创建缓存数据
#安装GLFS软件
[root@node1 yum.repos.d]# yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
#启动GLFS软件
[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 #查看状态
#node主机添加群集中其他node节点(在一个node节点操作即可)
[root@node1 yum.repos.d]# gluster peer probe node1
[root@node1 yum.repos.d]# gluster peer probe node2
[root@node1 yum.repos.d]# gluster peer probe node3
[root@node1 yum.repos.d]# gluster peer probe node4
peer probe: success.
[root@node1 yum.repos.d]# gluster peer status #查看集群
创建卷的具体规划:
卷名称 | 卷类型 | 空间大小/GB | Brick |
---|---|---|---|
dis-volume | 分布式卷 | 12 | node1(/e6)node2(/e6) |
stripe-volume | 条带卷 | 10 | node1(/d5)node2(/d5) |
rep-volume | 复制卷 | 5 | node3(/d5)node4(/d5) |
dis-stripe | 分布式条带卷 | 12 | node1(/b3)node2(/b3)node3(/b3)node4(/b3) |
dis-rep | 分布式复制卷 | 8 | node1(/c4)node2(/c4)node3(/c4)node4(/c4) |
因为已经做好了群集,所以以下创建卷的操作只在一个node节点上操作即可
① 创建分布式卷
[root@localhost ~]# gluster volume create dis-volume node1:/e6 node2:/e6 force
volume create: dis-volume: success: please start the volume to access data
[root@localhost ~]# gluster volume info dis-volume #查看创建分布式卷信息
[root@localhost ~]# gluster volume start dis-volume #启动新建分布式卷
volume start: dis-volume: success
② 创建条带卷
[root@localhost ~]# gluster volume create stripe-volume stripe 2 node1:/d5 node2:/d5 force
[root@localhost ~]# gluster volume info stripe-volume
[root@localhost ~]# gluster volume start stripe-volume
③ 创建复制卷
[root@localhost ~]# gluster volume create rep-volume replica 2 node3:/d5 node4:/d5 force
[root@localhost ~]# gluster volume info rep-volume
[root@localhost ~]# gluster volume start rep-volume
④ 创建分布式条带卷
[root@localhost ~]# gluster volume create dis-stripe stripe 2 node1:/b3 node2:/b3 node3:/b3 node4:/b3 force
[root@localhost ~]# gluster volume info dis-stripe
[root@localhost ~]# gluster volume start dis-stripe
⑤ 创建分布式复制卷
[root@localhost ~]# gluster volume create dis-rep replica 2 node1:/c4 node2:/c4 node3:/c4 node4:/c4 force
[root@localhost ~]# gluster volume info dis-rep
[root@localhost ~]# gluster volume start dis-rep
==将gfsrepo 软件上传到/opt目下 ==
配置yum源,与node节点方法相同,不在详述
#安装GLFS软件
[root@client yum.repos.d]# yum -y install glusterfs glusterfs-fuse
#创建挂载点目录
[root@client ~]# mkdir -p /text/{dis,stripe,rep,dis_and_stripe,dis_and_rep}
[root@client ~]# ls /text
dis dis_and_rep dis_and_stripe rep stripe
#本地域名解析文件(hosts文件)
[root@client ~]# vim /etc/hosts
192.168.11.11 node1
192.168.11.12 node2
192.168.11.13 node3
192.168.11.14 node4
#挂载Gluster文件系统(先临时挂载测试,注意挂载后的文件类型,然后再使用永久挂载)
[root@client ~]# mount -t glusterfs node1:dis-volume /text/dis
[root@client ~]# mount -t glusterfs node1:stripe-volume /text/stripe
[root@client ~]# mount -t glusterfs node1:rep-volume /text/rep
[root@client ~]# mount -t glusterfs node1:dis-stripe /text/dis_and_stripe
[root@client ~]# mount -t glusterfs node1:dis-rep /text/dis_and_rep
#永久挂载
[root@localhost ~]# vim /etc/fstab
node1:dis-volume /text/dis glusterfs defaults,_netdev 0 0
node1:stripe-volume /text/stripe glusterfs defaults,_netdev 0 0
node1:rep-volume /text/rep glusterfs defaults,_netdev 0 0
node1:dis-stripe /text/dis_and_stripe glusterfs defaults,_netdev 0 0
node1:dis-rep /text/dis_and_rep glusterfs defaults,_netdev 0 0
[root@client ~]# mount -a
#创建测试文件
[root@client ~]# dd if=/dev/zero of=/demo1.log bs=1M count=40
[root@client ~]# dd if=/dev/zero of=/demo2.log bs=1M count=40
[root@client ~]# dd if=/dev/zero of=/demo3.log bs=1M count=40
[root@client ~]# dd if=/dev/zero of=/demo4.log bs=1M count=40
[root@client ~]# dd if=/dev/zero of=/demo5.log bs=1M count=40
[root@client ~]# cd /
[root@client /]# ll #查看刚创建的测试文件
#将创建的文件拷贝至指定位置(各个GFS卷的挂载点)
[root@client /]# cp /demo* /text/dis
[root@client /]# cp /demo* /text/stripe/
[root@client /]# cp /demo* /text/rep/
[root@client /]# cp /demo* /text/dis_and_stripe/
[root@client /]# cp /demo* /text/dis_and_rep/
① 正常测试
#查看分布式卷分布
root@node1 yum.repos.d]# ll -h /e6 #node1查看e6文件夹(分布式文件存储位置)
-rw-r--r--. 2 root root 40M 5月 12 01:56 test1
-rw-r--r--. 2 root root 40M 5月 12 01:56 test2
-rw-r--r--. 2 root root 40M 5月 12 01:56 test4
-rw-r--r--. 2 root root 40M 5月 12 01:56 test5
[root@node2 yum.repos.d]# ll -h /e6 #node2
-rw-r--r--. 2 root root 40M 5月 12 01:56 test3
发现5个文件被分布式存储到了两个节点,且没有被切片,都是40M原本大小
#查看条带卷分布
[root@node1 yum.repos.d]# ll -h /d5
-rw-r--r--. 2 root root 20M 5月 12 01:56 test1
-rw-r--r--. 2 root root 20M 5月 12 01:56 test2
-rw-r--r--. 2 root root 20M 5月 12 01:56 test3
-rw-r--r--. 2 root root 20M 5月 12 01:56 test4
-rw-r--r--. 2 root root 20M 5月 12 01:56 test5
[root@node2 yum.repos.d]# ll -h /d5
-rw-r--r--. 2 root root 20M 5月 12 01:56 test1
-rw-r--r--. 2 root root 20M 5月 12 01:56 test2
-rw-r--r--. 2 root root 20M 5月 12 01:56 test3
-rw-r--r--. 2 root root 20M 5月 12 01:56 test4
-rw-r--r--. 2 root root 20M 5月 12 01:56 test5
发现数据已经被分片的分配node1和node2节点上
#查看复制卷分布
[root@node3 yum.repos.d]# ll -h /d5
-rw-r--r--. 2 root root 40M 5月 12 02:04 test1
-rw-r--r--. 2 root root 40M 5月 12 02:04 test2
-rw-r--r--. 2 root root 40M 5月 12 02:04 test3
-rw-r--r--. 2 root root 40M 5月 12 02:04 test4
-rw-r--r--. 2 root root 40M 5月 12 02:04 test5
[root@node4 yum.repos.d]# ll -h /d5
-rw-r--r--. 2 root root 40M 5月 12 02:04 test1
-rw-r--r--. 2 root root 40M 5月 12 02:04 test2
-rw-r--r--. 2 root root 40M 5月 12 02:04 test3
-rw-r--r--. 2 root root 40M 5月 12 02:04 test4
-rw-r--r--. 2 root root 40M 5月 12 02:04 test5
==数据没有被分片 有副本 有冗余 ==
#查看分布式条带卷
[root@node1 yum.repos.d]# ll -h /b3
-rw-r--r--. 2 root root 20M 5月 12 01:56 test1
-rw-r--r--. 2 root root 20M 5月 12 01:56 test2
-rw-r--r--. 2 root root 20M 5月 12 01:56 test4
-rw-r--r--. 2 root root 20M 5月 12 01:56 test5
[root@node2 yum.repos.d]# ll -h /b3
-rw-r--r--. 2 root root 20M 5月 12 01:56 test1
-rw-r--r--. 2 root root 20M 5月 12 01:56 test2
-rw-r--r--. 2 root root 20M 5月 12 01:56 test4
-rw-r--r--. 2 root root 20M 5月 12 01:56 test5
[root@node3 yum.repos.d]# ll -h /b3
-rw-r--r--. 2 root root 20M 5月 12 01:56 test3
[root@node4 yum.repos.d]# ll -h /b3
-rw-r--r--. 2 root root 20M 5月 12 01:56 test3
#查看分布式复制卷
[root@node1 yum.repos.d]# ll -h /c4
-rw-r--r--. 2 root root 40M 5月 12 01:56 test1
-rw-r--r--. 2 root root 40M 5月 12 01:56 test2
-rw-r--r--. 2 root root 40M 5月 12 01:56 test4
-rw-r--r--. 2 root root 40M 5月 12 01:56 test5
[root@node2 yum.repos.d]# ll -h /c4
-rw-r--r--. 2 root root 40M 5月 12 01:56 test1
-rw-r--r--. 2 root root 40M 5月 12 01:56 test2
-rw-r--r--. 2 root root 40M 5月 12 01:56 test4
-rw-r--r--. 2 root root 40M 5月 12 01:56 test5
[root@node3 yum.repos.d]# ll -h /c4
-rw-r--r--. 2 root root 40M 5月 12 01:56 test3
[root@node4 yum.repos.d]# ll -h /c4
-rw-r--r--. 2 root root 40M 5月 12 01:56 test3
② 破坏测试
关闭node2节点, 在客户端上查看文件是否正常
#查看分布式卷
发现5个文件被分布式存储到了两个节点,且没有被切片,都是40M原本大小
[root@client /]# cd /text/dis
[root@client dis]# ll
#查看条带卷
因为数据分片的,所以node2关机后,数据都消失了
[root@client dis]# cd /text/stripe/
[root@client stripe]# ll
总用量 0
#查看分布式条带卷
发现分布式的方式存储的demo5没有消失(存储在node3和node4上的)
[root@client stripe]# cd /text/dis_and_stripe/
[root@client dis_and_stripe]# ll -h
#查看分布式复制卷
[root@client dis_and_stripe]# cd /text/dis_and_rep/
[root@client dis_and_rep]# ll -h
将node4关机,查看效果
#查看分布式复制卷
[root@client dis_and_rep]# ll -h
#查看分布式条卷
发现在node4关机后,原本存在的demo5.log文件也消失了
[root@client dis_and_rep]# cd /text/dis_and_stripe/
[root@client dis_and_stripe]# ll
总用量 0
#复制卷
数据都在,没有消失
[root@client dis_and_stripe]# cd /text/rep/
[root@client rep]# ll -h
总结:上述实验测试,凡是带复制数据,相比而言,数据比较安全,具备冗余性,安全性高。
条带卷安全性较低
#查看GlusterFS卷
[root@node1 ~]# gluster volume list
#查看所有卷的信息
[root@node1 ~]# gluster volume info
#停止一个卷
[root@node1 ~]# gluster volume stop dis-stripe
#删除一个卷
[root@node1 ~]# gluster volume delete dis-stripe
#设置卷的访问控制
[root@node1 ~]# gluster volume set dis-rep auth.allow 192.168.32.* #设置192.168.30.0网段的所有IP地址 都能访问dis-rep卷(分布式复制卷)