目录
背景
伴随着谷歌、亚马逊和阿里等互联网公司云计算和大数据应用的兴起,它才大规模应用到工程实践中。如谷歌的分布式文件系统GFS、分布式表格系统google Bigtable,亚马逊的对象存储AWS,阿里的TFS等都是很好的代表,同时也催生了一大批优秀的开源分布式存储系统,包括ceph、swift、Lustre和glusterfs等
ClusterFS(GFS)主要由 Z RESEARCH公司负责开发
分布式存储系统
GlusterFS概述
GlusterFS 是一个开源的分布式文件系统。 GlusterFS 主要由存储服务器(Brick Server)、客户端及 NFS/Samba 存储网关(可选, 根据需要选择使用)组成。GlusterFS 架构中最大的设计特点是没有元数据服务器组件,这有助于提升整个系统的 性能、可靠性和稳定性。
数据分为元数据和数据:
-
数据:实际数据
-
元数据 :元数据即是文件的属性信息(文件名、权限(属主、属组)、大小、更新时间等)
传统的分布式文件系统大多通过元服务器来存储元数据,元数据包含存储节点上的目录信息、目录结构等。这样的设计在浏览目录时效率非常高,但是也存在 一些缺陷,例如单点故障。一旦元数据服务器出现故障,即使节点具备再高的冗余性,整个 存储系统也将崩溃。而 GlusterFS 分布式文件系统是基于无元服务器的设计,数据横向扩展 能力强,具备较高的可靠性及存储效率
GlusterFS同时也是Scale-out(横向扩展)存储解决方案Gluster的核心,在存储数据方面具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。
GlusterFS支持借助TCP/IP或InfiniBandRDNA网络(一种支持多并发链接的技术,具有高带宽、低时廷、高扩展性的特点)将物理分散分布的存储资源汇聚在一起,统一提供存储服务,并使用统一全局命名空间来管理数据。
分布式存储按其存储接口分为三种:文件存储、块存储和对象存储。
GlusterFS特点
1、扩展性和高性能 GlusterFS 利用双重特性来提供高容量存储解决方案 Scale-Out (横向扩展)架构通过增加存储节点的方式来提高存储容量和性能(磁盘、计算和 I/O 资源都可以独立增加),支持 10GbE 和 InfiniBand 等高速网络互联。
Gluster 弹性哈希(Elastic Hash)解决了 GlusterFS 对元数据服务器的依赖, GlusterFS 采用弹性哈希算法在存储池中定位数据,放弃了传统的通过元数据服 务器定位数据。GlusterFS 中可以智能地定位任意数据分片(将数据分片存储在 不同节点上),不需要查看索引或者向元数据服务器查询。这种设计机制实现了 存储的横向扩展, 改善了单点故障及性能瓶颈,真正实现了并行化数据访问。
2、高可用性 GlusterFS 通过配置某些类型的存储卷,可以对文件进行自动复制(类似 于 RAID1),即使某个节点出现故障,也不影响数据的访问。当数据出现不一致时, 自动修复功能能够把数据恢复到正确的状态,数据的修复是以增量的方式在后台执行, 不会占用太多系统资源。GlusterFS 可以支持所有的存储,因为它没有设计自己的私有数据文件格式,而是采用操作系统中标准的磁盘文件系统(如 EXT3、XFS 等)来 存储文件,数据可以使用传统访问磁盘的方式被访问。
3、全局统一命名空间 全局统一命名空间将所有的存储资源聚集成一个单一的虚拟存储 池,对用户和应用屏蔽了物理存储信息。存储资源(类似于 LVM)可以根据生产环 境中的需要进行弹性扩展或收缩。在多节点场景中,全局统一命名空间还可以基于不 同节点做负载均衡,大大提高了存取效率。
4、弹性卷管理。 GlusterFS 通过将数据储存在逻辑卷中,逻辑卷从逻辑存储池进行独立 逻辑划分。逻辑存储池可以在线进行增加和移除,不会导致业务中断。逻辑卷可以根 据需求在线增长和缩减,并可以在多个节点中实现负载均衡。文件系统配置也可以实时在线进行更改并应用,从而可以适应工作负载条件变化或在线性能调优
5、基于标准协议 Gluster 存储服务支持 NFS、CIFS、HTTP、FTP、SMB 及 Gluster 原生协议,完全与 POSIX 标准兼容。现有应用程序不需要做任何修改就可以对 Gluster 中的数据进行访问,也可以使用专用 API 进行访问(效率更高),这在公有 云环境中部署 Gluster 时非常有用,Gluster 对云服务提供商专用 API 进行抽象,然 后提供标准 POSIX 接口
GlusterFS 术语
Brick(存储块): 主机池中由主机提供的用于物理存储的专用分区,是 GlusterFS 中的基本存储单元,同时也是用存储池中服务器上对外提供的存储目录。 存储目录的格式由服务器和目录的绝对路径构成,表示方法为 SERVER:EXPORT, 如 192.168.1.4:/ data/mydir/。
Volume(逻辑卷): 一个逻辑卷是一组 Brick 的集合。卷是数据存储的逻辑设备,类似于 LVM 中的逻辑卷。大部分 Gluster 管理操作是在卷上进行的。
FUSE(Filesystem inUserspace): 是一个内核模块,允许用户创建自己的文件系统, 无须修改内核代码。
VFS: 内核空间对用户空间提供的访问磁盘的接口。
Glusterd(后台管理进程): 在存储群集中的每个节点上都要运行。
模块化堆栈式架构
GlusterFS 采用模块化、堆栈式的架构,可以根据需 求配置定制化的应用环境,如大文件存储、海量小文件存储、云存储、多传输协议应用等。 通过对模块进行各种组合,即可实现复杂的功能。例如 Replicate 模块可实现 RAID1,Stripe 模块可实现 RAID0,通过两者的组合可实现 RAID10 和 RAID01,同时获得更高的性能及可靠性。
GlusterFS 工作流程
1) 客户端或应用程序通过 GlusterFS 的挂载点访问数据。
2) Linux 系统内核通过 VFS API 收到请求并处理。
3) VFS 将数据递交给 FUSE 内核文件系统,并向系统注册一个实际的文件系统 FUSE, 而 FUSE 文件系统则是将数据通过/dev/fuse 设备文件递交给了 GlusterFS client 端。可以 将 FUSE 文件系统理解为一个代理。
4) GlusterFS client 收到数据后,client 根据配置文件对数据进行处理。
5) 经过 GlusterFS client 处理后,通过网络将数据传递至远端的 GlusterFS Server, 并且将数据写入服务器存储设备。
弹性HASH算法
-
保证数据平均分布在每个 Brick 中
-
解决了对元数据服务器的依赖,进而解决了单点故障及访问瓶颈。
GlusterFS 支持卷类型
GlusterFS 支持七种卷,即分布式卷、条带卷、复制卷、分布式条带卷、分布式复制卷、 条带复制卷和分布式条带复制卷,这七种卷可以满足不同应用对高性能、高可用的需求。
分布式卷(Distribute volume):
文件通过 HASH 算法分布到所有 Brick Server 上, 这种卷是 Glusterf 的基础;以文件为单位根据 HASH 算法散列到不同的 Brick,其实 只是扩大了磁盘空间,如果有一块磁盘损坏,数据也将丢失,属于文件级的 RAID 0, 不具有容错能力。
条带卷(Stripe volume):
类似 RAID0,文件被分成数据块并以轮询的方式分布到多 个 Brick Server 上,文件存储以数据块为单位,支持大文件存储,文件越大,读取效 率越高
复制卷(Replica volume):
将文件同步到多个 Brick 上,使其具备多个文件副本, 属于文件级 RAID 1,具有容错能力。因为数据分散在多个 Brick 中,所以读性能得 到很大提升,但写性能下降。
分布式条带卷(Distribute Stripe volume)
Brick Server 数量是条带数(数据块分布 的 Brick 数量)的倍数,兼具分布式卷和条带卷的特点
分布式复制卷(Distribute Replica volume):
Brick Server 数量是镜像数(数据副本 数量)的倍数,兼具分布式卷和复制卷的特点。
分布式卷
分布式卷是 GlusterFS 的默认卷,在创建卷时,默认选项是创建分布式卷。在该模式下, 并没有对文件进行分块处理,文件直接存储在某个 Server 节点上。直接使用本地文件系统 进行文件存储,大部分 Linux 命令和工具可以继续正常使用。需要通过扩展文件属性保存 HASH 值,目前支持的底层文件系统有 EXT3、EXT4、ZFS、XFS 等。 由于使用的是本地文件系统,所以存取效率并没有提高,反而会因为网络通信的原因而 有所降低;另外支持超大型文件也会有一定的难度,因为分布式卷不会对文件进行分块处理。 虽然 EXT4 已经可以支持最大 16TB 的单个文件,但是本地存储设备的容量实在有限。File1 和 File2 存放在 Server1,而 File3 存放在 Server2,文件都是随机存储,一 个文件(如 File1)要么在 Server1 上,要么在 Server2 上,不能分块同时存放在 Server1 和 Server2 上。
分布式卷具有如下特点:
1、文件分布在不同的服务器,不具备冗余性。
2、更容易且廉价地扩展卷的大小。
3、存在单点故障会造成数据丢失。
4、依赖底层的数据保护。
条带卷
Stripe 模式相当于 RAID 0,在该模式下,根据偏移量将文件分成N块(N个条带节点), 轮询地存储在每个 Brick Server 节点。节点把每个数据块都作为普通文件存入本地文件系统 中,通过扩展属性记录总块数(Stripe-count)和每块的序号(Stripe-index)。在配置时指 定的条带数必须等于卷中 Brick 所包含的存储服务器数,在存储大文件时,性能尤为突出, 但是不具备冗余性。
条带卷具有如下特点。
1、数据被分割成更小块分布到块服务器群中的不同条带区。
2、分布减少了负载且更小的文件加速了存取的速度。
3、没有数据冗余性
复制卷
复制模式,也称为 AFR(AutoFile Replication),相当于 RAID1,即同一文件保存一份 或多份副本,每个节点上保存相同的内容和目录结构。复制模式因为要保存副本,所以磁盘利用率较低。如果多个节点上的存储空间不一致,那么将按照木桶效应取最低节点的容量作,为该卷的总容量。在配置复制卷时,复制数必须等于卷中 Brick 所包含的存储服务器数,复制卷具备冗余性,即使一个节点损坏,也不影响数据的正常使用。
复制卷具有如下特点。
1、卷中所有的服务器均保存一个完整的副本。
2、卷的副本数量可由客户创建的时候决定。
3、至少有两个块服务器或更多服务器。
4、具备冗余性
分布式条带卷
分布式条带卷兼顾分布式卷和条带卷的功能,主要用于大文件访问处理,创建一个分布式条带卷最少需要 4 台服务器
分布式复制卷
分布式复制卷兼顾分布式卷和复制卷的功能,主要用于需要冗余的情况下
部署GlusterFS
环境:四台服务器,16块硬盘,一台客户机
服务器1:192.168.37.100
服务器2:192.168.37.101
服务器3:192.168.37.102
服务器4:192.168.37.105
客户机:192.168.37.106
在四台服务器上分别添加4块硬盘,并刷新
[root@localhost /sys/class/scsi_host]# echo "- - -" > /sys/class/scsi_host/host0/scan
[root@localhost /sys/class/scsi_host]# echo "- - -" > /sys/class/scsi_host/host1/scan
[root@localhost /sys/class/scsi_host]# echo "- - -" > /sys/class/scsi_host/host2/scan
挂载
[root@localhost /data]# vim mount.sh
#!/bin/bash
dev=`ls /dev/sd* |grep -o 'sd[b-z]'| uniq`
for i in $dev
do
echo -e "n\np\n\n\n\nw\n" | fdisk /dev/$i &> /dev/null
mkfs.xfs /dev/${i}"1" &> /dev/null
mkdir -p /data/${i}"1" &> /dev/null
echo "/dev/${i}"1" /data/${i}"1" xfs defaults 0 0 " >> /etc/fstab
done
mount -a &> /dev/null
[root@localhost /data]# bash mount.sh
查看
四台服务器上都要做挂载,可以用scp 将脚本传到另外几台服务器上
为了好区分,可以在每台服务器上修改一个名字
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3
hostnamectl set-hostname node4
hostnamectl set-hostname node5
修改hosts文件(服务器、客户机)
[root@node5 ~]# vim /etc/hosts
192.168.37.100 node1
192.168.37.101 node2
192.168.37.102 node3
192.168.37.105 node4
192.168.37.106 node5
-------------------- 本地源安装,如果使用网络源,因为版本较新取消了一些功能-----------------------
解压gfs包
[root@node1 /opt]# tar xf gfsrepo.tar.gz
[root@node1 /opt]# ls
gfsrepo gfsrepo.tar.gz
所有机器上搭建本地源yum仓库
[root@node1 /etc/yum.repos.d]# mkdir bak
[root@node1 /etc/yum.repos.d]# mv *.repo bak/
[root@node1 /etc/yum.repos.d]# ls
bak
[root@node1 /etc/yum.repos.d]# vim xb.repo
[xb]
name=xb
baseurl=file:///opt/gfsrepo
gpgcheck=0
安装gfs的一些内核模块 (所有)
[root@node5 /etc/yum.repos.d]# yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
开启glusterd(所有)
添加节点到存储信任池中(服务器上)
卷的一些信息及名称
卷名称 卷类型 Brick
dis-volume 分布式卷 node1(/data/sdb1) node2(/data/sdb1)
stripe-volume 条带卷 node1(/data/sdc1) node2(/data/sdc1)
rep-volume 复制卷 node3(/data/sdb1) node4(/data/sdb1)
dis-stripe 分布式条带卷 node1(/data/sdd1) node2(/data/sdd1)node3(/data/sdd1)node4(/data/sdd1)
dis-rep 分布式复制卷 node1(/data/sde1) node2(/data/sde1)node3(/data/sde1)node4(/data/sde1)
创建分布式卷
[root@node1 ~]# gluster volume create dis-voluem node1:/data/sdb1 node2:/data/sdb1 force
创建条带卷
[root@node1 ~]# gluster volume create stripe-volume stripe 2 node1:/data/sdc1 node2:/data/sdc1 force
volume create: stripe-volume: success: please start the volume to access data
[root@node1 ~]# gluster volume start stripe-volume
volume start: stripe-volume: success
指定的类型是stripe 数值为2 且后面跟了两个 brick server ,所以创建的是条带卷
创建复制卷
[root@node1 ~]# gluster volume create replica-volume replica 2 node3:/data/sdb1 node4:/data/sdb1 force
volume create: replica-volume: success: please start the volume to access data
[root@node1 ~]# gluster volume start replica-volume
volume start: replica-volume: success
指定类型为replica 数值为2 且后面跟了两个 brick server ,所以创建的是复制卷
创建分布式条带卷
[root@node1 ~]# gluster volume create dis-stripe stripe 2 node1:/data/sdd1 node2:/data/sdd1 node3:/data/sdd1 node4:/data/sdd1 force
volume create: dis-stripe: success: please start the volume to access data
[root@node1 ~]# gluster volume start dis-stripe
volume start: dis-stripe: success
指定的类型是stripe 数值为2 且后面跟了4个 brick server ,所以创建的是分布式条带卷
创建分布式复制卷
[root@node1 ~]# 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@node1 ~]# gluster volume start dis-rep
volume start: dis-rep: success
指定类型为replica 数值为2 且后面跟了4个 brick server 所以创建的分布式复制卷
查看卷的基本信息
[root@node1 ~]# gluster volume info
Volume Name: dis-rep
Type: Distributed-Replicate
Volume ID: ab77a409-b1ea-4057-ae05-f169bb2b05d0
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: offVolume Name: dis-stripe
Type: Distributed-Stripe
Volume ID: 1280d677-7736-476d-b5b0-317230de2c27
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: onVolume Name: dis-voluem
Type: Distribute
Volume ID: 52506ebe-83a0-4222-9ae5-8bed4d200601
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: onVolume Name: replica-volume
Type: Replicate
Volume ID: 1dd327c6-312c-49e5-9855-b621cfe6fef0
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: node3:/data/sdb1
Brick2: node4:/data/sdb1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: offVolume Name: stripe-volume
Type: Stripe
Volume ID: f69f9668-713f-40f2-a57e-6869106a2b9b
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
客户机操作
创建挂载目录
[root@node5 ~]# mkdir -p /data/{dis,stripe,rep,dis_stripe,dis_rep}
[root@node5 ~]# cd /data/
[root@node5 /data]# ls
dis dis_rep dis_stripe rep stripe
永久挂载
[root@node5 /data]# vim /etc/fstab
测试
[root@node5 /opt]# dd if=/dev/zero of=/demo2.log bs=1M count=40
40+0 records in
40+0 records out
41943040 bytes (42 MB) copied, 0.113351 s, 370 MB/s
[root@node5 /opt]# dd if=/dev/zero of=/demo3.log bs=1M count=40
40+0 records in
40+0 records out
41943040 bytes (42 MB) copied, 0.134883 s, 311 MB/s
[root@node5 /opt]# dd if=/dev/zero of=/demo4.log bs=1M count=40
40+0 records in
40+0 records out
41943040 bytes (42 MB) copied, 0.162297 s, 258 MB/s
[root@node5 /opt]# dd if=/dev/zero of=/demo5.log bs=1M count=40
40+0 records in
40+0 records out
41943040 bytes (42 MB) copied, 0.166078 s, 253 MB/s
复制
[root@node5 /opt]# cp /demo* /data/dis
[root@node5 /opt]# cp /demo* /data/stripe/
[root@node5 /opt]# cp /demo* /data/rep/
[root@node5 /opt]# cp /demo* /data/dis_stripe/
[root@node5 /opt]# cp /demo* /data/dis_rep/
查看条带卷
查看分布式复制卷(相对于一个互为备份,node1、2和node3、4)
[root@node1 ~]# ll -h /data/sde1/
总用量 120M
-rw-r--r--. 2 root root 40M 12月 15 17:02 demo2.log
-rw-r--r--. 2 root root 40M 12月 15 17:02 demo3.log
-rw-r--r--. 2 root root 40M 12月 15 17:02 demo4.log
[root@node2 yum.repos.d]#ll -h /data/sde1/
总用量 120M
-rw-r--r--. 2 root root 40M 12月 15 17:02 demo2.log
-rw-r--r--. 2 root root 40M 12月 15 17:02 demo3.log
-rw-r--r--. 2 root root 40M 12月 15 17:02 demo4.log
[root@node3 /etc/yum.repos.d]# ll -h /data/sde1/
total 40M
-rw-r--r--. 2 root root 40M Dec 15 04:02 demo5.log
[root@node4 /etc/yum.repos.d]# ll -h /data/sde1/
total 40M
-rw-r--r--. 2 root root 40M Dec 15 04:02 demo5.log
以上测试结果均没问题,就不一一测试了。
总结
Gluster由存储服务器、客户端以及NFS/Samba 存储网关(可选,根据需要选择使用)组成。没有元数据服务器组件,这有助于提升整个系统的性能、可靠性和稳定性。
GlusterFS同时也是Scale-Out(横向扩展)存储解决方案Gluster的核心,在存储数据方面具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。
GlusterFS支持借助TCP/IP或InfiniBandRDMA网络(一种支持多并发链接的技术,具有高带宽、低时延、高扩展性的特点)将物理分散分布的存储资源汇聚在一起,统一提供存储服务,并使用统一全局命名空间来管理数据。