一、GlusterFS概述
1.1 GlusterFS简介
- Glusterfs是一个开源的分布式文件系统,是Scale存储的核心,能够处理千数量级的客户端.在传统的解决 方案中Glusterfs能够灵活的结合物理的,虚拟的和云资源去体现高可用和企业级的性能存储.
- Glusterfs通过TCP/IP或InfiniBand RDMA网络链接将客户端的存储资块源聚集在一起,使用单一的全局命名空间来管理数据,磁盘和内存资源.
- Glusterfs基于堆叠的用户空间设计,可以为不同的工作负载提供高优的性能.
1.2 特点
扩展性和高性能
GlusterFS利用双重特性来提供几TB至数PB的高扩展存储解决方案。Scale-Out架构允许通过简单地增加资源来提高存储容量和性能,磁盘、计算和I/O资源都可以独立增加,支持10GbE和InfiniBand等高速网络互联。Gluster弹性哈希(Elastic Hash)解除了GlusterFS对元数据服务器的需求,消除了单点故障和性能瓶颈,真正实现了并行化数据访问。
高可用性
GlusterFS可以对文件进行自动复制,如镜像或多次复制,从而确保数据总是可以访问,甚至是在硬件故障的情况下也能正常访问。自我修复功能能够把数据恢复到正确的状态,而且修复是以增量的方式在后台执行,几乎不会产生性能负载。GlusterFS没有设计自己的私有数据文件格式,而是采用操作系统中主流标准的磁盘文件系统(如EXT3、ZFS)来存储文件,因此数据可以使用各种标准工具进行复制和访问。
全局统一命名空间
全局统一命名空间将磁盘和内存资源聚集成一个单一的虚拟存储池,对上层用户和应用屏蔽了底层的物理硬件。存储资源可以根据需要在虚拟存储池中进行弹性扩展,比如扩容或收缩。当存储虚拟机映像时,存储的虚拟映像文件没有数量限制,成千虚拟机均通过单一挂载点进行数据共享。虚拟机I/O可在命名空间内的所有服务器上自动进行负载均衡,消除了SAN环境中经常发生的访问热点和性能瓶颈问题。
弹性卷管理
数据储存在逻辑卷中,逻辑卷可以从虚拟化的物理存储池进行独立逻辑划分而得到。存储服务器可以在线进行增加和移除,不会导致应用中断。逻辑卷可以在所有配置服务器中增长和缩减,可以在不同服务器迁移进行容量均衡,或者增加和移除系统,这些操作都可在线进行。文件系统配置更改也可以实时在线进行并应用,从而可以适应工作负载条件变化或在线性能调优。
基于标准协议
Gluster存储服务支持NFS, CIFS, HTTP, FTP以及Gluster原生协议,完全与POSIX标准兼容。现有应用程序不需要作任何修改或使用专用API,就可以对Gluster中的数据进行访问。这在公有云环境中部署Gluster时非常有用,Gluster对云服务提供商专用API进行抽象,然后提供标准POSIX接口。
1.3 GlusterFS相关术语
-
Brick
GFS中的存储单元,通过是一个受信存储池中的服务器的一个导出目录。可以通过主机名和目录名来标识,如’SERVER:EXPORT’ -
Volume
一组bricks的逻辑集合(卷) -
FUST
Filesystem Userspace是一个可加载的内核模块,其支持非特权用户创建自己的文件系统而不需要修改内核代码。通过在用户空间运行文件系统的代码通过FUSE代码与内核进行桥接。 -
VFS
虚拟文件系统 -
Glusterd
Gluster management daemon,要在trusted storage pool中所有的服务器上运行。 -
Node
一个拥有若干brick的设备 -
Client
挂载了GFS卷的设备 -
RDMA
远程直接内存访问,支持不通过双方的OS进行直接内存访问。 -
RRDNS
round robin DNS是一种通过DNS轮转返回不同的设备以进行负载均衡的方法 -
Self-heal
用于后台运行检测复本卷中文件和目录的不一致性并解决这些不一致。 -
Split-brain
脑裂 -
Volfile
glusterfs进程的配置文件,通常位于/var/lib/glusterd/vols/volname
1.4 模块化堆栈式架构
- 模块化、堆栈式的架构
- 通过对模块的组合,实现复杂的功能
GlusterFS采用模块化、堆栈式的架构,可通过灵活的配置支持高度定制化的应用环境,比如大文件存储、海量小文件存储、云存储、多传输协议应用等。每个功能以模块形式实现,然后以积木方式进行简单的组合,即可实现复杂的功能。比如,Replicate模块可实现RAID1,Stripe模块可实现RAID0,通过两者的组合可实现RAID10和RAID01,同时获得高性能和高可靠性。如下图所示
二、GlusterFS工作原理
2.1 弹性hash算法
- 通过hash算法得到一个32位的整数
- 划分为N个连续的子空间,每个空间对应一个Brick
- 弹性hash算法的优点
保证数据平均分布在每一个Brick中
解决了对元数据服务器的依赖,进而解决了单点故障以及访问瓶颈
2.2 GlusterFS工作流程
- 客户端或应用程序通过GlusterFS的挂载点访问数据,对于用户来说,集群系统的存在对用户是完全透明的,用户感觉不到是操作本地系统还是远端的集群系统。
- 用户的这个操作被递交给 本地linux系统的VFS来处理。
- VFS将数据递交给FUSE内核文件系统, fuse文件系统则是将数据通过/dev/fuse设备文件递交给了GlusterFS client端,所以, 我们可以将 fuse文件系统理解为一个代理。
- GlusterFS client 收到数据后,client根据配置文件的配置对数据进行处理
- 通过网络将数据传递至远端的GlusterFS Server,并且将数据写入到服务器存储设备上
三、GlusterFS的卷类型
3.1 分布式卷
-
没有对文件进行分块处理
-
通过扩展文件属性保存hash值
-
支持的底层文件系统有ext4、zfs、xfs等
-
特点
文件分布在不同的服务器,不具备冗余性
可以灵活的扩展卷的大小
单点故障会造成数据丢失
依赖底层的数据保护 -
创建分布式卷
创建一个名为dis-vol的分布式卷,文件将根据hash分布在node1:/data/sdb node2:/data/sdb中gluster volume create dis-vol node1:/data/sdb node2:/data/sdb force
3.2 条带卷
-
根据偏移量将文件分成N块(N个条带节点),轮询的存储在每个Brick Server节点
-
存储大文件时,性能尤为突出
-
不具备冗余性,类似Raid0
-
特点
数据被分割成更小块分布到块服务器中的不同条带区
分布减少了负载且更小的文件加速了存取的速度
没有数据冗余 -
创建条带卷
创建了一个名为stripe-vol的条带卷,文件将被分块轮询的存储在node1:/data/sdc node2:/data/sdc中gluster volume create stripe-vol stripe 2 transport tcp node1:/data/sdc node2:/data/sdc (transport不指明时默认是RDMA)
3.3 复制卷
-
同一个文件保存一份或多份副本
-
因为要保存副本,所以磁盘利用率较低
-
若多个节点上的存储空间不一致,将按照木桶效应取最低节点的容量作为该卷的总容量
-
特点
卷中所有的服务器均保存一个完整的副本
卷的副本数量可由客户创建的时候决定
至少有两个块服务器或更多服务器
具备冗余性 -
创建复制卷
创建名为rep-vol的复制卷,文件将同时存储两个副本,分别在node3:/data/sdb node4:/data/sdb两个Brick中gluster volume create rep-vol replica 2 node3:/data/sdb node4:/data/sdb force
3.4 分布式条带卷
-
兼顾分布式卷和条带卷的功能
-
主要用于大文件访问处理
-
最少需要4台服务器
-
创建分布式条带卷
创建了名为dis-stripe的分布式条带卷,配置分布式的条带卷时,卷中Brick所包含的存储服务器数必须是条带数的倍数(>=2倍)gluster volume create dis-stripe stripe 2 node1:/data/sdd node2:/data/sdd node3:/data/sdd node4:/data/sdd force
3.5 分布式复制卷
-
兼顾分布式卷和复制卷的功能
-
用于需要冗余的情况
-
创建分布式复制卷
创建名为dis-rep的分布式条带卷,配置分布式复制卷时,卷中Brick所包含的存储服务器数必须是条带数的倍数(>=2倍)gluster volume create dis-rep replica 2 node1:/data/sde node2:/data/sde node3:/data/sde node4:/data/sde force
四、部署GlusterFS卷
4.1 实验环境
主机名 | IP |
---|---|
node1 | 192.168.10.11 |
node2 | 192.168.10.12 |
node3 | 192.168.10.13 |
node4 | 192.168.10.14 |
4.2 实验过程
-
glusterfs软件的安装
首先需要提前准备好gfs的安装包,里面包括各种rpm包文件
然后将文件夹导入客户机中形成目录,对应目录我们去设置yum安装的repo本地源。vi /etc/yum.repo.d/gfs.repo [glfs] name=glfs baseurl=file:///root/gfsrepo # 对应文件所在的位置 gpgcheck=0 enable=1 yum clean all yum makecache yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma systemctl start glusterd.service systemctl enable glusterd.service systemctl status glusterd.service
-
时间同步
ntpdate ntp1.aliyun.com crontab -e */30 * * * * /usr/sbin/ntpdate ntp1.aliyun.com crontab -l
-
构建存储池(任意选取一个节点)
gluster peer probe node2 gluster peer probe node3 gluster peer probe node4 gluster peer status # 查看状态(任意一台都可以)
-
创建卷
格式化并挂载使用fdisk -l mkfs.ext4 /dev/sdb mkfs.ext4 /dev/sdc mkfs.ext4 /dev/sdd mkfs.ext4 /dev/sde mkdir {/b1,/c1,/d1,/e1} mount /dev/sdb /b1 mount /dev/sdc /c1 mount /dev/sdd /d1 mount /dev/sde /e1
查看挂载状态
df -Th
4.3 不同类型的卷的建立
4.3.1 分布式卷
[root@server1 ~]# gluster volume create dis-vol node1:/b1 node2:/b1 force # 创建卷
volume create: dis-vol: success: please start the volume to access data
[root@server1 ~]# gluster volume info dis-vol # 查看卷的信息
Volume Name: dis-vol
Type: Distribute
Volume ID: a5b68dc2-992c-4b61-b481-396c7f4173c9
Status: Created
Snapshot Count: 0
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: node1:/b1
Brick2: node2:/b1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
[root@server1 ~]# gluster volume start dis-vol # 开启卷
volume start: dis-vol: success
[root@server1 ~]# gluster volume status dis-vol
Status of volume: dis-vol
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick node1:/b1 49152 0 Y 11517
Brick node2:/b1 49152 0 Y 11619
Task Status of Volume dis-vol
------------------------------------------------------------------------------
There are no active volume tasks
其中显示online为Y即为在线表示分布式卷建立并开启成功。
4.3.2 条带卷
[root@server1 ~]# gluster volume create stripe-vol stripe 2 node1:/c1 node2:/c2 force # 创建条带卷
volume create: stripe-vol: success: please start the volume to access data
[root@server1 ~]# gluster volume info stripe-vol # 查看条带卷信息
Volume Name: stripe-vol
Type: Stripe
Volume ID: 04b86e2c-947f-41cf-ab60-831a433eb1b5
Status: Created
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: node1:/c1
Brick2: node2:/c2
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
[root@server1 ~]# gluster volume start stripe-vol # 启动条带卷
volume start: stripe-vol: success
[root@server1 ~]# gluster volume status stripe-vol # 查看条带卷状态
4.3.3 复制卷
[root@server1 ~]# gluster volume create rep-vol replica 2 node3:/b1 node4:/b1 force
[root@server1 ~]# gluster volume info rep-vol
[root@server1 ~]# gluster volume start rep-vol
volume start: rep-vol: success
[root@server1 ~]# gluster volume status rep-vol
Status of volume: rep-vol
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick node3:/b1 49152 0 Y 12545
Brick node4:/b1 49152 0 Y 12623
Self-heal Daemon on localhost N/A N/A Y 12525
Self-heal Daemon on node4 N/A N/A Y 12643
Self-heal Daemon on node3 N/A N/A Y 12565
Self-heal Daemon on node2 N/A N/A Y 12608
Task Status of Volume rep-vol
------------------------------------------------------------------------------
There are no active volume tasks
4.3.4 分布式条带卷
[root@server1 ~]# gluster volume create dis-stripe stripe 2 node1:/d1 node2:/d1 node3:/d1 node4:/d1 force
volume create: dis-stripe: success: please start the volume to access data
[root@server1 ~]# gluster volume info dis-stripe
Volume Name: dis-stripe
Type: Distributed-Stripe
Volume ID: 3c17897c-e749-4cdd-990f-801fe5e6b59f
Status: Created
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: node1:/d1
Brick2: node2:/d1
Brick3: node3:/d1
Brick4: node4:/d1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
[root@server1 ~]# gluster volume start dis-stripe
volume start: dis-stripe: success
[root@server1 ~]# gluster volume status dis-stripe
Status of volume: dis-stripe
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick node1:/d1 49154 0 Y 12595
Brick node2:/d1 49154 0 Y 12659
Brick node3:/d1 49153 0 Y 12608
Brick node4:/d1 49153 0 Y 12693
Task Status of Volume dis-stripe
------------------------------------------------------------------------------
There are no active volume tasks
4.3.5 分布式复制卷
[root@server1 ~]# gluster volume create dis-repl replica 2 node1:/e1 node2:/e1 node3:/e1 node4:/e1 force
volume create: dis-repl: success: please start the volume to access data
[root@server1 ~]# gluster volume info dis-repl
Volume Name: dis-repl
Type: Distributed-Replicate
Volume ID: c0d1b3e6-0d89-4d3b-9b45-8e2a78764427
Status: Created
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: node1:/e1
Brick2: node2:/e1
Brick3: node3:/e1
Brick4: node4:/e1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
[root@server1 ~]# gluster volume start dis-repl
gluster volume start dis-repl
[root@server1 ~]# gluster volume status dis-repl
Status of volume: dis-repl
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick node1:/e1 49155 0 Y 12674
Brick node2:/e1 49155 0 Y 12726
Brick node3:/e1 49154 0 Y 12676
Brick node4:/e1 49154 0 Y 12754
Self-heal Daemon on localhost N/A N/A Y 12694
Self-heal Daemon on node3 N/A N/A Y 12696
Self-heal Daemon on node4 N/A N/A Y 12774
Self-heal Daemon on node2 N/A N/A Y 12746
Task Status of Volume dis-repl
------------------------------------------------------------------------------
There are no active volume tasks
4.4 创建并挂载卷
[root@server1 ~]# gluster volume list
dis-repl
dis-stripe
dis-vol
rep-vol
stripe-vol
[root@client ~]# mkdir /dis-repl
[root@client ~]# mkdir /dis-stripe
[root@client ~]# mkdir /dis-vol
[root@client ~]# mkdir /rep-vol
[root@client ~]# mkdir /stripe-vol
[root@client ~]# mount.glusterfs node1:dis-repl /dis-repl
[root@client ~]# mount.glusterfs node1:dis-stripe /dis-stripe
[root@client ~]# mount.glusterfs node1:dis-vol /dis-vol
[root@client ~]# mount.glusterfs node1:rep-vol /rep-vol
[root@client ~]# mount.glusterfs node1:stripe-vol /stripe-vol
[root@client ~]# df -Th
[root@client ~]# dd if=/dev/zero of=/demo1.log bs=40M count=1
[root@client ~]# dd if=/dev/zero of=/demo2.log bs=40M count=1
[root@client ~]# dd if=/dev/zero of=/demo3.log bs=40M count=1
[root@client ~]# dd if=/dev/zero of=/demo4.log bs=40M count=1
[root@client ~]# dd if=/dev/zero of=/demo5.log bs=40M count=1
[root@client /]# cp demo* /dis-repl
[root@client /]# cp demo* /dis-stripe
[root@client /]# cp demo* /dis-vol
[root@client /]# cp demo* /rep-vol
[root@client /]# cp demo* /stripe-vol
4.5 检查并测试
以分布式复制卷为例:
我们查看客户机上面的dis-repl目录,发现
4.6 破坏实验
总结:复制卷、分布式复制卷的数据完整,条带卷数据全部丢失,分布式卷丢失一部分
4.7 Glusterfs访问控制
删除某个卷:
[root@server1 e1]# gluster volume stop dis-vol
Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y
volume stop: dis-vol: success
[root@server1 e1]# gluster volume delete dis-vol
Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y
volume delete: dis-vol: success
在客户端使用df -Th查看挂载的时候发现该卷不见了。
#仅拒绝某个用户,查看该客户的挂载发现丢失
[root@server1 e1]# gluster volume set rep-vol auth.reject 192.168.10.15
volume set: success
# 仅允许某个用户
[root@server1 e1]# gluster volume set dis-repl auth.allow 192.168.10.15
volume set: success