【前言】

gluseterfs是我使用过的第一款开源存储文件系统,也是唯一一款。在经历了文件存储的种种弊端<遍历>之后,就进入了对象存储的行列。gluster同样也是我心中最优秀的开源存储文件系统。他依靠其完美的弱入手,低坑模式,深受我这种菜鸟的喜爱并一发不可收拾。

glusterFS:分布式横向扩展文件系统,可以根据存储需求快速调配存储,内含丰富的自动故障转移功能,且摈弃集中元数据服务器的思想。适用于数据密集型任务的可扩展网络文件系统,免费开源。gluster于2011年10月7日被red hat收购。

glusterFS由gluster公司的创始人兼首席技术官Anand Babu Periasamy编写。


【技术特点】

1,glusterFS体系结构,将计算、存储和I/O资源聚合到全局名称空间中,每台服务器都被视为节点,通过添加附加节点或向每个节点添加额外存储来扩展容量。通过在更多节点之间部署存储来提高性能,通过在节点之前复制N路数据来实现高可用性。同时以牺牲可靠性为代价。

2,glusterFS支持基于文件的镜像和复制、分条、负载平衡、故障转移、调度、磁盘缓存、存储配额、卷快照等。

3,gluster各客户端之间无连接,本身依赖于弹性哈希算法,而不是使用集中式或分布式元数据模型。

4,gluster通过各种复制选项提供数据可靠性和可用性:复制卷、分布卷。


【显著优点】

1,开源,且网上的文档基本上足够你维护一套简单的存储系统。

2,支持多客户端处理,当前已知的支持千级别及以上规模客户。

3,支持POSIX<简单来说,软件跨平台,也可以看找的其他博客说明,见‘参考文件’>。

4,支持各种低端硬件,当然并不推崇,但是可以实现。我在线上用过8核,32G,依然跑的很溜。

5,支持NFS/SMB/CIFS/GLUSTERFS等行业标准协议访问。

6,提供各种优秀的功能,如磁盘配额、复制式、分布式、快照、性能检测命令等。

7,支持大容量存储,当前已知的支持PB及以上规模存储。

8,可以使用任何支持扩展属性的ondisk文件系统,比如xattr.

9,强大且简单的扩展能力,你可以在任何时候快速扩容。

10,自动配置故障转移,在故障发生时,无需任何操作即可恢复数据,且最新副本依然从仍在运行的节点获取。


【快速配置】

1,准备条件

    a,至少两台设备/节点。192.168.76.128/129/130

    b,具备正常网络连接。

    c,至少两个磁盘,一个用于OS安装,一个用于服务gluster存储。

2,格式化安装磁盘

    a,磁盘分区:# fdisk /dev/sdb

    b,格式化并挂载。

    #mkfs.xfs -i size=512 /dev/sdb1

    #mkdir -p /data/brick1
    #echo '/dev/sdb1 /data/brick1 xfs defaults 1 2' >> /etc/fstab
    #mount -a && mount&&df -h

3,安装glusterFS

    #yum install centos-release-gluster glusterfs-server glusterfs -y

    # service glusterd start

    # service glusterd status

4,配置IP/主机名映射。--在所有主机配置

    # cat /etc/hosts

    192.168.76.128 VM-CDS-COS-1
    192.168.76.129 VM-CDS-COS-2
    192.168.76.130 VM-CDS-COS-3

5,配置peer--在第一台主机上配置,重启其他主机glusterd服务。

    # gluster peer probe VM-CDS-COS-2

    # gluster peer probe VM-CDS-COS-3

    #gluster peer status#注意:从第二个节点运行显示第一个节点已被添加。自己不会显示的。

5,配置volume

    # mkdir -p /data/brick1/volume0

    #  gluster volume create test01 replica 3 VM-CDS-COS-1:/data/brick1/volume0 VM-CDS-COS-2:/data/brick1/volume0 VM-CDS-COS-3:/data/brick1/volume0
    # gluster volume start test0

    # gluster volume info

6,测试gluster

    # mount -t glusterfs VM-CDS-COS-1:/test01 /mnt

    [root@VM-CDS-COS-1 ~]# for i in `seq -w 1 100`;do cp -rp /var/log/messages /mnt/copy-test-$i;done
    [root@VM-CDS-COS-1 ~]# ls -lA /mnt/copy-test-* | wc -l
    [root@VM-CDS-COS-1 ~]# ls -lA /data/brick1/volume0/copy-test-* | wc -l

7,注意事项:

    a,gluster会生成一个UUID来fingerprint每个系统,所以,如果你用虚拟机克隆一个一摸一样的设备对应gluster,会出现错误的。你要做的,是克隆两个干净的系统,并分别安装gluster。

    b,在物理机安装的时候,不要启用省电模式,当然,我知道以你的能力,也不会这么做。只是给你提供个思路而已。

    c,如果你有兴趣,可以对BIOS做有效的设置,比如板载组件不如附加组件强壮,操作系统最好在SATA盘上等等你可以想到的,硬件工程师具备的理论性能知识,以及你所能看到的硬件性能指南等。

    d,在通常情况下,添加更多的节点,可能意味着整个集群的性能更高。

    e,gluster支持多种方式访问数据,如果想要实现高并发,性能和透明故障转移,推荐使用gluster native client


【编译gluster rpm包】

前言:从git源创建gluster的rpm,反正我是不常用,就当是记录吧。

1,安装epel及所需依赖包:

# yum install epel-release -y

# yum -y --disablerepo=rhs* --enablerepo=*optional-rpms install git autoconf \
>   automake bison dos2unix flex fuse-devel glib2-devel libaio-devel \
>   libattr-devel libibverbs-devel librdmacm-devel libtool libxml2-devel lvm2-devel make \
>   openssl-devel pkgconfig pyliblzma python-devel python-eventlet python-netifaces \
>   python-paste-deploy python-simplejson python-sphinx python-webob pyxattr readline-devel \
>   rpm-build systemtap-sdt-devel tar libcmocka-devel

2,克隆GlusterFS git存储库

# git clone `[`git://git.gluster.org/glusterfs`](git://git.gluster.org/glusterfs)`

# cd glusterfs

3,选择要编译的分支。我线上都是3.3,所以我选3.4。

# git branch -a | grep release

# git checkout release-3.4

4,编译gluster

# ./autogen.sh

# ./configure --enable-fusermount

# make dist

5,创建rpm包。

# cd extras/LinuxRPM/
# make glusterrpms

6,完成。

# ls -artl | grep 'gluster' | awk '{print $NF}'
glusterfs-3.4git-1.el6.src.rpm
glusterfs-3.4git-1.el6.x86_64.rpm
glusterfs-libs-3.4git-1.el6.x86_64.rpm
glusterfs-cli-3.4git-1.el6.x86_64.rpm
glusterfs-rdma-3.4git-1.el6.x86_64.rpm
glusterfs-geo-replication-3.4git-1.el6.x86_64.rpm
glusterfs-fuse-3.4git-1.el6.x86_64.rpm
glusterfs-server-3.4git-1.el6.x86_64.rpm
glusterfs-api-3.4git-1.el6.x86_64.rpm
glusterfs-resource-agents-3.4git-1.el6.noarch.rpm
glusterfs-devel-3.4git-1.el6.x86_64.rpm
glusterfs-api-devel-3.4git-1.el6.x86_64.rpm
glusterfs-debuginfo-3.4git-1.el6.x86_64.rpm


【gluster管理】

1,glusterd:这个服务/进程必须在所有gluster上启动,充当弹性卷管理器,监督gluster进程并协调动态卷操作,比如添加,删除什么之类的。chkconfig glusterd on或echo 'glusterd' >> /etc/rc.local  设置开机自启动。

2,peer可信池TSP:默认端口24007,且必须启动glusterd守护进程。gluster peer help

    在gluster中,有可信池TSP<通过对等探测服务器来为volume提供brick,各服务器彼此对等>的概念,这个概念其实就是用于定义gluster中的一组节点的术语,只是为了标注一组设备在一组资源池中,不具有任何约束效力。在没有被加入volume之前,peer都是自由的<如果你愿意这么认为的话:)>,加入之后peer将仅属于由该服务器组成的存储池。同时peer也有集群的概念,即在一台设备上操作,会在其他服务器上自动同步执行相同的操作。像新建,添加啊,等等。

3,volume卷:卷是brick的逻辑集合,其中每个brick都是可信资源池中服务器上的导出目录,在创建卷之前,你需要设置将构成volume的brick。卷的类型:

    distributed分布式:在volume中的brick之间分发文件,不提供冗余。

    replicated复制:在volume中的brick之间复制文件,用于高可用环境。

    distributed replicated分布式复制:通过volume中的复制brick分布文件,用于高可用,高性能<读取表现明显>。

    dispersed分散:基于纠删码,为磁盘或服务器故障提供节省空间保护,将原始文件的编码片段存储到每个块中,只需要部分片段即可恢复原始文件,管理员在创建volume时配置可丢失的砖块数量,而不会丢失对数据的访问权限。

    distributed dispersed分布式分散:在分散的子卷上分发文件,与分发复制具有相同的优点,但使用分散将数据存储到砖块中。

    不再使用的类型:striped条带,distributed striped分布式条带,distributed striped replicated分布式条带化复制,striped replicated条带化复制。

4,brick:

    推荐的数据站点约定:/data/glusterfs///brick

5,ACL:gluster支持自定义ACL,允许为不同的用户或组分配不同的权限,以实现安全性访问。

6,gluster native client:在用户空间中运行的基于FUSE的客户端,也是高并发的推荐模式。安装及配置如下:

    a,将FUSE可加载内核模块LKM添加到linux内核

        # modprobe fuse

    b,确认模块已加载

        # dmesg | grep -i fuse
        fuse init (API version 7.13)
    b,

    



【概念及其他说明】

卷volume:brick的集合,文件系统操作发生在volume之上,gluster根据需求,支持不同类型的volume。如下:

    1,分布式卷:Distributed Glusterfs Volume ,默认的glusterfs卷,文件分布在volume中的brick上,如下边的命令,file只能存储在brick1或brick2或brick3中,但不能同时存储在两者中。

        glusterfs简单介绍_第1张图片

        创建示例:#gluster volume create test01 VM-CDS-COS-1:/data/brick1/volume0 VM-CDS-COS-2:/data/brick1/volume0 VM-CDS-COS-3:/data/brick1/volume0

        缺点:不支持数据冗余,brick故障将导致数据完全丢失,并且必须依靠底层硬件来保护数据丢失。

        优点:可以轻松便宜的缩放卷大小。

    2,复制卷:Replicated Glusterfs Volume,该卷文件通过指定的复制个数,分布在复制的多个brick上。如下边的命令,file将同时存储在brick1和brick2和brick3中。

        glusterfs简单介绍_第2张图片

        创建示例:# gluster volume create test01 replica 3 transport tcp VM-CDS-COS-1:/data/brick1/volume0 VM-CDS-COS-2:/data/brick1/volume0 VM-CDS-COS-3:/data/brick1/volume0

        优点:数据副本可以根据需求保留在对应的brick中,即使一个brick故障,也可以从其复制的brick访问数据,提升了可靠性和数据冗余。

    3,分布式复制卷:Distributed Replicated Glusterfs Volume ,该卷文件分布在复制的brick集合中。brick的数量必须是副本数的倍数。且按照相邻的brick的顺序,作为彼此的副本。

        glusterfs简单介绍_第3张图片

        创建示例:# gluster volume create test01 replica 2 transport tcp VM-CDS-COS-1:/data/brick1/volume0 VM-CDS-COS-2:/data/brick1/volume0

        优点:该卷用于需要由冗余和缩放引起的高可用性数据。

    4,条带卷:Striped Glusterfs Volume,该卷中数据在划分为不同的条带后,存储在brick中。所以大文件将被分为更小的块(相当于卷中的块数)每个块都被存储在一个块中。

        glusterfs简单介绍_第4张图片

        创建示例:#弃用了哦。


    5,分布式条带卷:Distributed Striped Glusterfs Volume ,与条带卷类似,不同在于条带可以分布在更多数据的brick上,brick的数量必须是条带的倍数。

        glusterfs简单介绍_第5张图片

        创建示例:#弃用了哦。

    6,


glusterFS是个用户空间文件系统,为了与内核VFS交互,glusterFS使用了FUSE。

    FUSE:File System in Userspace用户空间文件系统。是支持内核VFS<虚拟文件系统>和非特权用户应用程序之间交互<访问硬件>的内核模块,它具有可从用户空间访问的API。使用这个IP,任何类型的文件系统都可以使用几乎所有你喜好的语言编写。因为FUSE和其他语言之间有很多绑定。

    glusterfs简单介绍_第6张图片FUSE结构图。

1,编译为创建二进制“hello”的文件系统“hello world”。

2,hello文件系统挂载点/tmp/fuse。

3,用户在挂载点/tmp/fuse上发出一个命令ls -l /tmp/fuse

4,该命令通过glibc达到VFS,并且挂载点/mnt/fuse对应基于FUSE的文件系统,所以VFS将它传递给FUSE模块。

5,FUSE内核模块通过libuse<用户空间中的FUSE库>中的glibc和FUSE库<常规内核存储库>后,FUSE内核模块会联系实际的文件系统二进制文件“hello”。

6,文件系统二进制将结果从堆栈返回到FUSE内核模块,通过VFS返回,最后返回到ls -l命令。

FUSE内核模块和FUSE库(libfuse)之间的通信是通过打开/dev/fuse获得的特殊文件描述符实现的,该文件可以多次打开,并将获取的文件描述符传递给mount系统调用,以便将描述符与安装的文件系统进行匹配。

使用FUSE文件系统的例子:

  • SSHFS这是一个文件系统客户端,可以使用sftp在远程系统上挂载目录和文件并与其进行交互。用于安装远程文件系统的非常方便的文件系统。

  • archivemount该文件系统允许您将存档文件(如tar(.tar)或gzipped tar文件(.tar.gz))挂载到挂载点并与其进行交互,包括读取和写入。在解压缩和解压缩之前,检查.tar.gz文件的内容是一种非常酷的方式,尤其是在您只需要一个文件的情况下。它还允许您轻松操作和创建.tar.gz文件。

  • ZFS-Fuse此文件系统允许您在Linux下创建,安装,使用和管理ZFS文件系统。回想一下,ZFS的许可与GPL不兼容,因此ZFS与FUSE的接口将ZFS保持为在Linux上运行的用户空间应用程序,并且不会违反任何许可。所以如果你想在Linux上使用ZFS,这是你最好的选择。

  • CloudStore CloudStore是一个与 Hadoop Hypertable集成的分布式文件系统

  • GlusterFS这是一个高性能的分布式文件系统,它使用“转换器”的概念,允许您创建具有各种功能的文件系统,包括镜像和复制,分条,负载平衡,磁盘缓存,预读,写后传输,并自我修复。GlusterFS的优势之一是它不使用元数据,而是依赖于文件布局和底层文件系统的知识。

  • s3fs此FUSE文件系统允许您将 S3存储桶作为本地文件系统安装。Subcloud提供这种服务的商业支持。


translators:翻译器,将来自用户的请求转换为存储请求。

    可以实现的功能包括:

        a,将一种请求类型转换为另一种请求类型。如:修改路径,标志,数据加密等。

        b,拦截或组织请求,如访问控制等。

        c,产生新的请求,如数据预取等。

    gluster的translators可以细分为很多类别。但是有两个重要类别:Cluster and performance translators。

    数据/请求必须经历的最重要和第一翻译者之一是fuse translator,属于mount translators.

    cluster translators:

        *DHT(Distributed Hash Table)    分布式哈希表
        *AFR(Automatic File Replication)    自动文件复制

    performance translators:

        * io-cache    IO-缓存
        * io-threads    IO-线程
        * md-cache    MD-缓存
        * O-B (open behind)    后读取
        * QR (quick read)    快速读取
        * r-a (read-ahead)    预读取
        * w-b (write-behind)    后写入

    其他feature translators:

        * changelog 更新日志
        * locks     锁,使用AFR实现对文件或目录相互冲突的操作同步。
        * marker    标记
        * quota    配额

    调试translators: trace

DHT:Distributed Hash Table分布式哈希表。是gluster聚合多个服务器的容量和性能的核心。

    DHT的任务是将每个文件放置在其子卷的一个子卷上,与复制(将副本放置在其所有子卷上)或条带(将块放在其所有子卷上)不同,它是一个路由功能,不是复制或分割。

    DHT如何工作:使用的基本方法是一致的哈希。

    1,每个子体积(brick)在32位哈希空间内分配一个范围,覆盖整个范围,没有空洞或重叠。

    2,通过散列它的名字,每个文件在同一个空间中,也被分配一个值。恰好有一个brick会有一个指定的范围,包括文件的散列值。因此文件应该在brick上。但是很多情况下并非如此。比如:磁盘空间满了,brick的设置发生变化。

    3,当你打开一个文件时,分发翻译器会提供一条信息来查找文件名。为了确定文件的位置。翻译器通过哈希算法运行文件名,以便将该文件名转换为数字。

    DHT哈希值分配的一些现象:

    1,将散列范围分配给brick由存储在目录中的扩展属性确定,因此分布式目录特定的。

    2,一致性散列通常被认为是围绕这一个圆圈散列,但是在glusterFS中则更为线性。

    3,如果缺少一个brick,散列空间将出现漏洞。更糟糕的是,如果散列区域在brick离线时重新分配,则某些新的区域可能与存储在该brick上的(现在过期的)区域重叠,从而对文件应该存在的位置产生混淆。


AFR:automatic file  replication自动文件复制转换器

gluster中的自动文件复制转换器利用扩展属性来跟踪文件操作,它负责在brick之间复制数据。

AFR的职责:

    1,保证复制一致性。(即:只要副本的所有brick都启用,即使在多个应用程序并行发生在同一个文件/目录上的操作的情况下,两个brick上的数据也应该相同)

    2,只要存在至少一个具有正确数据的brick,就提供一种在发生故障时恢复数据的方法。

    3,为read/stat/readdir等提供新数据。

gluster支持的地域复制包括:LAN局域网复制,WAN广域网复制。


GFID:类似于inode,数据和meta fops记录执行操作的实体的GFID,从而记录inode上存在数据/元数据更改。输入fops最少要记录一组6或7条记录。用以确定实体经历的操作类型。通常这个记录包括实体的GFID,文件操作的类型(整数)和父GFID的基名。


glusterFS整体工作:

glusterfs简单介绍_第7张图片

1,只要安装了glusterFS,会创建一个gluster管理守护进程(glusterd)二进制文件,该守护进程应该在集群中的所有设备上运行。

2,启动glusterd后,可以创建一个由所有存储服务器节点组成的受信任的服务器池(TSP可以包含单个节点)

3,作为基本存储单元的brick可以再这些服务器中作为导出目录创建。

4,从这个TSP的任何数量的brick都可以被联合起来形成一个整体。

5,一旦创建了volume,glusterfsd进程就会开始在每个参与的brick中运行,除此之外,将在/var/lib/glusterd/vols/生成为vol文件的配置文件。

6,volume中将会有与每个brick对应的配置文件,文件中包含关于特定brick的所有内容。

7,客户端进程所需的配置文件也将被创建。

8,文件系统完成,挂载使用。

9,挂载的IP/主机名可以是受信任服务器池中创建所需volume的任何节点的IP/主机名。

10,当我们在客户端安装volume时,客户端glusterfs进程与服务器的glusterd进程进行通信。

11,服务器glusterd进程发送一个配置文件(vol)文件,其中包括客户端转换器列表,另一个包含volume中每个brick的信息。

12,借助于该文件,客户端glusterfs进程可以与每个brick的glusterfsd进行通信。

13,当挂载的文件系统中,客户端发出系统调用<文件操作或Fop或打开文件>时,

14,VFS识别文件系统类型为glusterfs,会将请求发送到FUSE内核模块。

15,FUSE内核模块将通过/dev/fuse将其发送到客户机节点的用户空间中的glusterFS。

16,客户端上的glusterFS进程由一堆成为客户端翻译器的翻译器组成。这些翻译器在存储服务器glusterd进程发送的配置文件(vol文件)中定义。

17,这些翻译器中的第一个由FUSE库(libfuse)组成的FUSE翻译器。

18,每个翻译器都具有与每个文件操作对应的功能或glusterfs支持的fop。

19,该请求将在每个翻译器中发挥相应的功能。

    FUSE翻译器

    DHT翻译器-将请求映射到包含所需文件或目录的正确brick。

    AFR翻译器-接受来自前一个翻译器的请求,并且如果卷类型是复制的,它将复制请求并将其传递个副本的协议客户端翻译器。

    协议客户端翻译器-是客户端翻译器堆栈中的最后一个,该翻译器分为多个线程,每个线程用于volume中的每个块,这将直接与每个brick的glusterfsd通信。

20,在包含需要的brick的存储服务器节点中,请求再次通过一系列成为服务器翻译器的翻译器,主要的翻译器是:

    协议服务器翻译器

    POSIX翻译器。

21,该请求将最终到达VFS,然后将与底层本机文件系统通信。

22,响应将回溯相同的路径。




【日志说明】


【参考文件】

维基百科:https://en.wikipedia.org/wiki/Gluster

gluster文档中心:https://docs.gluster.org/en/latest/

posix解说:http://www.cnblogs.com/weiweishuo/p/3222995.html

FUSE说明:http://www.linux-mag.com/id/7814/