[TOC]
什么是 GlusterFS
GlusterFS 概述
GlusterFS (Gluster File System) 是一个开源的分布式文件系统,主要由 Z RESEARCH 公司负责开发。GlusterFS 是 Scale-Out 存储解决方案 Gluster 的核心,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。GlusterFS 借助 TCP/IP 或 InfiniBand RDMA 网络将物理分布的存储资源聚集在一起,使用单一全局命名空间来管理数据。GlusterFS 基于可堆叠的用户空间设计,可为各种不同的数据负载提供优异的性能。
GlusterFS 特性
-
扩展性与高性能
Scale-Out架构允许通过简单地增加资源来提高存储容量和性能,磁盘、计算和I/O资源都可以独立增加,支持10GbE和InfiniBand等高速网络互联。Gluster弹性哈希(Elastic Hash)解除了GlusterFS对元数据服务器的需求,消除了单点故障和性能瓶颈,真正实现了并行化数据访问。
-
高可用性
GlusterFS可以对文件进行自动复制,如镜像或多次复制,从而确保数据总是可以访问,甚至是在硬件故障的情况下也能正常访问。自我修复功能能够把数据恢复到正确的状态,而且修复是以增量的方式在后台执行,几乎不会产生性能负载。GlusterFS没有设计自己的私有数据文件格式,而是采用操作系统中主流标准的磁盘文件系统(如EXT3、ZFS)来存储文件,因此数据可以使用各种标准工具进行复制和访问。
-
全局统一命名空间
全局统一命名空间将磁盘和内存资源聚集成一个单一的虚拟存储池,对上层用户和应用屏蔽了底层的物理硬件。存储资源可以根据需要在虚拟存储池中进行弹性扩展, 比如扩容或收缩。当存储虚拟机映像时,存储的虚拟映像文件没有数量限制,成千虚拟机均通过单一挂载点进行数据共享。虚拟机I/O可在命名空间内的所有服务器上自动进行负载均衡,消除了SAN环境中经常发生的访问热点和性能瓶颈问题。
-
弹性哈希算法
GlusterFS采用弹性哈希算法在存储池中定位数据,而不是采用集中式或分布式元数据服务器索引。在其他的Scale-Out存储系统中,元数据服务器通常会导致I/O性能瓶颈和单点故障问题。GlusterFS中,所有在Scale-Out存储配置中的存储系统都可以智能地定位任意数据分片,不需要查看索引或者向其他服务器查询。这种设计机制完全并行化了数据访问,实现了真正的线性性能扩展。
-
弹性卷管理
数 据储存在逻辑卷中,逻辑卷可以从虚拟化的物理存储池进行独立逻辑划分而得到。存储服务器可以在线进行增加和移除,不会导致应用中断。逻辑卷可以在所有配置 服务器中增长和缩减,可以在不同服务器迁移进行容量均衡,或者增加和移除系统,这些操作都可在线进行。文件系统配置更改也可以实时在线进行并应用,从而可 以适应工作负载条件变化或在线性能调优。
-
基于标准协议
Gluster存储服务支持NFS, CIFS, HTTP, FTP以及Gluster原生协议,完全与POSIX标准兼容。现有应用程序不需要作任何修改或使用专用API,就可以对Gluster中的数据进行访问。这在公有云环境中部署Gluster时非常有用,Gluster对云服务提供商专用API进行抽象,然后提供标准POSIX接口。
GlusterFS 架构介绍
它主要由存储服务器(BrickServer)、客户端以及NFS/Samba 存储网关组成。不难发现,GlusterFS 架构中没有元数据服务器组件,这是其最大的设计这点,对于提升整个系统的性能、可靠性和稳定性都有着决定性的意义。GlusterFS 支持TCP/IP 和InfiniBandRDMA 高速网络互联,客户端可通过原生Glusterfs 协议访问数据,其他没有运行GlusterFS客户端的终端可通过NFS/CIFS 标准协议通过存储网关访问数据。
GlusterFS 客户端访问流程
当客户端访问GlusterFS存储时,首先程序通过访问挂载点的形式读写数据,对于用户和程序而言,集群文件系统是透明的,用户和程序根本感觉不到文件系统是本地还是在远程服务器上。读写操作将会被交给VFS(Virtual File System)来处理,VFS会将请求交给FUSE内核模块,而FUSE又会通过设备/dev/fuse将数据交给GlusterFS Client。最后经过GlusterFS Client的计算,并最终经过网络将请求或数据发送到GlusterFS Server上。
GlusterFS 专业术语
Brick(存储卡):存储池中节点对外提供存储服务的目录
Volume (逻辑卷):一个逻辑卷是一组 Brick 的集合,卷是数据存储的逻辑设备,类似LVM 中的逻辑卷,大部分 GlusterFS 管理操作都是在逻辑卷上操作的
FUSE(用户空间文件系统):是一个内核模块,用户自行创建挂载的文件系统
VFS(接口):内核空间对用户控件提供的访问磁盘的接口
Glusterd(后台管理进程):在存储集群中的每个节点上都要运行
GlusterFS 集群的模式
GlusterFS 集群的模式只数据在集群中的存放结构,类似于磁盘阵列中的级别。
分布式卷(Distributed Volume)
GlusterFS的默认卷,在创建卷时,默认选项是创建分布式卷。又称哈希卷,近似于RAID0,文件没有分片,文件根据hash算法写入各个节点的硬盘上,优点是容量大,缺点是没冗余。
gluster volume create test-volume server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
复制卷(Replicated Volume)
相当于RAD1,即同一文件保存一份或多份副本。每个节点上保存相同的内容和目录结构。复制模式因为要保存副本,所以磁盘利用率较低,复制卷时,复制数必须等于卷中Brick所包含的存储服务器数,复制卷具备冗余性,即使一个节点损坏,也不影响数据的正常使用;
gluster volume create test-volume replica 3 transport tcp server1:/exp1 server2:/exp2
分布式复制卷(Distributed Replicated Volume)
分布式复制GlusterFS卷结合了分布式和复制Gluster卷的特点,看起来类似RAID10,但其实不同,RAID10其实质是条带化,但分布式复制GlusterFS卷则没有。Brick数必须是副本数的倍数。
gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3
条带卷(Striped Volume)
文件是分片均匀写在各个节点的硬盘上的,优点是分布式读写,性能整体较好。缺点是没有冗余,分片随机读写可能会导致硬盘IOPS饱和。
注意:Brick的数量应等于带区卷的带区数。
gluster volume create test-volume stripe 2 transport tcp server1:/exp1 server2:/exp2
[图片上传中...(image.png-42e971-1582810376040-0)]
分布式条带卷(Distributed Striped Volume)
当单个文件的体型十分巨大,客户端数量更多时,条带卷已经无法满足需求,此时将分布式与条带化结合起来是一个比较好的选择。其性能与服务器数量有关。
注意:对于分布式条带化卷,块数应为条带数的倍数。
gluster volume create test-volume stripe 4 transport tcp \
server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4 \
server5:/exp5 server6:/exp6 server7:/exp7 server8:/exp8
[图片上传失败...(image-3bac3d-1582810636308)]
条带复制卷(Striped Replicated Volumes)
条带复制卷兼顾了条带卷和复制卷两者的优点,相当于RADI 10,用于存储效率高,备份冗余的场景下。Brick数应为复制计数和条带计数的倍数。
gluster volume create test-volume stripe 2 replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
分布式条带复制卷(Distributed Striped Replicated Volumes)
分布式条带复制卷将分布条带数据在复制卷集群。为了获得最佳效果,可以选择使用分布在高并发的条带复制卷环境下并行访问非常大的文件和性能是至关重要的。对于分布式条带复制卷,Brick数应为条带数和副本数的倍数。
使用 GlusterFS
部署GlusterFS 集群
实验环境说明
系统类型 | IP地址 | 主机名 | 角色 |
---|---|---|---|
CentOS 7.6 1810 | 10.4.7.50 | client.onelpc.cn | gluster-client |
CentOS 7.6 1810 | 10.4.7.51 | data1.onelpc.cn | gluster-server |
CentOS 7.6 1810 | 10.4.7.52 | data2.onelpc.cn | gluster-server |
CentOS 7.6 1810 | 10.4.7.53 | data3.onelpc.cn | gluster-server |
client所需软件:glusterfs、glusterfs-fuse
server所需软件: glusterfs、glusterfs-server、glusterfs-fuse 、glusterfs-rdma
server端:单独创建一块磁盘用来存储数据
所有节点操作
关闭防火墙
systemctl disable firewalld.service
systemctl stop firewalld.service
关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
配置域名解析
cat <> /etc/hosts
10.4.7.50 client.onelp.cn
10.4.7.51 data1.onelpc.cn
10.4.7.52 data2.onelpc.cn
10.4.7.53 data3.onelpc.cn
EOF
下载Gluster 源
yum -y install centos-release-gluster
// 该源下载软件的站点为国外,速度很慢。建议将地址改为国内。将文件的baseurl地址改为阿里源的地址
Gluster-Server 节点操作
安装Server端服务
yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
初始化数据盘
这里为了更真实的模拟生存环境,将数据单独存放在一块磁盘。
fdisk /dev/sdb
mkfs.xfs /dev/sdb1
创建数据存储目录
mkdir -p /gfsdata //创建数据目录
mount /dev/sdb1 /gfsdata/ //挂载数据盘到数据目录,设置为开机自启动需要写入到/etc/fstab
启动服务
systemctl enable glusterd //设置开机自启动
systemctl start glusterd //启动gluster服务
netstat -lntup|grep gluster //会启动24007端口
创建 gluster 集群
gluster peer probe data1.onelpc.cn //添加本机节点
gluster peer probe data2.onelpc.cn //添加data2节点
gluster peer probe data3.onelpc.cn //添加data3节点
查看gluster集群状态
[root@data1 ~]# gluster peer status
Number of Peers: 2
Hostname: data2.onelpc.cn
Uuid: ace1a9eb-0edc-4080-b703-e2d018a01d41
State: Peer in Cluster (Connected)
Hostname: data3.onelpc.cn
Uuid: 838b4eb8-e1b6-48cc-8b80-db694fd2b815
State: Peer in Cluster (Connected)
创建数据存储卷(复制卷)
gluster volume create gv0 replica 3 transport tcp \
data1.onelpc.cn:/gfsdata \
data2.onelpc.cn:/gfsdata \
data3.onelpc.cn:/gfsdata force
启动复制卷
gluster volume start gv0
gluster volume info //查看卷信息
==>>输入结果
Volume Name: gv0
Type: Replicate
Volume ID: 950d0e7e-8d5a-4889-b96e-9fff952e04dd
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: data1.onelpc.cn:/gfsdata
Brick2: data2.onelpc.cn:/gfsdata
Brick3: data3.onelpc.cn:/gfsdata
Options Reconfigured:
transport.address-family: inet
storage.fips-mode-rchecksum: on
nfs.disable: on
performance.client-io-threads: off
Gluster-Client 节点操作
安装gluster 客户端服务
[root@client ~]# yum install -y glusterfs gluster-fuse
将gluster的gv0卷挂载
这里直接挂载到/mnt目录
[root@client ~]# mount -t glusterfs data1.onelpc.cn:gv0 /mnt/
[root@client ~]# df -hT|grep mnt
data1.onelpc.cn:gv0 fuse.glusterfs 20G 238M 20G 2% /mnt
Gluster 服务测试
Client 节点创建文件
[root@client ~]# touch /mnt/file{1..5}
[root@client ~]# ll /mnt/
total 0
-rw-r--r-- 1 root root 0 Feb 27 18:51 file1
-rw-r--r-- 1 root root 0 Feb 27 18:51 file2
-rw-r--r-- 1 root root 0 Feb 27 18:51 file3
-rw-r--r-- 1 root root 0 Feb 27 18:51 file4
-rw-r--r-- 1 root root 0 Feb 27 18:51 file5
Server节点查看(任意节点)
管理使用GlusterFS
Gluster 节点管理
查看节点信息
# 查看节点状态
gluster peer status
# 添加节点
gluster peer
gluster peer 10.4.7.100 //可以使用IP或域名
# 删除节点
gluster peer detach
gluster peer detach 10.4.7.100
//移除节点时要保证节点上没有brick,需要提前移除brick
Gluster 卷管理
基础操作
# 卷信息
gluster volume info
# 卷状态
gluster volume status
# 启动/停止卷
gluster volume start/stop
gluster volume start gv0
# 删除卷
gluster volume delete
gluster volume stop gv0 //删除卷之前需要先停止
gluster volume delete gv0
均衡卷
# 修复布局,不迁移数据
gluster volume rebalance fix-layout start
# 修复布局,迁移数据
gluster volume rebalance start
# 强制迁移数据
gluster volume rebalance startforce
# 查看平衡操作后的状态
gluster volume rebalance status
# 停止正在平衡的卷
gluster volume rebalance stop
修复卷
# 只修复有问题的文件
gluster volume heal
# 修复所有文件
gluster volume heal full
# 查看自愈详情
gluster volume heal info
Brick管理
复制卷要一次添加的bricks数是replica的整数倍;stripe同样要求。
复制卷要移除的Brick是replica的整数倍,stripe具有同样的要求,复制卷要移除一对Brick。
# 添加brick
gluster volume add-brick
# 移除brick
gluster volume remove-brick start|status|commit
# 在执行移除操作时,数据会移到其他节点。
gluster volume remove-brick gv0 10.4.7.54:/dir 10.4.7.55:/dir 10.4.7.56:/dir start
# 在执行移除操作后,可以使用status命令进行task状态查看.
gluster volume remove-brick gv0 10.4.7.54:/dir 10.4.7.55:/dir 10.4.7.56:/dir status
# 使用commit命令执行brick移除,则不会进行数据迁移而直接删除brick.
gluster volume remove-brick gv0 10.4.7.54:/dir 10.4.7.55:/dir 10.4.7.56:/dir commit
# 替换brick
注意:仅在分布式复制或纯复制卷中支持在gluster中使用“ replace-brick”命令替换砖块。
系统拓展
系统配额
# 开启/关闭系统配额,需要使用enable将其开启;disable为关闭命令
gluster volume quota {enable/disable}
#设置目录配额
gluster volume quota limit-usage /directory
gluster volume quota gv0 limit-usage /quota 1GB //设置gv0卷下子目录/quota的配额为1G
# 查看配额
gluster volume quota list
gluster volume quota gv0 list //查看gv0卷的配额列表
gluster volume quota gv0 list /quota //查看gv0卷下/quota的配额信息
地域复制
I/O信息查看
profile command
提供了一个接口查看每个卷中的每个brick的io信息,有助于确定存储系统中的瓶颈。
# 启动 profiling,之后便可以进行io查看
gluster volume profile VOLNAME start
# 查看io信息,可以查看到每个brick的io信息
gluster volume profile VOLNAME info
# 关闭 profiling 功能
gluster volume profile VOLNAME stop
top监控
top command
允许你查看bricks的性能,读取,写入,文件打开调用,文件读取调用,文件写入调用,目录打开调用和目录实际调用。默认100个结果。
### BRICK-NAME 指定brick的名称,list-cnt 指定个数
# 查看打开的fd
gluster volume top VOLNAME open [brick BRICK-NAME] [list-cnt cnt]
# 查看调用次数最多的读调用
gluster volume top VOLNAME read [brick BRICK-NAME] [list-cnt cnt]
# 查看调用次数最多的写调用
gluster volume top VOLNAME write [brick BRICK-NAME] [list-cnt cnt]
# 查看次数最多的目录调用
gluster volume top opendir [brick BRICK-NAME] [list-cnt cnt]
gluster volume top readdir [brick BRICK-NAME] [list-cnt cnt]
# 查看每个brick的读性能
gluster volume top VOLNAME read-perf [bs blk-size count count] [brick BRICK-NAME] [list-cnt cnt]
# 查看每个brick的写性能
gluster volume top VOLNAME write-perf [bs blk-size count count] [brick BRICK-NAME] [list-cnt cnt]