GlusterFS 文件系统笔记整理

2018/04/26 Linux

GlusterFS 简介

GlusterFS 官网:https://www.gluster.org/

GlusterFS (Gluster File System) 是一个开源的分布式文件系统,主要由 Z RESEARCH 公司负责开发。GlusterFS 是 Scale-Out 存储解决方案 Gluster 的核心,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。GlusterFS 借助 TCP/IP 或 InfiniBand RDMA 网络将物理分布的存储资源聚集在一起,使用单一全局命名空间来管理数据。GlusterFS 基于可堆叠的用户空间设计,可为各种不同的数据负载提供优异的性能。

GlusterFS 特点

  • 扩展性和高性能

    GlusterFS 利用双重特性来提供几TB至数PB的高扩展存储解决方案。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

1、部署简单

GlusterFS 已经被红帽收购了,官方提供了 RPM 包,直接使用 yum 命令安装即可在几分钟之内部署好一个集群。

2、开源免费

3、方便扩展

GlusterFS 术语简介

1. Brick:    GFS中的存储单元,通过是一个受信存储池中的服务器的一个导出目录。可以通过主机名和目录名来标识,如'SERVER:EXPORT'
2. Metadata:      元数据,关于数据的数据,用于描述文件、目录等信息
3. Client:   挂载了 GlusterFS 卷的设备
4. Extended Attributes:   xattr是一个文件系统的特性,其支持用户或程序关联文件/目录和元数据。
5. FUSE:   Filesystem Userspace是一个可加载的内核模块,其支持非特权用户创建自己的文件系统而不需要修改内核代码。通过在用户空间运行文件系统的代码通过FUSE代码与内核进行桥接。
6. GFID:   GFS卷中的每个文件或目录都有一个唯一的128位的数据相关联,其用于模拟inode
7. Namespace:  每个Gluster卷都导出单个ns作为POSIX的挂载点
8. Node:  一个拥有若干brick的设备
9. RDMA:  远程直接内存访问,支持不通过双方的OS进行直接内存访问。
10. RRDNS:  round robin DNS是一种通过DNS轮转返回不同的设备以进行负载均衡的方法
11. Self-heal:  用于后台运行检测复本卷中文件和目录的不一致性并解决这些不一致。
12. Split-brain:  脑裂
13. Volfile:  glusterfs进程的配置文件,通常位于/var/lib/glusterd/vols/volname
14. Volume:   一组bricks的逻辑集合
15. Glusterd: Gluster management daemon,要在trusted storage pool中所有的服务器上运行。

GlusterFS 卷类型

官方文档:http://gluster.readthedocs.io/en/latest/Quick-Start-Guide/Architecture/

为了满足不同应用对高性能、高可用的需求,GlusterFS 支持 7 种卷,即 distribute 卷、stripe 卷、replica 卷、distribute stripe 卷、distribute replica 卷、stripe Replica 卷、distribute stripe replica 卷。其实不难看出,GlusterFS 卷类型实际上可以分为 3 种基本卷和 4 种复合卷,每种类型的卷都有其自身的特点和适用场景。

基本卷

(1) distribute volume 分布式卷

基于 HASH 算法将文件分布到所有 brick Server ,只扩大了磁盘空间,不具备容错能力。

Distribute volume 示意图

功能理解:基于 HASH 算法,将文件随机存储,如上图,File1 和 File2 存储在 server1,而 File3 存储在 Server2 节点上了。

(2) stripe volume 条带卷

类似于 RAID0,文件分成数据块以 Round Robin 方式分不到 brick Server 上,并发粒度是数据块,支持超大文件,大文件的读写性能高。

Stripe Volume 示意图

功能理解:文件将被切分成数据块以后,存储到不同服务器中,如上图 File 被分割为 6 块,1、3、5 存储到 server1 节点,2、4、6 存储到 server2 节点上。

(3) replica volume 复制卷

文件同步复制到多个 brick 上,文件级 RAID1,具有容错能力,写性能下降,读性能提升。Replicated 模式,也称作 AFR(Auto File Replication),相当于 RAID1,即同一个文件在多个镜像存储节点上保存多份,每个 replicated 子节点有着相同的目录结构和文件,replica volume 也是在容器存储中较为推崇的一种。

Replica volume 示意图

功能理解: 文件被存储到服务器,如上图 File1 同时存储在 server1 和 server2,File2 也是如此,server2 相当于 server1 的备份。

复合卷

(4) distribute stripe volume 分布式条带卷

Brick Server 数量是条带数的倍数,兼具 distribute 和 sripe 卷的特点。分布式的条带卷,volume 中 brick 所包含的存储服务器数必须是 stripe 的倍数(>=2倍),兼顾分布式和条带式的功能,每个文件分布在四台共享服务器上,通常用于大文件访问处理,最少需要4台服务器才能创建分布条带卷。

distribete stripe volume 示意图

功能理解:将文件存到不同服务器里,如上图,File被分割成4段,1、3在server1(exp1)中,2、4在server1(exp2)中。server2(exp3)1、3存放server1(exp1)中的备份文件,server2(exp4)2、4存放server1(exp2)中的备份文件。

(5) distribute replica volume 分布式复制卷

Brick Server 数量是镜像的倍数,兼具 distribute 和 replica 卷的特点,可以在 2 个或多个节点之间复制数据。分布式的复制卷,Volume 中 brick 所包含的存储服务器数必须是 replica 的倍数(>=2倍),兼顾分布式和复制的功能。

distribute replica volume 示意图

功能理解:将文件备份随机存放在服务器里,如上图,server1(exp1)存放File1文件,Server1(exp2)存放File2文件。server2(exp3)存放File1的备份文件,server2(exp4)存放File2的备份文件。

(6) stripe replica volume 条带复制卷

类似 RAID 10,同时具有条带卷和复制卷的特点。

Stripe replica volume 示意图

功能理解:将文件分割并备份随机存放在不同的服务器里,如上图,File被分割4段,1、3存放在server1(exp1)上,2、4存放在server2(exp4),server1上的(exp3)存放server2(exp4)的备份文件,server2上的(exp2)存放server1(exp1)的备份文件。

(7) distribute stripe replica volume 分布式条带复制卷

三种基本卷的复合卷,通常用于类 Map Reduce 应用。

distribute stripe replica volume 示意图

功能理解:将文件分割并备份随机存放在不同服务器里,如上图,File被分割成4段,1、3存放在server1(exp1)中,2、4存放在server2(exp3)中。server1(exp2)存放server1(exp1)的备份文件,server2(exp4)存放server2(exp3)的备份文件。

安装 GlusterFS

环境说明

使用四台服务器安装 GlusterFS 组成一个集群。

IP地址 主机名 OS
10.100.4.181 glusterfs-master CentOS7.4.1708
10.100.4.182 glusterfs-node1 CentOS7.4.1708
10.100.4.183 glusterfs-node2 CentOS7.4.1708
10.100.4.184 glusterfs-node3 CentOS7.4.1708

配置 hosts

10.100.4.181 glusterfs-master
10.100.4.182 glusterfs-node1
10.100.4.183 glusterfs-node2
10.100.4.184 glusterfs-node3

安装 GlusterFS

CentOS 操作系统安装 GlusterFS 非常简单,官方默认提供了 RPM 包。在4台节点上都安装 glusterfs。

yum -y install centos-release-gluster
yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma

启动 GlusterFS 集群

在 4台节点上都启动 glusterfs

systemctl start glusterd.service
systemctl enable glusterd.service
systemctl status glusterd.service

给集群增加节点

现在4台机器都已经 Yum 安装完毕,并且启动了服务,在任何一台机器上面运行命令都是可以的,因为没有中心节点,每个节点都是平等。

[root@glusterfs-master ~]# gluster peer probe glusterfs-master
peer probe: success. Probe on localhost not needed
[root@glusterfs-master ~]# gluster peer probe glusterfs-node1
peer probe: success. 
[root@glusterfs-master ~]# gluster peer probe glusterfs-node2
peer probe: success. 
[root@glusterfs-master ~]# gluster peer probe glusterfs-node3
peer probe: success. 

查看集群状态

[root@glusterfs-master ~]# gluster peer status
Number of Peers: 3

Hostname: glusterfs-node1
Uuid: 7254e2bf-606d-4027-b17f-a039dfca1168
State: Peer in Cluster (Connected)

Hostname: glusterfs-node2
Uuid: ddbd3ae3-c0f8-47c7-a0a3-9d3f23210bc8
State: Peer in Cluster (Connected)

Hostname: glusterfs-node3
Uuid: aa079f15-af1b-4ab1-86f9-8c98ba9bd463
State: Peer in Cluster (Connected)

在4台服务器上创建数据存储目录

mkdir -pv /data/gluster/data

生产中 /data 目录应该是独立的磁盘分区,我这里为了演示/data目录是在根分区下。

查看 Volume 状态

在 gluster-master上进行查看,因为没有创建任何卷,所以结果是没有卷。

[root@glusterfs-master ~]# gluster volume info
No volumes present

创建一个 replica 类型卷测试

replica 副本数为 4,逻辑卷名字叫 myvolume

[root@glusterfs-master ~]# gluster volume create myvolume replica 4 glusterfs-master:/data/gluster/data glusterfs-node1:/data/gluster/data glusterfs-node2:/data/gluster/data glusterfs-node3:/data/gluster/data
volume create: myvolume: success: please start the volume to access data

注意:如果你跟我一样 /data 目录不是独立的磁盘分区,在执行上面命令时会提示如下信息,解决方法就是在命令最后面加上 force 即可。

volume create: myvolume: failed: The brick glusterfs-master:/data/gluster/data is being created in the root partition. It is recommended that you don't use the system's root partition for storage backend. Or use 'force' at the end of the command if you want to override this behavior.

在查看 Volume 状态

[root@glusterfs-master ~]# gluster volume info
 
Volume Name: myvolume
Type: Replicate
Volume ID: ae8df54e-1dd1-4cf2-abf6-a418bdaa7c7f
Status: Created
Snapshot Count: 0
Number of Bricks: 1 x 4 = 4
Transport-type: tcp
Bricks:
Brick1: glusterfs-master:/data/gluster/data
Brick2: glusterfs-node1:/data/gluster/data
Brick3: glusterfs-node2:/data/gluster/data
Brick4: glusterfs-node3:/data/gluster/data
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off

启动 myvolume 卷

创建完卷以后是不可以被挂载使用的,要先启动卷。

[root@glusterfs-master ~]# gluster volume start myvolume
volume start: myvolume: success

部署 GlusterFS 客户端

部署客户端,并 mount 挂载 GlusterFS 文件系统,客户端必须在本地加入 glusterfs hosts 否则报错。

安装

yum -y install glusterfs glusterfs-fuse

添加 glusterfs hosts

10.100.4.181 glusterfs-master
10.100.4.182 glusterfs-node1
10.100.4.183 glusterfs-node2
10.100.4.184 glusterfs-node3

创建一个挂载目录并挂载

root@k8s-node1:~ # mkdir /opt/gfsmnt
root@k8s-node1:~ # mount -t glusterfs glusterfs-master:myvolume /opt/gfsmnt/
root@k8s-node1:~ # mount|grep glusterfs
glusterfs-master:myvolume on /opt/gfsmnt type fuse.glusterfs (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072)

测试

在客户端创建一个 1G 的文件

root@k8s-node1:/opt/gfsmnt # time dd if=/dev/zero of=test_file bs=1000M count=1
记录了1+0 的读入
记录了1+0 的写出
1048576000字节(1.0 GB)已复制,36.4209 秒,28.8 MB/秒

real    0m36.438s
user    0m0.000s
sys     0m1.857s

创建各种类型的卷

创建分布式卷(Distributed GlusterFS Volume)

distribute volume,即 DHT,也叫分布卷。默认模式

# gluster volume create <NEW-VOLNAME> [transport tcp | rdma | tcp,rdma]
# 使用tcp创建具有四个存储服务器的分布式卷
gluster volume create test-volume glusterfs-master:/data/gluster/data glusterfs-node1:/data/gluster/data glusterfs-node2:/data/gluster/data glusterfs-node3:/data/gluster/data force 

创建复制卷(Replica GlusterFS Volume)

# gluster volume create <NEW-VOLNAME> [replica] [transport tcp | rdma | tcp,rdma]
# 创建具有2个存储服务器的复制卷
gluster volume create test-volume replica 2 glusterfs-master:/data/gluster/data glusterfs-node1:/data/gluster/data force

创建条带卷(Striped GlusterFS Volume)

# gluster volume create <NEW-VOLNAME> [stripe] transport tcp | rdma | tcp,rdma]
gluster volume create test-volume stripe 2 transport tcp glusterfs-node2:/data/gluster/data glusterfs-node3:/data/gluster/data force

创建分布式条带卷(Distributed Striped GlusterFS Volume)

# gluster volume create  [stripe ] [transport tcp | rdma | tcp,rdma]
# 要跨8个存储服务器创建分布式条带卷
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

创建分布式复制卷(Distributed Replica GlusterFS Volume)

# gluster volume create  [replica ] [transport tcp | rdma | tcp,rdma]
# 具有双向镜像的四个节点分布(复制)卷
gluster volume create test-volume replica 2 transport tcp glusterfs-master:/data/gluster/data glusterfs-node1:/data/gluster/data glusterfs-node2:/data/gluster/data glusterfs-node3:/data/gluster/data force

创建分布式条带复制卷 (Distributed Striped Replicated Volumes)

# gluster volume create  [stripe ] [replica ] [transport tcp | rdma | tcp,rdma]

# 例如,要跨八个存储服务器创建分布式复制条带卷
gluster volume create test-volume stripe 2 replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4 server5:/exp5 server6:/exp6 server7:/exp7 server8:/exp8

创建条带复制卷(Striped Replicated Volumes)

# gluster volume create  [stripe ] [replica ] [transport tcp | rdma | tcp,rdma]
# 例如,要在四个存储服务器上创建分条复制卷,请执行以下操作
gluster volume create test-volume stripe 2 replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4

其它维护类命令

1. 查看 GlusterFS 中所有的 Volume

gluster volume list

2. 删除 GlusterFS 磁盘

# 停止名为 test-volume 的磁盘
[root@glusterfs-master ~]# gluster volume stop test-volume
Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y
volume stop: test-volume: success
# 删除名字为 test-volume 的磁盘
[root@glusterfs-master ~]# gluster volume delete test-volume
Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y
volume delete: test-volume: success

3. 卸载某个节点的 GlusterFS 磁盘

# 从存储池中删除 glusterfs-node3 节点
gluster peer detach glusterfs-node3

4. 设置访问限制,按照每个 volume 来限制

# 限制只允许10.100.4.198 主机访问访问 test-volume 卷
[root@glusterfs-master ~]# gluster volume set test-volume auth.allow 10.100.4.198
volume set: success

# 限制只允许 10.100.4.*,10.101.2.* 访问 test-volume 卷
gluster volume set test-volume auth.allow 10.100.4.*,10.101.2.*

5. 添加 GlusterFS 节点

# 
[root@glusterfs-master ~]# gluster peer probe glusterfs-node2
peer probe: success. 
[root@glusterfs-master ~]# gluster peer probe glusterfs-node3
peer probe: success. 
[root@glusterfs-master ~]# gluster volume add-brick test-volume glusterfs-node2:/data/gluster/data glusterfs-node3:/data/gluster/data force
volume add-brick: success

注意:如果是复制卷或者条带卷,则每次添加的Brick数必须是replica或者stripe的整数倍

6. 配置卷

gluster volume set mamm-volume key value 

7. 缩容 Volume

[root@glusterfs-master ~]# gluster volume info
 
Volume Name: myvolume
Type: Distribute
Volume ID: 8023edea-ceeb-4f58-a59f-99ca603d0810
Status: Started
Snapshot Count: 0
Number of Bricks: 3
Transport-type: tcp
Bricks:
Brick1: glusterfs-master:/data/gluster/data
Brick2: glusterfs-node1:/data/gluster/data
Brick3: glusterfs-node2:/data/gluster/data
Options Reconfigured:
transport.address-family: inet
nfs.disable: on

先将数据迁移到其它可用的Brick,迁移结束后才将该Brick移除

[root@glusterfs-master ~]# gluster volume remove-brick myvolume glusterfs-node2:/data/gluster/data glusterfs-node1:/data/gluster/data/ start
volume remove-brick start: success
ID: 7eb1cf7b-489a-42b3-9c86-a8721aa4fd45

在执行了start之后,可以使用status命令查看移除进度

[root@glusterfs-master ~]# gluster volume remove-brick myvolume glusterfs-node2:/data/gluster/data glusterfs-node1:/data/gluster/data/ status

不进行数据迁移,直接删除该Brick

[root@glusterfs-master ~]# gluster volume remove-brick myvolume glusterfs-node2:/data/gluster/data glusterfs-node1:/data/gluster/data/ commit

注意:如果是复制卷或者条带卷,则每次移除的Brick数必须是replica或者stripe的整数倍。

8. 扩容 volume

gluster volume add-brick test-volume glusterfs-node3:/data/gluster/data

9. 迁移 volume

使用start命令开始进行迁移:

# gluster volume replace-brick <VOLNAME> <BRICK> <NEW-BRICK> start

在数据迁移过程中,可以使用pause命令暂停迁移:

# gluster volume replace-brick <VOLNAME> <BRICK> <NEW-BRICK> pause

在数据迁移过程中,可以使用abort命令终止迁移:

# gluster volume replace-brick <VOLNAME> <BRICK> <NEW-BRICK> abort

在数据迁移过程中,可以使用status命令查看迁移进度:

# gluster volume replace-brick <VOLNAME> <BRICK> <NEW-BRICK> status

在数据迁移结束后,执行commit命令来进行Brick替换:

# gluster volume replace-brick <VOLNAME> <BRICK> <NEW-BRICK> commit

参考资料

https://www.cnblogs.com/jicki/p/5801712.html

https://www.ibm.com/developerworks/cn/opensource/os-cn-glusterfs-docker-volume/index.html

http://blog.51niux.com/?id=154

https://blog.csdn.net/liuaigui/article/details/17331557

Search

    Table of Contents