GlusterFS集群文件系统基础与实践

1、GlusterFS文件系统和架构的介绍

1)、GlusterFS文件系统简介及优点

         GlusterFS是Scale-Out存储解决方案Gluster的核心,它是一个开源的分布式文件系统,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。

         GlusterFS借助TCP/IP或InfiniBand RDMA网络将物理分布的存储资源聚集在一起,使用单一全局命名空间来管理数据。

         GlusterFS基于可堆叠的用户空间设计,可为各种不同的数据负载提供优异的性能。

         GlusterFS支持运行在任何标准IP网络上标准应用程序的标准客户端,用户可以在全局统一的命名空间中使用NFS/CIFS等标准协议来访问应用数据。

         GlusterFS使得用户可摆脱原有的独立、高成本的封闭存储系统,能够利用普通廉价的存储设备来部署可集中管理、横向扩展、虚拟化的存储池,存储容量可扩展至TB/PB级。

GlusterFS主要特征如下:

 GlusterFS集群文件系统基础与实践_第1张图片          

2)、架构与设计原理 

         GlusterFS架构设计与组成部分,下图所示,它主要由存储服务器(Brick Server)、客户端以及NFS/Samba存储网关组成。其最大的设计优点:GlusterFS架构中没有元数据服务器组件,对于提升整个系统的性能、可靠性和稳定性都有着决定性的意义。GlusterFS支持TCP/IP和InfiniBand RDMA高速网络互联,客户端可通过原生Glusterfs协议访问数据,其他没有运行GlusterFS客户端的终端可通过NFS/CIFS标准协议通过存储网关访问数据。

         存储服务器主要提供基本的数据存储功能,最终的文件数据通过统一的调度策略分布在不同的存储服务器上。它们上面运行着Glusterfsd进行,负责处理来自其他组件的数据服务请求,数据以原始格式直接存储在服务器的本地文件系统上,如EXT3、EXT4、XFS、ZFS等,运行服务时指定数据存储路径。多个存储服务器可以通过客户端或存储网关上的卷管理器组成集群,如Stripe(RAID0)、Replicate(RAID1)和DHT(分布式Hash)存储集群,也可利用嵌套组合构成更加复杂的集群,如RAID10。

        由于没有了元数据服务器,客户端承担了更多的功能,包括数据卷管理、I/O调度、文件定位、数据缓存等功能。客户端上运行Glusterfs进程,它实际是Glusterfsd的符号链接,利用FUSE(File system in User Space)模块将GlusterFS挂载到本地文件系统之上,实现POSIX兼容的方式来访问系统数据。在新的3.1.X版本中,客户端不再需要独立维护卷配置信息,改成自动从运行在网关上的glusterd弹性卷管理服务进行获取和更新,极大简化了卷管理。GlusterFS客户端负载相对传统分布式文件系统要高,包括CPU占用率和内存占用。

        GlusterFS存储网关提供弹性卷管理和NFS/CIFS访问代理功能,其上运行Glusterd和Glusterfs进程,两者都是Glusterfsd符号链接。卷管理器负责逻辑卷的创建、删除、容量扩展与缩减、容量平滑等功能,并负责向客户端提供逻辑卷信息及主动更新通知功能等。GlusterFS 3.1.X实现了逻辑卷的弹性和自动化管理,不需要中断数据服务或上层应用业务。对于Windows客户端或没有安装GlusterFS的客户端,需要通过NFS/CIFS代理网关来访问,这时网关被配置成NFS或Samba服务器。相对原生客户端,网关在性能上要受到NFS/Samba的制约。

GlusterFS架构与设计如下图:

         GlusterFS集群文件系统基础与实践_第2张图片

      GlusterFS是模块化堆栈式的架构设计,模块称为Translator,是GlusterFS提供的一种强大机制,借助这种良好定义的接口可以高效简便地扩展文件系统的功能。

       优点:

       服务端与客户端模块接口是兼容的,同一个translator可同时在两边加载。每个translator都是SO动态库,运行时根据配置动态加载;

       每个模块实现特定基本功能,GlusterFS中所有的功能都是通过translator实现,比如Cluster, Storage, Performance, Protocol, Features等,基本简单的模块可以通过堆栈式的组合来实现复杂的功能;

       这一设计思想借鉴了GNU/Hurd微内核的虚拟文件系统设计,可以把对外部系统的访问转换成目标系统的适当调用。大部分模块都运行在客户端,比如合成器、I/O调度器和性能优化等,服务端相对简单许多。客户端和存储服务器均有自己的存储栈,构成了一棵Translator功能树,应用了若干模块。模块化和堆栈式的架构设计,极大降低了系统设计复杂性,简化了系统的实现、升级以及系统维护。

模块化堆栈式的架构设计如下图:

       

3)、GlusterFS架构设计特点对比

  • 无元数据服务器 vs 元数据服务器

        无元数据服务器设计的好处是没有单点故障和性能瓶颈问题,可提高系统扩展性、性能、可靠性和稳定性。对于海量小文件应用,这种设计能够有效解决元数据的难点问题。它的负面影响是,数据一致问题更加复杂,文件目录遍历操作效率低下,缺乏全局监控管理功能。同时也导致客户端承担了更多的职能,比如文件定位、名字空间缓存、逻辑卷视图维护等等,这些都增加了客户端的负载,占用相当的CPU和内存。

  • 用户空间 vs 内核空间

        用户空间实现起来相对要简单许多,对开发者技能要求较低,运行相对安全。用户空间效率低,数据需要多次与内核空间交换,另外GlusterFS借助FUSE来实现标准文件系统接口,性能上又有所损耗。内核空间实现可以获得很高的数据吞吐量,缺点是实现和调试非常困难,程序出错经常会导致系统崩溃,安全性低。纵向扩展上,内核空间要优于用户空间,GlusterFS有横向扩展能力来弥补。

  • 堆栈式 vs 非堆栈式

        GlusterFS堆栈式设计思想源自GNU/Hurd微内核操作系统,具有很强的系统扩展能力,系统设计实现复杂性降低很多,基本功能模块的堆栈式组合就可以实现强大的功能。查看GlusterFS卷配置文件我们可以发现,translator功能树通常深达10层以上,一层一层进行调用,效率可见一斑。非堆栈式设计可看成类似Linux的单一内核设计,系统调用通过中断实现,非常高效。后者的问题是系统核心臃肿,实现和扩展复杂,出现问题调试困难。

  • 原始存储格式 vs 私有存储格式

        GlusterFS使用原始格式存储文件或数据分片,可以直接使用各种标准的工具进行访问,数据互操作性好,迁移和数据管理非常方便。然而,数据安全成了问题,因为数据是以平衡的方式保存的,接触数据的人可以直接复制和查看。这对很多应用显然是不能接受的,比如云存储系统,用户特别关心数据安全,这也是影响公有云存储发展的一个重要原因。私有存储格式可以保证数据的安全性,即使泄露也是不可知的。GlusterFS要实现自己的私有格式,在设计实现和数据管理上相对复杂一些,也会对性能产生一定影响。

  • 大文件 vs 小文件

        GlusterFS适合大文件还是小文件存储?弹性哈希算法和Stripe数据分布策略,移除了元数据依赖,优化了数据分布,提高数据访问并行性,能够大幅提高大文件存储的性能。对于小文件,无元数据服务设计解决了元数据的问题。但GlusterFS并没有在I/O方面作优化,在存储服务器底层文件系统上仍然是大量小文件,本地文件系统元数据访问是一个瓶颈,数据分布和并行性也无法充分发挥作用。因此,GlusterFS适合存储大文件,小文件性能较差,还存在很大优化空间。

  • 可用性 vs 存储利用率

        GlusterFS使用复制技术来提供数据高可用性,复制数量没有限制,自动修复功能基于复制来实现。可用性与存储利用率是一个矛盾体,可用性高存储利用率就低,反之亦然。采用复制技术,存储利用率为1/复制数,镜像是50%,三路复制则只有33%。其实,可以有方法来同时提高可用性和存储利用率,比如RAID5的利用率是(n-1)/n,RAID6是(n-2)/n,而纠删码技术可以提供更高的存储利用率。但是,鱼和熊掌不可得兼,它们都会对性能产生较大影响。

4)、GlusterFS与传统存储系统或现有其他分布式文件系统比较

  • 完全软件实现(Software Only)

        GlusterFS认为存储是软件问题,不能够把用户局限于使用特定的供应商或硬件配置来解决。GlusterFS采用开放式设计,广泛支持工业标准的存储、网络和计算机设备,而非与定制化的专用硬件设备捆绑。对于商业客户,GlusterFS可以以虚拟装置的形式交付,也可以与虚拟机容器打包,或者是公有云中部署的映像。开源社区中,GlusterFS被大量部署在基于廉价闲置硬件的各种操作系统上,构成集中统一的虚拟存储资源池。简而言之,GlusterFS是开放的全软件实现,完全独立于硬件和操作系统。

  • 完整的存储操作系统栈(Complete Storage)

       GlusterFS不仅提供了一个分布式文件系统,而且还提供了许多其他重要的分布式功能,比如分布式内存管理、I/O调度、软RAID和自我修复等。GlusterFS汲取了微内核架构的经验教训,借鉴了GNU/Hurd操作系统的设计思想,在用户空间实现了完整的存储操作系统栈。

  • 用户空间实现(User Space)

        与传统的文件系统不同,GlusterFS在用户空间实现,这使得其安装和升级特别简便。另外,这也极大降低了普通用户基于源码修改GlusterFS的门槛,仅仅需要通用的C程序设计技能,而不需要特别的内核编程经验。模块化堆栈式架构(Modular Stackable ArchGlusterFS采用模块化、堆栈式的架构,可通过灵活的配置支持高度定制化的应用环境,比如大文件存储、海量小文件存储、云存储、多传输协议应用等。每个功能以模块形式实现,然后以积木方式进行简单的组合,即可实现复杂的功能。比如,Replicate模块可实现RAID1,Stripe模块可实现RAID0,通过两者的组合可实现RAID10和RAID01,同时获得高性能和高可靠性。

  • 原始数据格式存储(Data Stored in Native)

        GlusterFS以原始数据格式(如EXT3、EXT4、XFS、ZFS)储存数据,并实现多种数据自动修复机制。因此,系统极具弹性,即使离线情形下文件也可以通过其他标准工具进行访问。如果用户需要从GlusterFS中迁移数据,不需要作任何修改仍然可以完全使用这些数据。

  • 无元数据服务设计(No Metadata with the Elastic Hash Algorithm)

        对Scale-Out存储系统而言,最大的挑战之一就是记录数据逻辑与物理位置的映像关系,即数据元数据,可能还包括诸如属性和访问权限等信息。传统分布式存储系统使用集中式或分布式元数据服务来维护元数据,集中式元数据服务会导致单点故障和性能瓶颈问题,而分布式元数据服务存在性能负载和元数据同步一致性问题。特别是对于海量小文件的应用,元数据问题是个非常大的挑战。

        GlusterFS独特地采用无元数据服务的设计,取而代之使用算法来定位文件,元数据和数据没有分离而是一起存储。集群中的所有存储系统服务器都可以智能地对文件数据分片进行定位,仅仅根据文件名和路径并运用算法即可,而不需要查询索引或者其他服务器。这使得数据访问完全并行化,从而实现真正的线性性能扩展。无元数据服务器极大提高了GlusterFS的性能、可靠性和稳定性。

2、GlusterFS弹性哈希算法和集群方式

      GlusterFS使用弹性哈希算法代替传统分布式文件系统中的集中或分布式元数据服务。GlusterFS使用算法进行数据定位,集群中的任何服务器和客户端只需根据路径和文件名就可以对数据进行定位和读写访问。GlusterFS不需要将元数据与数据进行分离,因为文件定位可独立并行化进行。

GlusterFS中数据访问流程如下:

      计算hash值,输入参数为文件路径和文件名==>>根据hash值在集群中选择子卷(存储服务器),进行文件定位==>>对所选择的子卷进行数据访问

      数据访问流程分解:

      1)、GlusterFS目前使用Davies-Meyer算法计算文件名hash值,获得一个32位整数。Davies-Meyer算法具有非常好的hash分布性,计算效率很高。假设逻辑卷中的存储服务器有N个,则32位整数空间被平均划分为N个连续子空间,每个空间分别映射到一个存储服务器。这样,计算得到的32位hash值就会被投射到一个存储服务器,即我们要选择的子卷。

      2)、存储节点加入和删除、文件改名等情况,GlusterFS如何解决这些问题而具备弹性的呢?逻辑卷中加入一个新存储节点,如果不作其他任何处理,hash值映射空间将会发生变化,现有的文件目录可能会被重新定位到其他的存储服务器上,从而导致定位失败。

               GlusterFS采用上哈希分布是以目录为基本单位的,文件的父目录利用扩展属性记录了子卷映射信息,其下面子文件目录在父目录所属存储服务器中进行分布。由于文件目录事先保存了分布信息,因此新增节点不会影响现有文件存储分布,它将从此后的新创建目录开始参与存储分布调度。这种设计,新增节点不需要移动任何文件,但是负载均衡没有平滑处理,老节点负载较重。GlusterFS在设计中考虑了这一问题,在新建文件时会优先考虑容量负载最轻的节点,在目标存储节点上创建文件链接直向真正存储文件的节点。另外,GlusterFS弹性卷管理工具可以在后台以人工方式来执行负载平滑,将进行文件移动和重新分布,此后所有存储服务器都会均会被调度。

               GlusterFS目前对存储节点删除支持有限,还无法做到完全无人干预的程度。如果直接删除节点,那么所在存储服务器上的文件将无法浏览和访问,创建文件目录也会失败。当前人工解决方法有两个,一是将节点上的数据重新复制到GlusterFS中,二是使用新的节点来替换删除节点并保持原有数据。

               如果一个文件被改名,显然hash算法将产生不同的值,非常可能会发生文件被定位到不同的存储服务器上,从而导致文件访问失败。采用数据移动的方法,对于大文件是很难在实时完成的。为了不影响性能和服务中断,GlusterFS采用了文件链接来解决文件重命名问题,在目标存储服务器上创建一个链接指向实际的存储服务器,访问时由系统解析并进行重定向。另外,后台同时进行文件迁移,成功后文件链接将被自动删除。对于文件移动也作类似处理,好处是前台操作可实时处理,物理数据迁移置于后台选择适当时机执行。 

    GlusterFS弹性哈希算法为文件分配逻辑卷,那么GlusterFS如何为逻辑卷分配物理卷呢?

    GlusterFS3.1.X实现了真正的弹性卷管理,如下图。存储卷是对底层硬件的抽象,可以根据需要进行扩容和缩减,以及在不同物理系统之间进行迁移。存储服务器可以在线增加和移除,并能在集群之间自动进行数 据负载平衡,数据总是在线可用,没有应用中断。文件系统配置更新也可以在线执行,所作配置变动能够快速动态地在集群中传播,从而自动适应负载波动和性能调优。

    GlusterFS弹性哈希算法本身并没有提供数据容错功能,GlusterFS使用镜像或复制来保证数据可用性,推荐使用镜像或3路复制。

  复制模式下,存储服务器使用同步写复制到其他的存储服务器,单个服务器故障完全对客户端透明。此外,GlusterFS没有对复制数量进行限制,读被分散到所有的镜像存储节点,可以提高读性能。弹性哈希算法分配文件到唯一的逻辑卷,而复制可以保证数据至少保存在两个不同存储节点,两者结合使得GlusterFS具备更高的弹性。

   GlusterFS集群文件系统基础与实践_第3张图片

3、GlusterFS扩展机制Translators

      Translators是GlusterFS提供的一种强大文件系统功能扩展机制,这一设计思想借鉴于GNU/Hurd微内核操作系统。GlusterFS中所有的功能都通过Translator机制实现,运行时以动态库方式进行加载,服务端和客户端相互兼容。

      GlusterFS 3.1.X中,主要包括以下几类Translator:

      Cluster :存储集群分布,目前有AFR, DHT, Stripe三种方式(下面重点阐述这三种方式)

      Debug :跟踪GlusterFS内部函数和系统调用

      Encryption :简单的数据加密实现

      Features :访问控制、锁、Mac兼容、静默、配额、只读、回收站等

      Mgmt :弹性卷管理

      Mount :FUSE接口实现

      Nfs :内部NFS服务器

      Performance :io-cache, io-threads, quick-read, read-ahead, stat-prefetch, sysmlink-cache, write-behind等性能优化

      Protocol :服务器和客户端协议实现

     Storage :底层文件系统POSIX接口实现

     Cluster Translators实现GlusterFS集群存储的核心,包括:AFR(Automatic File Replication)、DHT(Distributed Hash Table)和Stripe三种类型。

     AFR相当于RAID1,同一文件在多个存储节点上保留多份,主要用于实现高可用性以及数据自动修复。AFR所有子卷上具有相同的名字空间,查找文件时从第一个节点开始,直到搜索成功或最后节点搜索完毕。读数据时,AFR会把所有请求调度到所有存储节点,进行负载均衡以提高系统性能。写数据时,首先需要在所有锁服务器上对文件加锁,默认第一个节点为锁服务器,可以指定多个。然后,AFR以日志事件方式对所有服务器进行写数据操作,成功后删除日志并解锁。AFR会自动检测并修复同一文件的数据不一致性,它使用更改日志来确定好的数据副本。自动修复在文件目录首次访问时触发,如果是目录将在所有子卷上复制正确数据,如果文件不存则创建,文件信息不匹配则修复,日志指示更新则进行更新。

     DHT即上面所介绍的弹性哈希算法,它采用hash方式进行数据分布,名字空间分布在所有节点上。查找文件时,通过弹性哈希算法进行,不依赖名字空间。但遍历文件目录时,则实现较为复杂和低效,需要搜索所有的存储节点。单一文件只会调度到唯一的存储节点,一旦文件被定位后,读写模式相对简单。DHT不具备容错能力,需要借助AFR实现高可用性, 如下图所示:

     GlusterFS集群文件系统基础与实践_第4张图片

     Stripe相当于RAID0,即分片存储,文件被划分成固定长度的数据分片以Round-Robin轮转方式存储在所有存储节点。Stripe所有存储节点组成完整的名字空间,查找文件时需要询问所有节点,这点非常低效。读写数据时,Stripe涉及全部分片存储节点,操作可以在多个节点之间并发执行,性能非常高。Stripe通常与AFR组合使用,构成RAID10/RAID01,同时获得高性能和高可用性,当然存储利用率会低于50%。

4、GlusterFS卷类型管理

1)、GlusterFS可创建五种类型volume:

         GlusterFS创建volume语法:

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

         选项简明:

         NEW-VOLNAME为volume的名字;

         COUNT分别为stripe,replica的个数;

         transport为传输类型(tcp/rdma);

          ...为brick列表,具体形式为HOME:PATH

  •   Distributed:分布式卷,文件通过hash算法随机的分布到由bricks组成的卷上。

          #gluster volume create cluster-volume server1:/exp1 server2:/exp2 

  •   Replicated:复制式卷,类似raid1,replica数必须等于volume中brick所包含的存储服务器数,可用性高。

          # gluster volume create cluster-volume replica 2 transport tcp server1:/exp1 server2:/exp2

  •   Striped:条带式卷,类似与raid0,stripe数必须等于volume中brick所包含的存储服务器数,文件被分成数据块,以Round Robin的方式存储在bricks中,并发粒度是数据块,大文件性能好。

          # gluster volume create cluster-volume stripe 2 transport tcp server1:/exp1 server2:/exp2

  •   Distributed Striped:分布式的条带卷,volume中brick所包含的存储服务器数必须是stripe的倍数(>=2倍),兼顾分布式和条带式的功能。

          # gluster volume create cluster-volume stripe 4 transport tcp server1:/exp1 server2:/exp2

  •   Distributed Replicated:分布式的复制卷,volume中brick所包含的存储服务器数必须是 replica 的倍数(>=2倍),兼顾分布式和复制式的功能。

          # gluster volume create cluster-volume replica 2 transport tcp server1:/exp1 server2:/exp2

2)、GlusterFS卷维护

  •   启动/停止/删除卷

          # gluster volume start

          # gluster volume stop

          # gluster volume delete

          注意:删除卷的前提是先停止卷。

  •   查看卷信息

          列出集群中的所有卷:

         # gluster volume list

         查看集群中的卷信息:

         # gluster volume info [all]

         查看集群中的卷状态:

         # gluster volume status [all]

         # gluster volume status [detail| clients | mem | inode | fd]

        查看本节点的文件系统信息:

        # df -h []

        查看本节点的磁盘信息:

        # fdisk -l

  • 配置卷

        # gluster volume set

  • 扩展卷

        # gluster volume add-brick

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

  • 收缩卷

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

        # gluster volume remove-brick start

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

        # gluster volume remove-brick status

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

       # gluster volume remove-brick commit

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

  • 迁移卷

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

        # gluster volume replace-brick start

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

        # gluster volume replace-brick pause

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

        # gluster volume replace-brick abort

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

        # gluster volume replace-brick status

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

        # gluster volume replace-brick commit

  • 重新均衡卷

        不迁移数据:

        # gluster volume rebalance lay-outstart

        # gluster volume rebalance start

        # gluster volume rebalance startforce

        # gluster volume rebalance status

        # gluster volume rebalance stop

  • 配额管理

       开启/关闭系统配额:

       # gluster volume quota enable | disable

       设置目录配额:

       # gluster volume quota limit-usage

       查看配额:

       # gluster volume quota list [

]

       地域复制(geo-replication):

      # gluster volume geo-replication start | status | stop

      IO信息查看:

     # gluster volume profile start | info | stop

3)、GlusterFS监测

          Top命令允许你查看Brick的性能,例如:read,write, file open calls, file read calls, file write calls, directory opencalls, and directory real calls。所有的查看都可以设置 top数,默认100。

          查看打开的 fd:

          # gluster volume top open[brick ] [list-cnt ],其中,open可以替换为read, write, opendir, readdir等。

          查看每个 Brick 的读性能:

         # gluster volume top read-perf [bs count ] [brick ] [list-cnt ],其中read-perf可以替换为write-perf等。


*********************搭建GlusterFS集群*******************************

一、实践要求:

  1、2台服务器,各个添加新的硬盘vdb,组成一个2节点集群

  2、1台测试客户端存储到文件系统中

  3、硬盘空间不合并,为确保数据安全,互为副本(类似raid1)

  4、创建4个brick(哈希复制卷)

 示意图:

  

二、环境基础要求:

  操作系统:centos 6.7

  GlusterFS版本:3.7.14

  节点服务器01:ip/192.168.2.5 主机名:node1,新增一块sdb硬盘(未格式化)

  节点服务器02:ip/192.168.2.6 主机名:node2,新增一块sdb硬盘(未格式化)

  测试客户端:ip/192.168.2.9 主机名:lvs

  所有服务器关闭防火墙,SElinux

  修改hosts文件,能够互相解析:

  192.168.2.5  node1

  192.168.2.6  node2

  192.168.2.9  lvs

  配置NTP服务器同步,在crontab脚本里面,添加一个定时任务:

  30 * * * * root /usr/sbin/ntpdate 132.163.4.103 #每30分钟同步一次

  所有服务器增加配置glusterfs外部源和epel源:

  #cd /etc/yum.repos.d/
  #wget http://download.gluster.org/pub/gluster/glusterfs/3.7/LATEST/EPEL.repo/glusterfs-epel.repo
  #wget http://mirrors.neusoft.edu.cn/epel//6/x86_64/epel-release-6-8.noarch.rpm
  #rpm -ivh epel-release-6-8.noarch.rpm


  查看新添加的sdb硬盘

 

三、node1和node2服务器硬盘分区、格式化并挂载

  1、格式sdb硬盘建一个分区并把分区类型改为8e(LVM)

   

 [root@node1 ~]# fdisk /dev/sdb
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').
Command (m for help): n          #新建分区
Command action
   e   extended
   p   primary partition (1-4)
p                                            #建立主分区
Partition number (1-4): 1        
First cylinder (1-2610, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): 
Using default value 2610
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e         #改分区类型为lvm
Changed system type of partition 1 to 8e (Linux LVM)
Command (m for help): w                      # 保存退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.


  2、创建PV(物理卷)

     [root@node1 ~]# pvcreate /dev/sdb1 
     Physical volume "/dev/sdb1" successfully created


  3、创建VG(卷组)

     [root@node1 ~]# vgcreate vgFS /dev/sdb1
     Volume group "vgFS" successfully created


  4、创建LV(逻辑卷)

     [root@node1 ~]# lvcreate -n lvFS -L 10G /dev/vgFS
     Logical volume "lvFS" created.


  5、检查新建逻辑卷LV和卷组VG信息

[root@node1 ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/vgFS/lvFS
  LV Name                lvFS
  VG Name                vgFS
  LV UUID                au1T0Z-Tpwj-5lBW-tJWi-5p8H-wsMl-mIXIPc
  LV Write Access        read/write
  LV Creation host, time node1, 2016-08-23 16:41:32 +0800
  LV Status              available
  # open                 0
  LV Size                10.00 GiB
  Current LE             2560
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:3
   
[root@node1 ~]# vgdisplay 
  --- Volume group ---
  VG Name               vgFS
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               19.99 GiB
  PE Size               4.00 MiB
  Total PE              5118
  Alloc PE / Size       2560 / 10.00 GiB
  Free  PE / Size       2558 / 9.99 GiB
  VG UUID               2fJY06-pt2M-nube-VVGP-8QMS-8BKJ-UE9w6y


  6、格式化并挂载lvFS

  1)、格式化

[root@node1 ~]# mkfs.ext4 /dev/vgFS/lvFS 
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2684354560
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Writing inode tables: done                            
Creating journal (32768 blocks): 
done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 21 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.


  2)、挂载

[root@node1 ~]# mkdir -p /data/glusterFS   #创建挂载目录
[root@node1 ~]# mount /dev/vgFS/lvFS /data/glusterFS/   #lvFS挂载至新创建目录
[root@node1 ~]# df -h
Filesystem                  Size  Used Avail Use% Mounted on
/dev/mapper/my001-LogVol01  9.5G  1.1G  8.0G  12% /
tmpfs                       379M  228K  379M   1% /dev/shm
/dev/sda1                   477M   70M  382M  16% /boot
/dev/mapper/my001-LogVol02   18G  5.1G   12G  31% /usr
/dev/sr0                    3.7G  3.7G     0 100% /media/CentOS_6.7_Final
/dev/mapper/vgFS-lvFS       9.8G   23M  9.2G   1% /data/glusterFS


  注意:设置开机自动自动挂载

  [root@node1 ~]# echo '/dev/vgFS/lvFS /data/glusterFS/ ext4 defaults 0 0' >> /etc/fstab


===========以下为node2节点sdb硬盘分区、格式化并挂载同上node1操作===========

  1、格式sdb硬盘建一个分区并把分区类型改为8e(LVM)

 

   [root@node2 ~]# fdisk /dev/sdb
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').
Command (m for help): n          #新建分区
Command action
   e   extended
   p   primary partition (1-4)
p                                            #建立主分区
Partition number (1-4): 1        
First cylinder (1-2610, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): 
Using default value 2610 
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e         #改分区类型为lvm
Changed system type of partition 1 to 8e (Linux LVM)
Command (m for help): w                      # 保存退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.


  2、创建PV(物理卷)

     [root@node2 ~]# pvcreate /dev/sdb1 
     Physical volume "/dev/sdb1" successfully created


  3、创建VG(卷组)

     [root@node2 ~]# vgcreate vgFS /dev/sdb1
     Volume group "vgFS" successfully created


  4、创建LV(逻辑卷)

 

    [root@node2 ~]# lvcreate -n lvFS -L 10G /dev/vgFS
     Logical volume "lvFS" created.


  5、检查新建逻辑卷LV和卷组VG信息

[root@node2 ~]# vgdisplay 
  --- Volume group ---
  VG Name               vgFS
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               19.99 GiB
  PE Size               4.00 MiB
  Total PE              5118
  Alloc PE / Size       2560 / 10.00 GiB
  Free  PE / Size       2558 / 9.99 GiB
  VG UUID               JT7cUj-UG2n-XMkp-zTSC-RT2l-kIn0-p79lEH
[root@node2 ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/vgFS/lvFS
  LV Name                lvFS
  VG Name                vgFS
  LV UUID                Wur9ho-fPPD-RQYF-b1eS-x06a-F4Mk-XduteB
  LV Write Access        read/write
  LV Creation host, time node2, 2016-08-23 22:06:52 +0800
  LV Status              available
  # open                 0
  LV Size                10.00 GiB
  Current LE             2560
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:3


  6、格式化并挂载lvFS

  1)、格式化

[root@node1 ~]# mkfs.ext4 /dev/vgFS/lvFS 
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2684354560
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Writing inode tables: done                            
Creating journal (32768 blocks): 
done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 21 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.


  2)、挂载

[root@node1 ~]# mkdir -p /data/glusterFS   #创建挂载目录
[root@node1 ~]# mount /dev/vgFS/lvFS /data/glusterFS/   #lvFS挂载至新创建目录
[root@node2 ~]# df -h
Filesystem                  Size  Used Avail Use% Mounted on
/dev/mapper/my001-LogVol01  9.5G  3.6G  5.5G  40% /
tmpfs                       379M   68K  379M   1% /dev/shm
/dev/sda1                   477M   37M  416M   9% /boot
/dev/mapper/my001-LogVol02   18G  413M   17G   3% /var
/dev/mapper/vgFS-lvFS       9.8G   23M  9.2G   1% /data/glusterFS


  注意:设置开机自动自动挂载

  [root@node2 ~]# echo '/dev/vgFS/lvFS /data/glusterFS/ ext4 defaults 0 0' >> /etc/fstab


四、服务端node1安装glusterfs(GlusterFS是无中心化)服务,并设置自启动

[root@node1 ~]# yum -y install glusterfs-server


[root@node1 ~]# chkconfig glusterd on
[root@node1 ~]# service glusterd start
Starting glusterd:                                         [  OK  ]


GlusterFS集群文件系统基础与实践_第5张图片

    注:node2、lvs(客户端)服务器也按以上步骤安装

[root@node2 ~]# yum -y install glusterfs-server
[root@node2 ~]# chkconfig glusterd on
[root@node2 ~]# service glusterd start
Starting glusterd:                                         [  OK  ]


wKioL1e-mvuwqYkOAABHyAA-t_g154.jpg-wh_50

[root@lvs ~]# yum -y install glusterfs-server
[root@lvs ~]# chkconfig glusterd on
[root@lvs ~]# service glusterd start
Starting glusterd:                                         [  OK  ]


五、node1节点添加集群

[root@node1 ~]# gluster peer status
Number of Peers: 0
[root@node1 ~]# gluster peer probe node2
peer probe: success. 
[root@node1 ~]# gluster peer status
Number of Peers: 1
Hostname: node2
Uuid: f4a8c8b7-e025-4046-919c-e2c41292fbec
State: Peer in Cluster (Connected)


六、node1创建Gluster Volume卷,并启动

[root@node1 ~]#gluster volume create glusterFS01 node1:/data/glusterFS node2:/data/glusterFS force
volume create: glusterFS01: success: please start the volume to access data
You have new mail in /var/spool/mail/root


 注:这里建立卷时没有指明上述模式:Stripe(RAID0)、Replicate(RAID1)和DHT(分布式Hash)的其中一种,默认为DHT模式,命令为2个为一组建立replica卷,类似RAID1;force为强制创建,glusterFS01为Gluster Volume卷名

[root@node1 ~]#gluster volume start glusterFS01  #启动卷
volume start: glusterFS01: success
[root@node1 ~]# gluster volume status  #查看卷状态
Status of volume: glusterFS01
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick node1:/data/glusterFS                 49152     0          Y       7749 
Brick node2:/data/glusterFS                 49152     0          Y       4076 
NFS Server on localhost                     2049      0          Y       7769 
NFS Server on node2                         2049      0          Y       4099 
 
Task Status of Volume glusterFS01
------------------------------------------------------------------------------
There are no active volume tasks


GlusterFS集群文件系统基础与实践_第6张图片

七、测试:分别在node1和node2节点/data/glusterFS目录下,创建文件node1.py和node2.py

[root@node1 glusterFS]# touch node1.py
[root@node1 glusterFS]# ls
lost+found  node1.py
[root@node2 glusterFS]# touch node2.py
[root@node2 glusterFS]# ls
lost+found  node2.py


    疑问:为啥没有同步呢?因为DHT模式(见上描述),集群各个节点间数据信息是不同的

八、模拟实验移除节点node2卷和再重新添加节点node2卷

    注:添加、删除可在任意一个gluster服务端节点上的操作

[root@node1 ~]# gluster volume remove-brick glusterFS01 node2:/data/glusterFS/ force  #移除
Removing brick(s) can result in data loss. Do you want to Continue? (y/n) y
volume remove-brick commit force: success
[root@node1 ~]# gluster volume status
Status of volume: glusterFS01
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick node1:/data/glusterFS                 49152     0          Y       7749 
NFS Server on localhost                     2049      0          Y       8076 
NFS Server on node2                         2049      0          Y       4364 
 
Task Status of Volume glusterFS01
------------------------------------------------------------------------------
There are no active volume tasks


GlusterFS集群文件系统基础与实践_第7张图片

[root@node1 ~]# gluster volume add-brick glusterFS01 node2:/data/glusterFS force  #添加
volume add-brick: success
[root@node1 ~]# gluster volume status
Status of volume: glusterFS01
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick node1:/data/glusterFS                 49152     0          Y       7749 
Brick node2:/data/glusterFS                 49152     0          Y       4396 
NFS Server on localhost                     2049      0          Y       8122 
NFS Server on node2                         2049      0          Y       4417 
 
Task Status of Volume glusterFS01
------------------------------------------------------------------------------
There are no active volume tasks


通过客户端服务器测试

[root@lvs yum.repos.d]# service glusterfsd start  #启动服务
[root@lvs yum.repos.d]# mount -t glusterfs 192.168.2.5:/glusterFS01 /mnt/  #新建glusterFS01挂载至mnt
[root@lvs yum.repos.d]# cd /mnt
[root@lvs mnt]# ll   #可以查看客户端可以看到node1和node2产生的文件node1.py、node2.py
总用量 4
drwx------ 2 root root 4096 8月  23 22:10 lost+found
-rw-r--r-- 1 root root    0 8月  24 00:14 node1.py
-rw-r--r-- 1 root root    0 8月  24 00:14 node2.py
[root@lvs mnt]# touch vlFS{1..10}.py  #
[root@lvs mnt]# ll
总用量 4
drwx------ 2 root root 4096 8月  23 22:10 lost+found
-rw-r--r-- 1 root root    0 8月  24 00:14 node1.py
-rw-r--r-- 1 root root    0 8月  24 00:14 node2.py
-rw-r--r-- 1 root root    0 8月  25 00:09 vlFS10.py
-rw-r--r-- 1 root root    0 8月  25 00:09 vlFS1.py
-rw-r--r-- 1 root root    0 8月  25 00:09 vlFS2.py
-rw-r--r-- 1 root root    0 8月  25 00:09 vlFS3.py
-rw-r--r-- 1 root root    0 8月  25 00:09 vlFS4.py
-rw-r--r-- 1 root root    0 8月  25 00:09 vlFS5.py
-rw-r--r-- 1 root root    0 8月  25 00:09 vlFS6.py
-rw-r--r-- 1 root root    0 8月  25 00:09 vlFS7.py
-rw-r--r-- 1 root root    0 8月  25 00:09 vlFS8.py
-rw-r--r-- 1 root root    0 8月  25 00:09 vlFS9.py


GlusterFS集群文件系统基础与实践_第8张图片

注意:下图,node1和node2节点上存储的文件不是均衡分布的,由于我们创建卷模式为DHT

wKiom1e-m7vA1pnYAABUdH_lg2s294.jpg-wh_50

九、模拟实验配置符合卷,这里使用4个brick

    符合卷就是哈希复制,哈希条带,这两个是比较常用的,向条带复制卷,还有三种揉一块儿的用的都比较少,生产环境推荐使用哈希复制,确保数据安全性

    注意:brick的数量是复制或条带的倍数的时候就会自动的转换为哈希复制或者哈希条带。

    哈希复制卷是一对一对组成复制卷,所以要选择不同的节点上的brick组成复制卷,这样一个数据的副本就会分布在不同的节点上,不管那个节点宕机,另外一个节点都会数据的完整副本。

  1、node1、node2创建两个目录gluster01、gluster02

[root@node1 ~]# mkdir -p /node/{gluster01,gluster02}
[root@node2 ~]# mkdir -p /node/{gluster01,gluster02}


  2、node1创建Gluster Volume卷,并启动

[root@node1 ~]#gluster volume create glusterFS02 replica 2 node1:/node/gluster01 node2:/node/gluster01 node1:/node/gluster02 node2:/node/gluster02 force
volume create: glusterFS02: success: please start the volume to access data


  注:replica 2是复制的数量,node1:/node/gluster01 node2:/node/gluster01是两个节点之间的brick构成复制关系,node1上的/node/gluster01/node/gluster02构成哈希关系,node2节点同样,所以两个节点都具有数据的完成副本。

  注意:不要同一节点的brick间构成复制,两个节点间哈希,这样每个节点上都只保存数据的一部分,任意挂一个节点,就会丢数据。force为强制创建,glusterFS02为Gluster Volume卷名

[root@node1 ~]# gluster volume info glusterFS02   #查看glusterFS02卷信息
Volume Name: glusterFS02
Type: Distributed-Replicate  #哈希复制卷
Volume ID: c46ec6af-8f64-404e-a8d6-69a77cbe5867
Status: Created
Number of Bricks: 2 x 2 = 4   #两个复制构成哈希关系
Transport-type: tcp
Bricks:
Brick1: node1:/node/gluster01
Brick2: node2:/node/gluster01
Brick3: node1:/node/gluster02
Brick4: node2:/node/gluster02
Options Reconfigured:
performance.readdir-ahead: on
[root@node1 ~]#gluster volume start glusterFS02  #启动卷
volume start: glusterFS02: success
[root@node1 ~]# gluster volume status  #查看卷状态
Status of volume: glusterFS02
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick node1:/node/gluster01                 49153     0          Y       9921 
Brick node2:/node/gluster01                 49153     0          Y       6093 
Brick node1:/node/gluster02                 49154     0          Y       9940 
Brick node2:/node/gluster02                 49154     0          Y       6112 
NFS Server on localhost                     2049      0          Y       9967 
Self-heal Daemon on localhost               N/A       N/A        Y       9962 
NFS Server on node2                         2049      0          Y       6134 
Self-heal Daemon on node2                   N/A       N/A        Y       6140 
 
Task Status of Volume glusterFS02
------------------------------------------------------------------------------
There are no active volume tasks


  3、客户端测试哈希复制卷

[root@lvs ~]# mkdir -p /node/DHT_RE
[root@lvs ~]# mount -t glusterfs 192.168.2.5:glusterFS02 /node/DHT_RE/
[root@lvs DHT_RE]# touch testfile{1,2,3,4,5,6,7,8,9,10}  #客户端服务器创建10个测试文件


   查看node1和node2的/node/gluster01文件夹:

[root@node1 gluster01]# ls
testfile5  testfile7  testfile9
[root@node2 node]# cd gluster01
You have new mail in /var/spool/mail/root
[root@node2 gluster01]# ls
testfile5  testfile7  testfile9


   查看node1和node2的/node/gluster02文件夹

[root@node1 gluster02]# ls
testfile1   testfile2  testfile4  testfile8
testfile10  testfile3  testfile6
[root@node2 gluster02]# ls
testfile1   testfile2  testfile4  testfile8
testfile10  testfile3  testfile6


  4、故障测试(模拟node2或集群中的其他节点宕机的情况)

  如:node2节点,暂停gluster服务或中断网络

[root@node1 ~]# gluster peer status
Number of Peers: 1
Hostname: node2
Uuid: f4a8c8b7-e025-4046-919c-e2c41292fbec
State: Peer in Cluster (Disconnected)
注:node1节点上的peer状态,node2节点已经Disconnected失去连接。
[root@node1 ~]# gluster volume status  #查看卷状态
Status of volume: glusterFS02
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick node1:/node/gluster01                 49153     0          Y       9921 
Brick node1:/node/gluster02                 49154     0          Y       9940 
NFS Server on localhost                     2049      0          Y       9967 
Self-heal Daemon on localhost               N/A       N/A        Y       9962 
 
Task Status of Volume glusterFS02
------------------------------------------------------------------------------
There are no active volume tasks


 注:volume的状态只有node1的brick在线。

 这时查看客户端挂载的/node/DHT_RE目录文件完整并且可以正常访问或新增删除,假如只是哈希卷,数据就不完整;如果是条带卷(条带将文件内容拆分存放,只要一个节点故障,文件就没法重新拼接),文件会全部丢失;由于我们是使用哈希复制卷,完全没有受到影响。即使我们客户端/node/DHT_RE挂载的时候连接的是node2(192.168.2.6:glusterFS02/node/DHT_RE/),操作目录也是不受影响。事实上node2故障后,node1节点检测到node2失联后会将挂载路径重定向到其他节点,如果在node2失联的第一时间来执行df命令,显示的时候会卡一会儿的。

wKiom1e-nD-RXe1lAAA0rvQLXIg012.jpg-wh_50

 测试在node1新建测试文件aaaa.py或aaaa,查看客户端可以正常访问到

wKioL1e-nFGD36AlAABqGTtiHDc884.jpg-wh_50

  故障恢复:node2节点,启动gluster服务或恢复网络

[root@node1 ~]# gluster peer status
Number of Peers: 1
Hostname: node2                               
Uuid: f4a8c8b7-e025-4046-919c-e2c41292fbec
State: Peer in Cluster (Connected)     #node2正常连接
[root@node1 ~]# gluster volume status     #glusterFS02卷状态也正常
Status of volume: glusterFS02
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick node1:/node/gluster01                 49153     0          Y       9921 
Brick node2:/node/gluster01                 49153     0          Y       6093 
Brick node1:/node/gluster02                 49154     0          Y       9940 
Brick node2:/node/gluster02                 49154     0          Y       6112 
NFS Server on localhost                     2049      0          Y       9967 
Self-heal Daemon on localhost               N/A       N/A        Y       9962 
NFS Server on node2                         2049      0          Y       6134 
Self-heal Daemon on node2                   N/A       N/A        Y       6140 
 
Task Status of Volume glusterFS02
------------------------------------------------------------------------------
There are no active volume tasks


  查看node2故障节点在恢复之后会同步其他节点的配置信息,并将文件同步

[root@node2 gluster01]# ls
aaaa  aaaa.py  testfile5  testfile7  testfile9


==其他常见操作命令(glusterFS02为卷名,node2、node3、node4为节点)

--删除GlusterFS磁盘

# gluster volume stop   glusterFS02   先停止

# gluster volume delete glusterFS02   再删除

--卸载GlusterFS磁盘

#gluster peer detach node2

--ACL访问控制

#gluster volume set glusterFS02  auth.allow *.*.*.*,*.*.*.*

--添加GlusterFS节点

# gluster peer probe node3

# gluster peer probe node4

# gluster volume add-brick glusterFS02  node3:/data/gluster node4:/data/gluster

--迁移GlusterFS数据

# gluster volume remove-brick glusterFS02 node2:/glusterFS02 node3:/data/gluster start

# gluster volume remove-brick glusterFS02 node2:/glusterFS02 node3:/data/gluster status

# gluster volume remove-brick glusterFS02 node2:/glusterFS02 node3:/data/gluster commit

--修复GlusterFS数据(在节点1宕机的情况下)

# gluster volume replace-brick glusterFS02 node2:/glusterFS02 node3:/data/gluster commit -force

# gluster volume heal models full


参考文档:

官方网站:http://www.gluster.org/

下载地址:http://download.gluster.org/pub/gluster/glusterfs/