初尝GlusterFS

glusterfs-antmascot

概述

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

glusterfs-frame

GlusterFS 总体架构与组成,它主要由存储服务器(Brick Server)、客户端以及 NFS/Samba 存储网关组成。不难发现,GlusterFS 架构中没有元数据服务器组件,这是其最大的设计这点,对于提升整个系统的性能、可靠性和稳定性都有着决定性的意义。

  • GlusterFS 支持 TCP/IP 和 InfiniBand RDMA 高速网络互联。
  • 客户端可通过原生 GlusterFS 协议访问数据,其他没有运行 GlusterFS 客户端的终端可通过 NFS/CIFS 标准协议通过存储网关访问数据(存储网关提供弹性卷管理和访问代理功能)。
  • 存储服务器主要提供基本的数据存储功能,客户端弥补了没有元数据服务器的问题,承担了更多的功能,包括数据卷管理、I/O 调度、文件定位、数据缓存等功能,利用 FUSE(File system in User Space)模块将 GlusterFS 挂载到本地文件系统之上,实现 POSIX 兼容的方式来访问系统数据。

卷类型

Distribute卷

分布式卷,基于 Hash 算法将文件分布到所有 brick server,只是扩大了磁盘空间,不具备容错能力。由于distribute volume 使用本地文件系统,因此存取效率并没有提高,相反会因为网络通信的原因使用效率有所降低,另外本地存储设备的容量有限制,因此支持超大型文件会有一定难度。

glusterfs-volume-distribute

Stripe卷

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

glusterfs-volume-stripe

Replica卷

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

glusterfs-volume-replica

Distribute Stripe卷

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

glusterfs-volume-distribute-stripe

Distribute Replica卷

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

glusterfs-volume-distribute-replica

Stripe Replica卷

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

glusterfs-volume-stripe-replica

Distribute Stripe Replica卷

分布式条带复制卷,三种基本卷的复合卷,通常用于类 Map Reduce 应用。

glusterfs-volume-distribute-stripe-replica

环境

使用docker部署GlusterFS,dockerfile如下:

1
2
3
4
5
6
7
8
9
FROM centos:7.3.1611

MAINTAINER zhoub

RUN yum update -y
RUN yum install -y centos-release-gluster310.noarch
RUN yum update -y

RUN yum clean all

创建GlusterFS镜像

1
2
# docker build -t glusterfs:3.10 -f ./dockerfile .
...

创建docker容器脚本mkgfs.sh,创建两个容器,用来组件gluster集群

1
2
3
4
5
6
7
8
9
#!/bin/sh

count=2
image=glusterfs:3.10

for((i=1;i<=$count;i++))
do
docker run -d -e "container=docker" --privileged=true -v /sys/fs/cgroup:/sys/fs/cgroup -h glf-client-$i --name glf_client_$i ${image} /usr/sbin/init
done

部署&使用

部署

安装glusterfs-server

1
2
# yum install -y glusterfs-server
...

准备数据目录

1
# mkdir -p /brks/brk1/gv0

(此处不进行数据盘挂载,直接使用系统硬盘)

启动glusterd服务

1
2
3
4
5
# systemctl enable glusterd
...
# systemctl start glusterd
# systemctl status glusterd
...

在容器glf-client-1上添加glf-client-2

1
gluster peer probe glf-client-2

(此处省去向/etc/hosts增加ip、域名的映射修改)

在容器glf-client-2上添加glf-client-1

1
gluster peer probe glf-client-1

(此处省去向/etc/hosts增加ip、域名的映射修改)

在任意一个容器上创建、启动volume

1
2
# gluster volume create gv0 replica 2 glf-client-1:/brks/brk1/gv0 glf-client-2:/brks/brk1/gv0 force
# gluster volume start gv0

(由于gv0使用的是系统盘,所以在volume创建时,需要指定force参数)
创建、启动完volume后可通过gluster volume infogluster volume status gv0查看状态。

使用

1
mount -t glusterfs glf-client-1:gv0 /mnt/

参考&鸣谢