一 、GlusterFS概述
1.1 GlusterFS简介
Glusterfs是一个开源的分布式文件系统,是Scale存储的核心,能够处理千数量级的客户端.在传统的解决 方案中Glusterfs能够灵活的结合物理的,虚拟的和云资源去体现高可用和企业级的性能存储.
Glusterfs通过TCP/IP或InfiniBand RDMA网络链接将客户端的存储资块源聚集在一起,使用单一的全局命名空间来管理数据,磁盘和内存资源.
Glusterfs基于堆叠的用户空间设计,可以为不同的工作负载提供高优的性能.
1.2 GlusterFS特点
●扩展性和高性能
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的逻辑集合(卷)
●FUSE:Filesystem Userspace是一个可加载的内核模块,其支持非特权用户创建自己的文件系统而不需要修改内核代码。通过在用户空间运行文件系统的代码通过FUSE代码与内核进行桥接。
●VFS:虚拟文件系统
●Glusterd:Gluster management daemon,要在trusted storage pool中所有的服务器上运行。
二、GlusterFS工作原理
2.1 GlusterFS工作流程
- 客户端或应用程序通过GlusterFS的挂载点访问数据
- linux系统内核通过VFS API收到请求并处理
- VFS将数据递交给FUSE内核文件系统,fuse文件系统则是将数据通过/dev/fuse设备文件递交给了 GlusterFS client端
- GlusterFS client收到数据后,client根据配置文件的配置对数据进行处理
通过网络将数据传递至远端的GlusterFS Server,并且将数据写入到服务器存储设备上
2.2 弹性HASH算法
- 通过HASH算法得到一个32位的整数
- 划分为N个连续的子空间,每个空间对应一个Brick(存储块)
- 弹性HASH算法的优点
◆ 保证数据平均分布在每一个Brick中
◆解决了对元数据服务器的依赖,进而解决了单点故障以及访问瓶颈
三、GlusterFS的卷类型
3.1 分布式卷
3.1.1分布式简介
没有对文件进行分块处理
通过扩展文件属性保存HASH值
支持的底层文件系统有EXT3、EXT4、ZFS、XFS等
3.1.2分布式卷的特点
文件分布在不同的服务器,不具备冗余性
更容易和廉价地扩展卷的大小
单点故障会造成数据丢失
依赖底层的数据保护
3.1.3 创建分布式卷
创建一个名为dis-volume的分布式卷,文件将根据HASH分布在server1:/dir1、server2:/dir2和server3:/dir3中
gluster volume create dis-vol node1:/data/sdb1 node2:/data/sdb1 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/sdc1 node2:/data/sdc1
3.3 复制卷
■ 同一文件保存一份或多分副本
■ 因为要保存副本,所以磁盘利用率较低
若多个节点上的存储空间不一致,将按照木桶效应取最低节点的容量作为该卷的总容量
●特点
卷中所有的服务器均保存一个完整的副本
卷的副本数量可由客户创建的时候决定
至少有两个块服务器或更多服务器
具备冗余性
●创建复制卷
创建名为rep-vol的复制卷,文件将同时存储两个副本,分别在node3:/data/sdb node4:/data/sdb两个Brick中
gluster volume create rep-vol replica 2 node3:/data/sdb1 node4:/data/sdb1 force
3.4 分布式条带卷
●兼顾分布式卷和条带卷的功能
●主要用于大文件访问处理
●最少需要4台服务器
●创建分布式条带卷
创建了名为dis-stripe的分布式条带卷,配置分布式的条带卷时,卷中Brick所包含的存储服务器数必须是条带数的倍数(>=2倍)
gluster volume create dis-stripe stripe 2 node1:/data/sdd1 node2:/data/sdd1 node3:/data/sdd1 node4:/data/sdd1 force
3.5 分布式复制卷
●兼顾分布式卷和复制卷的功能
●用于需要冗余的情况
●创建分布式复制卷
创建名为dis-rep的分布式条带卷,配置分布式复制卷时,卷中Brick所包含的存储服务器数必须是条带数的倍数(>=2倍)
gluster volume create dis-rep replica 2 node1:/data/sde1 node2:/data/sde1 node3:/data/sde1 node4:/data/sde1 force
四、部署GlusterFS卷
4.1实验环境
主机名 | ip地址 | 格式化的磁盘 | 挂载点 |
---|---|---|---|
node1 | 20.0.0.10 | /dev/sdb1 /dev/sdc1 /devsdd1 /dev/sde1 | /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 |
node2 | 20.0.0.11 | /dev/sdb1 /dev/sdc1 /devsdd1 /dev/sde1 | /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 |
node3 | 20.0.0.12 | /dev/sdb1 /dev/sdc1 /devsdd1 /dev/sde1 | /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 |
node4 | 20.0.0.13 | /dev/sdb1 /dev/sdc1 /devsdd1 /dev/sde1 | /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 |
4.2构建存储池子
4.2.1 修改主机名并解析到本地hosts文件中
[root@localhost ~]# hostnamectl set-hostname node1
[root@localhost ~]# bash
[root@node1 ~]# vi /etc/hosts
20.0.0.10 node1
20.0.0.11 node2
20.0.0.12 node3
20.0.0.13 node4
4.2.2 创建硬盘(四台服务器都要)
[root@node1 ~]# fdisk -l ##查看你创建的硬盘
/dev/sdb
/dev/sdc
/dev/sdd
/dev/sde
[root@node1 ~]# fdisk /dev/sdb ###给磁盘分区
[root@node1 ~]# fdisk /dev/sdc
[root@node1 ~]# fdisk /dev/sdd
[root@node1 ~]# fdisk /dev/sde
4.2.3 格式化,挂载硬盘
[root@node1 ~]# mkfs.ext4 /dev/sdb1 ###格式化硬盘
[root@node1 ~]# mkfs.ext4 /dev/sdc1
[root@node1 ~]# mkfs.ext4 /dev/sdd1
[root@node1 ~]# mkfs.ext4 /dev/sde1
[root@node1 ~]# mkdir -p /data/{sdb1,sdc1,sdd1,sde1} ##创建挂载点
[root@node1 ~]# mount /dev/sdb1 /data/sdb1 ##挂载硬盘
[root@node1 ~]# mount /dev/sdc1 /data/sdc1
[root@node1 ~]# mount /dev/sdd1 /data/sdd1
[root@node1 ~]# mount /dev/sde1 /data/sde1
[root@node1 ~]# df -h ###查看挂载
/dev/sdb1 4.8G 20M 4.6G 1% /data/sdb1
/dev/sdc1 4.8G 20M 4.6G 1% /data/sdc1
/dev/sdd1 4.8G 20M 4.6G 1% /data/sdd1
/dev/sde1 4.8G 20M 4.6G 1% /data/sde1
4.2.4 安装glusterfs相应软件并启动服务
[root@node1 ~]# vi /etc/yum.repos.d/glfs.repo ##重新配置一个yum仓库,不然安装不全glusterfs所需要的软件
[GLFS]
name=glfs
baseurl=file:///root/gfsrepo
gpgcheck=0
enable=1
[root@node1 ~]# unzip gfsrepo.zip ##把gfs软件包导入root目录下解压
[root@node1 ~]# yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma ##最后安装gfs相应的软件
[root@node1 ~]# systemctl start glusterd ##启动服务
[root@node1 ~]# systemctl status glusterd ##查看服务启动状态
软件包讲解:
glusterfs:命令软件包
glusterfs-server:glusterfs服务软件
glusterfs-fuse:内核模块软件
glusterfs-rdma:通讯协议RDMA软件包
4.2.5 时间同步
[root@node1 ~]# ntpdate ntp1.aliyun.com
16 Nov 23:02:41 ntpdate[51674]: step time server 120.25.115.20 offset -36001.090537 sec
4.2.6 构建存储池子(在任意节点即可)
[root@node3 ~]# gluster peer probe node2
peer probe: success.
[root@node3 ~]# gluster peer probe node1
peer probe: success.
[root@node3 ~]# gluster peer probe node4
peer probe: success.
[root@node3 ~]# gluster peer status
Number of Peers: 3
Hostname: node2
Uuid: 024f7b0e-19ed-4611-8091-bc84ff665ae3
State: Accepted peer request (Connected)
Hostname: node1
Uuid: 80f7866d-f683-4866-a19c-db9e67a6dec8
State: Accepted peer request (Connected)
Hostname: node4
Uuid: d8a878bc-488c-4f5c-8e6e-3b003db6c0aa
State: Accepted peer request (Connected)
4.3 规划GlusterFS卷
客户端配置:
[root@client ~]# vi /etc/hosts
20.0.0.10 node1
20.0.0.11 node2
20.0.0.12 node3
20.0.0.13 node4
[root@client ~]# yum -y install glusterfs glusterfs-fuse
[root@client ~]# dd if=/dev/zero of=/demo1.log bs=40M count=1 ##创建5个40M的文件
[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
4.3.1创建分布式卷
[root@node1 ~]# gluster volume create dis-vol node1:/data/sdb1 node2:/data/sdb1 force ##创建分布式卷
volume create: dis-vol: success: please start the volume to access data
[root@node1 ~]# gluster volume info dis-vol ##查看卷的相关信息
Volume Name: dis-vol
Type: Distribute
Volume ID: 5671c5a2-9d73-4c9b-8a9c-d1e5093f412b
Status: Created
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: on
[root@node1 ~]# gluster volume start dis-vol ##启动卷
volume start: dis-vol: success
[root@node1 ~]# gluster volume info dis-vol
...省略内容
Status: Started
#客户端挂载分布式卷到/test/dis目录下,并将5个所有测试文件拷贝进去
[root@client ~]# mkdir -p /test/dis
[root@client ~]# mount.glusterfs node1:dis-vol /test/dis/
[root@client ~]# cp /demo* /test/dis/
[root@node1 ~]# ll -h /data/sdb1 ##查看测试文件分布情况
总用量 161M
-rw-r--r--. 2 root root 40M 11月 17 01:04 demo1.log
-rw-r--r--. 2 root root 40M 11月 17 01:04 demo2.log
-rw-r--r--. 2 root root 40M 11月 17 01:04 demo3.log
-rw-r--r--. 2 root root 40M 11月 17 01:04 demo4.log
drwx------. 2 root root 16K 11月 17 2020 lost+found
[root@node2 ~]# ll -h /data/sdb1
总用量 41M
-rw-r--r-- 2 root root 40M 11月 17 12:04 demo5.log
drwx------ 2 root root 16K 11月 18 2020 lost+found
4.3.2创建复制卷
[root@node1 ~]# gluster volume create rep-vol replica 2 node3:/data/sdb1 node4:/data/sdb1 force ##创建复制卷
volume create: rep-vol: success: please start the volume to access data
[root@node1 ~]# gluster volume start rep-vol ##启动复制卷
volume start: rep-vol: success
[root@node1 ~]# gluster volume status rep-vol ##查看情况
Status of volume: rep-vol
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick node3:/data/sdb1 49152 0 Y 3874
Brick node4:/data/sdb1 49152 0 Y 12841
Self-heal Daemon on localhost N/A N/A Y 53199
Self-heal Daemon on node2 N/A N/A Y 51547
Self-heal Daemon on node4 N/A N/A Y 12861
Self-heal Daemon on node3 N/A N/A Y 3894
Task Status of Volume rep-vol
------------------------------------------------------------------------------
There are no active volume tasks
#客户端挂载复制卷到/test/rep目录下,并将5个所有测试文件拷贝进去
[root@client ~]# mkdir -p /test/rep
[root@client ~]# mount.glusterfs node1:rep-vol /test/rep/
[root@client ~]# cp /demo* /test/rep/
[root@node3 ~]# ll -h /data/sdb1 ##查看分配情况
总用量 201M
-rw-r--r--. 2 root root 40M 11月 17 01:07 demo1.log
-rw-r--r--. 2 root root 40M 11月 17 01:07 demo2.log
-rw-r--r--. 2 root root 40M 11月 17 01:07 demo3.log
-rw-r--r--. 2 root root 40M 11月 17 01:07 demo4.log
-rw-r--r--. 2 root root 40M 11月 17 01:07 demo5.log
drwx------. 2 root root 16K 11月 16 22:09 lost+found
[root@node4 ~]# ll -h /data/sdb1
总用量 201M
-rw-r--r-- 2 root root 40M 11月 17 12:07 demo1.log
-rw-r--r-- 2 root root 40M 11月 17 12:07 demo2.log
-rw-r--r-- 2 root root 40M 11月 17 12:07 demo3.log
-rw-r--r-- 2 root root 40M 11月 17 12:07 demo4.log
-rw-r--r-- 2 root root 40M 11月 17 12:07 demo5.log
drwx------ 2 root root 16K 11月 18 2020 lost+found
4.3.3创建条带卷
[root@node1 ~]# gluster volume create stripe-vol stripe 2 node1:/data/sdc1 node2:/data/sdc1 force
volume create: stripe-vol: success: please start the volume to access data
[root@node1 ~]# gluster volume start stripe-vol
volume start: stripe-vol: success
[root@node1 ~]# gluster volume status stripe-vol
Status of volume: stripe-vol
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick node1:/data/sdc1 49153 0 Y 53421
Brick node2:/data/sdc1 49153 0 Y 51668
Task Status of Volume stripe-vol
------------------------------------------------------------------------------
There are no active volume tasks
#客户端挂载条带卷到/test/strip目录下,并将5个所有测试文件拷贝进去
[root@client ~]# mkdir -p /test/strip
[root@client ~]# mount.glusterfs node1:stripe-vol /test/strip/
[root@client ~]# cp /demo* /test/strip/
[root@node1 ~]# ll -h /data/sdc1
总用量 101M
-rw-r--r--. 2 root root 20M 11月 17 01:16 demo1.log
-rw-r--r--. 2 root root 20M 11月 17 01:16 demo2.log
-rw-r--r--. 2 root root 20M 11月 17 01:16 demo3.log
-rw-r--r--. 2 root root 20M 11月 17 01:16 demo4.log
-rw-r--r--. 2 root root 20M 11月 17 01:16 demo5.log
drwx------. 2 root root 16K 11月 17 2020 lost+found
[root@node2 ~]# ll -h /data/sdc1
总用量 101M
-rw-r--r-- 2 root root 20M 11月 17 12:16 demo1.log
-rw-r--r-- 2 root root 20M 11月 17 12:16 demo2.log
-rw-r--r-- 2 root root 20M 11月 17 12:16 demo3.log
-rw-r--r-- 2 root root 20M 11月 17 12:16 demo4.log
-rw-r--r-- 2 root root 20M 11月 17 12:16 demo5.log
drwx------ 2 root root 16K 11月 18 2020 lost+found
4.3.4 创建分布式复制卷
[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-
dis-rep dis-vol
[root@node1 ~]# gluster volume start dis-rep
volume start: dis-rep: success
[root@node1 ~]# gluster volume status dis-rep
Status of volume: dis-rep
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick node1:/data/sde1 49154 0 Y 53597
Brick node2:/data/sde1 49154 0 Y 51728
Brick node3:/data/sde1 49153 0 Y 4054
Brick node4:/data/sde1 49153 0 Y 13015
Self-heal Daemon on localhost N/A N/A Y 53617
Self-heal Daemon on node3 N/A N/A Y 4074
Self-heal Daemon on node2 N/A N/A Y 51748
Self-heal Daemon on node4 N/A N/A Y 13035
Task Status of Volume dis-rep
------------------------------------------------------------------------------
There are no active volume tasks
#客户端挂载分布式复制卷到/test/dis_rep目录下,并将5个所有测试文件拷贝进去
[root@client ~]# mkdir -p /test/dis_rep
[root@client ~]# mount.glusterfs node1:dis-rep /text/dis_rep/
[root@client ~]# cp /demo* /test/dis_rep
[root@node1 ~]# ll -h /data/sde1
总用量 161M
-rw-r--r--. 2 root root 40M 11月 17 01:20 demo1.log
-rw-r--r--. 2 root root 40M 11月 17 01:20 demo2.log
-rw-r--r--. 2 root root 40M 11月 17 01:20 demo3.log
-rw-r--r--. 2 root root 40M 11月 17 01:20 demo4.log
drwx------. 2 root root 16K 11月 17 2020 lost+found
[root@node2 ~]# ll -h /data/sde1
总用量 161M
-rw-r--r-- 2 root root 40M 11月 17 12:20 demo1.log
-rw-r--r-- 2 root root 40M 11月 17 12:20 demo2.log
-rw-r--r-- 2 root root 40M 11月 17 12:20 demo3.log
-rw-r--r-- 2 root root 40M 11月 17 12:20 demo4.log
drwx------ 2 root root 16K 11月 18 2020 lost+found
[root@node3 ~]# ll -h /data/sde1
总用量 41M
-rw-r--r--. 2 root root 40M 11月 17 01:20 demo5.log
drwx------. 2 root root 16K 11月 16 22:09 lost+found
[root@node4 ~]# ll -h /data/sde1
总用量 41M
-rw-r--r-- 2 root root 40M 11月 17 12:20 demo5.log
drwx------ 2 root root 16K 11月 18 2020 lost+found
4.3.5 创建分布式条带卷
[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
[root@node1 ~]# gluster volume status dis-stripe
Status of volume: dis-stripe
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick node1:/sdd1 49155 0 Y 53738
Brick node2:/data/sdd1 49155 0 Y 51814
Brick node3:/data/sdd1 49154 0 Y 4141
Brick node4:/data/sdd1 49154 0 Y 13100
Task Status of Volume dis-stripe
------------------------------------------------------------------------------
There are no active volume tasks
#客户端挂载分布式条带卷到/tex/d目录下,并将5个所有的测试文件拷贝进去
[root@client ~]# mkdir -p /test/dis_strip
[root@client ~]# mount.glusterfs node1:dis-stripe /text/dis_strip/
[root@client ~]# cp /demo* /text/dis_strip/
[root@node1 ~]# ll -h /data/sdd1
总用量 81M
-rw-r--r--. 2 root root 20M 11月 17 00:54 demo1.log
-rw-r--r--. 2 root root 20M 11月 17 00:54 demo2.log
-rw-r--r--. 2 root root 20M 11月 17 00:54 demo3.log
-rw-r--r--. 2 root root 20M 11月 17 00:54 demo4.log
drwx------. 2 root root 16K 11月 17 2020 lost+found
[root@node2 ~]# ll -h /data/sdd1
总用量 81M
-rw-r--r-- 2 root root 20M 11月 17 11:54 demo1.log
-rw-r--r-- 2 root root 20M 11月 17 11:54 demo2.log
-rw-r--r-- 2 root root 20M 11月 17 11:54 demo3.log
-rw-r--r-- 2 root root 20M 11月 17 11:54 demo4.log
drwx------ 2 root root 16K 11月 17 2020 lost+found
[root@node3 ~]# ll -h /data/sdd1
总用量 21M
-rw-r--r--. 2 root root 20M 11月 17 00:54 demo5.log
drwx------. 2 root root 16K 11月 17 2020 lost+found
[root@node4 ~]# ll -h /data/sdd1
总用量 21M
-rw-r--r-- 2 root root 20M 11月 17 11:54 demo5.log
drwx------ 2 root root 16K 11月 17 2020 lost+found
4.4 访问控制
#仅拒绝某个用户
[root@node1 ~]# gluster volume set dis-rep auth.reject 20.0.0.10
volume set: success
#仅允许某个用户
[root@node1 ~]# gluster volume set dis-rep auth.allow 20.0.0.10
volume set: success