GlusterFS
一、前言
1、什么是分布式文件系统
- 分布式文件系统(Distributed File System, DFS)是一种允许多个计算机通过网络共享文件和存储资源的系统。它将文件系统的功能分布在多个服务器和存储设备上,使用户可以像访问本地文件系统一样访问远程存储的文件。分布式文件系统的设计旨在提高数据的可用性、可靠性和性能,同时简化管理和扩展存储资源。
2、分布式文件系统的发展历史
(1) 早期文件共享系统(1970年代-1980年代)
1970年代:
- 初期文件共享:早期的文件共享系统是基于简单的网络协议,通过共享磁盘和文件系统,用户可以在不同的计算机上访问同一文件。这些系统主要用于小规模网络环境。
1980年代:
-
NFS (Network File System):
- 开发背景:由Sun Microsystems在1984年开发,NFS是早期最成功的分布式文件系统之一。
- 主要特点:NFS使用RPC(远程过程调用)协议允许用户在网络中挂载和访问远程文件系统,类似于访问本地文件系统。NFS引入了透明的文件访问机制和网络文件共享的标准。
-
AFS (Andrew File System):
- 开发背景:由卡内基梅隆大学在1980年代初开发,AFS最初是为了满足大学校园网络的需求。
- 主要特点:AFS采用了分布式缓存机制,通过在客户端缓存文件副本减少了网络负载。AFS还引入了分布式命名空间,支持大规模分布式环境。
(2) 大型分布式文件系统的兴起(1990年代-2000年代初)
1990年代:
- Coda:
- 开发背景:Coda由卡内基梅隆大学在1987年开发,是AFS的继任者。
- 主要特点:Coda引入了强大的断线操作支持,允许客户端在离线状态下访问和修改文件,并在重新连接后同步更改。Coda还改进了数据一致性和容错机制。
2000年代初:
-
GFS (Google File System):
- 开发背景:Google在2003年发布了关于GFS的论文,描述了其为处理大规模数据存储和处理需求而设计的分布式文件系统。
- 主要特点:GFS采用了主/从架构,主节点管理元数据和协调操作,而数据分块存储在多个从节点上。GFS通过数据复制和错误检测机制确保高可用性和容错性。这种设计思想影响了后来的许多分布式存储系统。
-
Lustre:
- 开发背景:由Sun Microsystems(后来的Oracle)开发,Lustre专为高性能计算(HPC)环境设计。
- 主要特点:Lustre提供了高带宽和低延迟的数据访问,适用于需要处理大量数据的科学和工程计算应用。它通过分布式元数据和对象存储技术实现高扩展性。
(3)现代分布式文件系统(2000年代中期-至今)
2000年代中期:
-
HDFS (Hadoop Distributed File System):
- 开发背景:Apache Hadoop项目的一部分,HDFS受GFS启发,于2006年发布。
- 主要特点:HDFS设计用于在低成本硬件上运行,具备高度容错能力。它将数据分块存储,并在集群中多次复制,以确保数据可靠性和高可用性。HDFS是大数据处理和分析的重要基础设施。
-
Ceph:
- 开发背景:Ceph由Sage Weil在2004年作为博士研究项目开发,后来成为一个流行的开源分布式存储系统。
- 主要特点:Ceph支持对象存储、块存储和文件系统存储,通过CRUSH算法实现高扩展性和数据分布。Ceph的自我修复和自我管理特性使其在云计算和大规模存储环境中广受欢迎。
-
Amazon S3 (Simple Storage Service):
- 开发背景:Amazon于2006年发布S3,作为其AWS云服务的一部分。
- 主要特点:S3提供高可用性、扩展性和性能,采用对象存储模型。S3的简单API使其易于集成,迅速成为云存储的标准。
-
GlusterFS:
- 开发背景:GlusterFS由Gluster公司(后来被Red Hat收购)开发,是一个开源分布式文件系统。
- 主要特点:GlusterFS提供了高度可扩展和灵活的存储解决方案,适用于各种工作负载。它通过聚合多个存储服务器来实现扩展,并支持多种存储协议。
(4)新兴技术和趋势
2010年代至今:
-
对象存储:
- 发展背景:对象存储系统如Amazon S3和OpenStack Swift在2010年代迅速普及。
- 主要特点:对象存储通过存储对象(包括数据和元数据)提供更高的可扩展性和灵活性,特别适合大数据和云计算环境。
-
分布式数据库与文件系统融合:
- 发展背景:现代分布式存储系统如Apache Cassandra和Amazon DynamoDB结合了数据库和文件系统的特性。
- 主要特点:这些系统提供高可用性和高性能的数据存储和检索功能,适用于需要快速访问和处理大量数据的应用。
-
超融合基础设施(HCI):
- 发展背景:HCI集成计算、存储和网络资源的系统如Nutanix和VMware vSAN在2010年代末开始流行。
- 主要特点:HCI提供统一的管理和高效的资源利用,通过软件定义存储和计算技术实现灵活的扩展和简化的运维。
3、分布式文件系统的主要特点
-
容错性:通过冗余和数据复制,分布式文件系统能够在硬件故障时继续运行,避免数据丢失。
-
并行处理:多个节点可以同时处理数据请求,提高了数据读写的性能。
-
一致性:确保所有用户看到的数据是一致的,即使在多个节点上进行并发操作。
-
安全性:通过权限管理和加密等技术,保护数据免受未授权访问。
4、应用场景
-
大数据分析:需要处理大量数据的分析任务,如Hadoop使用的HDFS。
-
云存储:提供大规模的分布式存储服务,如Amazon S3。
-
高性能计算(HPC):需要高吞吐量和低延迟的存储系统,如Lustre。
-
企业存储:企业内部的数据共享和协作,如NFS和AFS。
5、主流的分布式文件系统
序号 | 文件系统 | 开发者 | 特点 |
---|---|---|---|
1 | Hadoop Distributed File System (HDFS) | Apache Software Foundation | 专为处理大数据而设计,数据被分成块并复制到多个节点,具有高容错性和高吞吐量。 |
2 | Google File System (GFS) | 主/从架构,主节点管理元数据,从节点存储数据块,支持大规模数据处理,具有高容错和高吞吐量。 | |
3 | Ceph | Sage Weil (开源项目) | 通过CRUSH算法实现数据分布,支持对象存储、块存储和文件系统存储,具备自我修复和自我管理能力。 |
4 | GlusterFS | Gluster公司(现为Red Hat) | 高度可扩展和灵活,通过聚合多个存储服务器实现扩展,适用于多种存储需求。 |
5 | Amazon S3 | Amazon Web Services | 对象存储服务,提供高可用性、扩展性和性能,使用简单的API接口,广泛用于云存储。 |
6 | Lustre | Sun Microsystems(现为Oracle) | 高性能分布式文件系统,主要用于大型高性能计算(HPC)环境,提供高带宽和低延迟的数据访问。 |
7 | IBM Spectrum Scale (GPFS) | IBM | 高性能分布式文件系统,支持大规模数据处理,具有强大的并发处理能力和数据管理功能。 |
8 | Microsoft Azure Blob Storage | Microsoft | 对象存储服务,提供高可用性和弹性,适用于存储大量非结构化数据,集成到Azure云平台中。 |
9 | OpenStack Swift | OpenStack Foundation | 对象存储系统,支持大规模扩展和多租户环境,适用于云计算和大数据存储。 |
10 | MooseFS | Core Technology | 开源的分布式文件系统,支持高可用性和自动故障恢复,适用于中小型企业的存储需求。 |
11 | Red Hat OpenShift Container Storage | Red Hat | 集成到OpenShift平台中的分布式存储解决方案,提供块存储、文件存储和对象存储,支持容器化应用。 |
12 | Tahoe-LAFS | Least Authority Enterprises | 开源的分布式存储系统,注重数据的安全性和隐私保护,采用强加密和数据分片技术。 |
13 | WekaIO Matrix | WekaIO | 高性能分布式文件系统,支持NVMe存储,适用于AI和大数据分析等高性能需求场景。 |
14 | BeeGFS | ThinkParQ | 高性能分布式文件系统,专为高性能计算和存储密集型应用设计,提供高带宽和低延迟。 |
15 | XtreemFS | ZIB (Zuse Institute Berlin) | 开源分布式文件系统,支持多协议访问,具备高容错和高可用性,适用于研究和开发环境。 |
16 | OceanStor 9000 | Huawei | 企业级分布式文件系统,提供高性能和高可用性,适用于大数据分析和企业存储需求。 |
17 | DDN Exa5 | DataDirect Networks | 高性能分布式文件系统,适用于高性能计算、AI和大数据分析,提供极高的吞吐量和可扩展性。 |
18 | RozoFS | Rozo Systems | 开源的分布式文件系统,采用Mojette编码技术,提高了存储效率和数据可靠性,适用于企业存储需求。 |
19 | Panzura | Panzura Inc | 云文件系统,结合了本地和云存储的优势,提供统一的文件存储和管理,适用于多地协作和数据共享。 |
二、GlusterFS 概述
- GlusterFS 是一个开源的分布式文件系统,旨在为海量数据存储提供高性能、可扩展、和灵活的解决方案。它由 Gluster 公司开发,后被 Red Hat 收购。
1、主要特点
(1)无元数据服务器设计
传统的分布式文件系统通常使用元数据服务器来存储元数据,包括目录信息和目录结构。虽然这种设计在浏览目录时效率高,但存在单点故障的风险:一旦元数据服务器故障,整个存储系统可能会崩溃。GlusterFS 通过无元数据服务器的设计,消除了这一单点故障,提高了系统的可靠性和存储效率。
(2)高扩展性
GlusterFS 具备强大的横向扩展能力,可以通过添加更多的存储节点来扩展系统,支持数PB的存储容量和数千客户端的并发处理。它是 Scale-Out(横向扩展)存储解决方案 Gluster 的核心组件,能够高效管理和存储大量数据。
(3)网络支持
GlusterFS 支持通过 TCP/IP 或 InfiniBand RDMA 网络连接存储资源。InfiniBand RDMA 是一种支持多并发链接的技术,具有高带宽、低时延和高扩展性的特点。这使得 GlusterFS 能够将物理上分散的存储资源汇聚在一起,统一提供存储服务。
(4)统一命名空间
GlusterFS 使用统一的全局命名空间来管理数据,这相当于一个目录结构,使得数据管理更加简单和直观。无论底层的物理存储资源如何分布,用户都可以通过这一统一命名空间进行数据访问和管理。
2、高可用性
(1)多副本存储
GlusterFS 通过自动复制文件,实现数据的高可用性。例如,系统可以将文件镜像或多次复制到不同的存储节点上。这样,即使某个节点出现硬件故障,数据依然可以从其他节点访问,从而确保数据的持续可用性。
(2)自我修复功能
当检测到数据不一致时,GlusterFS 的自我修复功能能够自动将数据恢复到正确的状态。数据修复以增量方式在后台执行,几乎不会对系统性能造成影响。这确保了在数据损坏或节点恢复后,系统能够迅速恢复正常运行。
(3)兼容性
GlusterFS 支持所有的存储类型,因为它没有采用私有数据文件格式,而是使用操作系统中主流的标准磁盘文件系统(如EXT3、XFS等)来存储文件。这意味着数据可以通过传统的磁盘访问方式进行访问,进一步提高了系统的灵活性和兼容性。
3、弹性卷管理
(1)逻辑卷和逻辑存储池
GlusterFS 通过将数据存储在逻辑卷中来实现弹性卷管理。逻辑卷是从逻辑存储池中独立划分出来的。逻辑存储池可以在不中断业务的情况下在线增加和移除,这样确保了系统的持续可用性和灵活性。
(2)在线扩展和缩减
逻辑卷可以根据需求在线增长和缩减,并且可以在多个节点中实现负载均衡。这意味着在数据需求增加时,可以动态地增加存储容量,而在需求减少时,又可以缩减存储资源,从而有效利用存储空间。
(3)实时配置更改
文件系统配置可以实时在线更改并应用,从而适应工作负载条件变化或进行在线性能调优。这种灵活性使得系统能够根据实际需求进行调整,优化资源使用和性能表现。
4、基于标准协议
(1)广泛的协议支持
GlusterFS 支持多种标准协议,包括 NFS、CIFS、HTTP、FTP、SMB 以及 Gluster 原生协议。它完全与 POSIX 标准(可移植操作系统接口)兼容。这意味着现有应用程序无需修改即可访问 GlusterFS 中的数据。
(2)专用 API
除了标准协议,GlusterFS 还提供专用 API,以便应用程序可以直接与存储系统进行交互。这种灵活的访问方式使得开发者可以根据具体需求选择合适的接口方式。
三、ClusterFS术语
GlusterFS 术语
1. Brick
- 定义:Brick 是 GlusterFS 中存储的基本单元。每个 Brick 是一个存储服务器上的目录,用于实际存储数据。(例如:yun01中的/opt/test01目录就是一个Brick)。
- 功能:组成 GlusterFS 卷的基础部分,每个卷由一个或多个 Brick 组成。
2. Volume
- 定义:Volume 是由一个或多个 Brick 组成的逻辑存储单元,是 GlusterFS 中的存储卷。
- 类型:
- 分布式卷:将文件分布在多个 Brick 上,没有冗余。
- 复制卷:在多个 Brick 之间复制文件,提供冗余和高可用性。
- 条带卷:将文件分割成条带并分布在多个 Brick 上,提高并行读写性能。
- 分布式-复制卷:结合分布式和复制策略,实现文件的分布式存储和冗余。
- 条带-复制卷:结合条带和复制策略,提高并行性能和冗余。
3. Cluster
- 定义:由多个 GlusterFS 节点组成的集群,这些节点共同管理和提供存储服务。
- 功能:通过集群实现数据的高可用性和负载均衡。
4. Node
- 定义:GlusterFS 集群中的单个服务器,每个节点可以提供存储资源并参与数据管理。
- 功能:参与数据存储、管理和检索,组成集群的一部分。
5. Gluster Daemon
- 定义:在每个 GlusterFS 节点上运行的守护进程,负责管理和监控 GlusterFS 服务。
- 功能:执行数据存储、检索和集群管理任务。
6. Arbiter
- 定义:一种特殊的 Brick,用于复制卷中,以防止数据分裂脑问题。
- 功能:在两个数据 Brick 之间决策,以确保数据一致性。
7. Replication
- 定义:将数据副本存储在多个 Brick 上,以实现数据冗余和高可用性。
- 功能:提高数据的可靠性,防止数据丢失。
8. Striping
- 定义:将文件分割成条带,并在多个 Brick 上存储这些条带。
- 功能:提高文件的并行读写性能。
9. Distributed Hash Table (DHT)
- 定义:一种用于在分布式系统中查找数据位置的数据结构。
- 功能:在 GlusterFS 中用于将文件分布到不同的 Brick 上。
10. FUSE (Filesystem in Userspace)
- 定义:一种允许用户在用户空间创建文件系统的技术。
- 功能:GlusterFS 使用 FUSE 实现用户态文件系统,使得非特权用户可以挂载 GlusterFS 卷。
11. Self-heal
- 定义:当数据不一致时,自动修复数据以确保一致性。
- 功能:在节点恢复后自动修复和同步数据,保持数据一致性。
12. Split-Brain
- 定义:在复制卷中,当两个副本之间的数据不一致且无法自动修复时发生的状态。
- 功能:需要手动干预来解决数据不一致问题。
13. Geo-Replication
- 定义:将数据异步复制到远程位置的功能。
- 功能:实现地理分布的数据冗余和灾难恢复。
14. Translators
- 定义:GlusterFS 中的模块化组件,用于扩展和定制文件系统功能。
- 功能:实现如压缩、加密、缓存等功能,通过在 I/O 路径中动态加载这些模块。
15. Unified Namespace
- 定义:将多个物理存储资源整合成一个逻辑命名空间。
- 功能:提供单一视图以简化数据管理和访问操作。
16. Logical Volume Manager (LVM)
- 定义:管理逻辑卷的工具,可以在逻辑存储池中创建、删除和调整逻辑卷。
- 功能:允许在不中断服务的情况下动态管理存储资源。
17. Snapshot
- 定义:某个时间点的卷或子卷的只读副本。
- 功能:用于数据备份和恢复,支持对数据的历史版本进行访问。
18. Thin Provisioning
- 定义:按需分配存储资源的技术,而不是一次性分配整个预期的存储空间。
- 功能:提高存储资源利用率,减少不必要的存储空间占用。
19. RDMA (Remote Direct Memory Access)
- 定义:一种网络通信技术,允许在计算机内存之间直接传输数据,而不需要经过CPU。
- 功能:提供高带宽、低延迟的数据传输,适用于高性能计算和存储应用。
20. Elastic Hash Algorithm
- 定义:一种用于动态平衡存储负载的散列算法。
- 功能:在节点增加或移除时,自动调整数据分布以保持负载均衡。
四、弹性 Hash 算法在 GlusterFS 中的应用
1、概述
弹性 Hash 算法(Elastic Hash Algorithm)是 GlusterFS 用于分布数据的一种方法,类似于 Redis 的哈希槽。它的具体实现基于 Davies-Meyer 算法,通过将数据均匀分布在多个存储单元(Bricks)上,从而提高系统的可靠性和性能。
2、弹性 Hash 算法的工作原理
-
Hash 值计算:
- 通过 Hash 算法(如 Davies-Meyer 算法)对每个文件或对象计算一个 32 位整数范围的 Hash 值。
-
子空间划分:
- 假设逻辑卷中有 N 个 Brick,则 32 位的整数范围将被划分为 N 个连续的子空间,每个子空间对应一个 Brick。
-
数据定位:
- 当用户或应用程序访问某一个命名空间时,系统会对该命名空间计算 Hash 值,然后根据该 Hash 值所对应的 32 位整数空间确定数据所在的 Brick。
3、弹性 Hash 算法的优点
-
数据均匀分布:
- 通过 Hash 算法,可以保证数据平均分布在每一个 Brick 中,避免了存储资源的过度集中,提高了系统的负载均衡能力。
-
无元数据服务器依赖:
- 采用弹性 Hash 算法,可以解决对元数据服务器的依赖问题,从而消除了单点故障和访问瓶颈。所有的节点都能独立计算和访问数据,提高了系统的可靠性和可用性。
4、实际应用中的示例
假设有一个 GlusterFS 卷包含 4 个 Brick:
- Brick 1:
/mnt/glusterfs/brick1
- Brick 2:
/mnt/glusterfs/brick2
- Brick 3:
/mnt/glusterfs/brick3
- Brick 4:
/mnt/glusterfs/brick4
当一个文件需要存储时,系统会对该文件计算一个 Hash 值,比如计算结果为 1234567890。假设 32 位整数范围为 0 到 4294967295,将这个范围划分为 4 个子空间,每个子空间的范围为:
- 子空间 1: 0 - 1073741823 (Brick 1)
- 子空间 2: 1073741824 - 2147483647 (Brick 2)
- 子空间 3: 2147483648 - 3221225471 (Brick 3)
- 子空间 4: 3221225472 - 4294967295 (Brick 4)
通过计算的 Hash 值 1234567890,可以确定该文件将存储在 Brick 2 对应的子空间中。
5、弹性 Hash 算法的进一步优化
-
动态扩展:
- 当需要增加或移除 Brick 时,可以通过重新计算 Hash 值并重新分配子空间来实现数据的动态平衡,确保系统在扩展或缩减时仍然能够保持高效的负载均衡。
-
故障恢复:
- 在某个 Brick 发生故障时,系统可以快速重新计算数据的存储位置,并将数据迁移到其他可用的 Brick 上,保证系统的持续可用性。
五、GlusterFS数据流
(1)客户端请求
- 文件系统挂载:客户端首先通过 FUSE(Filesystem in Userspace)或 NFS/CIFS 挂载 GlusterFS 卷。
- I/O 操作:客户端发起读写请求,例如打开文件、读取文件、写入文件等。
(2)请求处理
- FUSE 接口:如果使用 FUSE 挂载,FUSE 会将用户空间的 I/O 请求转发给 GlusterFS 客户端守护进程(glusterfsd)。
- NFS/CIFS 接口:如果使用 NFS 或 CIFS 挂载,请求会通过相应的协议转发到 GlusterFS。
(3) Hash 计算
- 弹性 Hash 算法:客户端计算目标文件的 Hash 值,以确定数据应存储在哪个 Brick 上。这一步骤确保了数据在各个 Brick 间的均匀分布。
(4)定位目标 Brick
- 子空间映射:通过 Hash 值和子空间划分,客户端定位到对应的 Brick。这些子空间是预先定义的,并且与卷中的 Brick 数量相关联。
(5)数据传输
- 网络通信:客户端与目标 Brick 所在的服务器建立网络连接,通常使用 TCP/IP 或 InfiniBand。
- 数据写入:对于写操作,客户端将数据发送到目标 Brick。数据可能会经过压缩、加密等处理。
- 数据读取:对于读操作,客户端从目标 Brick 请求并接收数据。
(6)多副本写入(复制卷)
- 同步写入:如果使用的是复制卷,数据会同时写入多个 Brick。客户端会并行地向所有副本发送写请求,以确保数据的冗余。
- 一致性检查:在写入完成后,系统会进行一致性检查,确保所有副本的数据一致。
(7)自我修复
- 检测不一致:系统会定期或在访问时检测数据副本之间的一致性。
- 后台修复:发现不一致时,后台自动进行数据修复,将不一致的副本同步为最新的正确数据。
(8)反馈响应
- 操作完成:目标 Brick 处理完请求后,向客户端返回操作结果。
- 错误处理:如果发生错误,系统会根据错误类型进行重试、切换到备份 Brick 或其他错误处理机制。
六、GlusterFS的卷类型
1. 分布式卷 (Distributed Volume)
概述
- 定义:文件在多个 Brick 之间分布存储,没有冗余。
- 特点:数据仅在一个 Brick 上存储,没有副本。
- 适用场景:适用于大规模存储需求,但对数据冗余要求不高的场景,如数据备份或非关键数据存储。
优点
- 高效的存储利用率:没有冗余,存储空间利用率高。
- 简单的扩展:增加新的 Brick 可以线性扩展存储容量。
缺点
- 无数据冗余:单点故障会导致数据丢失。
2. 复制卷 (Replicated Volume)
概述
- 定义:文件的副本在多个 Brick 之间复制存储。
- 特点:每个文件都有多个副本,分布在不同的 Brick 上。
- 适用场景:适用于需要高可用性和数据冗余的场景,如数据库存储、关键业务数据存储。
优点
- 高可用性:一个 Brick 出现故障时,仍可以从其他副本读取数据。
- 数据冗余:提供多个副本,确保数据安全。
缺点
- 存储效率低:因为需要存储多份数据,存储空间利用率低。
3. 条带卷 (Striped Volume)
概述
- 定义:文件被分割成条带(strip),并分布存储在多个 Brick 上。
- 特点:一个文件的数据分布在多个 Brick 上,提高并行读写性能。
- 适用场景:适用于需要高读写性能的大文件存储,如视频处理、大数据分析等。
优点
- 高并发性能:并行读取和写入文件的不同部分,提高性能。
- 适合大文件:对于大文件,可以充分利用多 Brick 的并行处理能力。
缺点
- 单点故障风险:任意一个 Brick 出现故障,会导致整个文件无法读取。
4. 分布式-复制卷 (Distributed-Replicated Volume)
概述
- 定义:结合分布式卷和复制卷的特性,文件分布在多个 Brick 上,并在每个分布点上进行复制。
- 特点:文件在多个复制集之间分布存储,每个复制集内部进行数据复制。
- 适用场景:适用于既需要高可用性又需要大规模存储的场景。
优点
- 高可用性与扩展性:提供数据冗余的同时,允许通过增加 Brick 来扩展存储容量。
- 数据冗余:每个文件都有多个副本,提高数据安全性。
缺点
- 存储效率较低:由于复制的原因,存储空间利用率较低。
5. 分布式-条带卷 (Distributed-Striped Volume)
概述
- 定义:结合分布式卷和条带卷的特性,文件分布在多个条带集上。
- 特点:文件在多个条带集之间分布,每个条带集内部进行数据条带化。
- 适用场景:适用于需要高性能和大规模存储的场景。
优点
- 高性能与扩展性:通过条带化提高并行读写性能,同时通过分布式扩展存储容量。
- 适合大文件:大文件可以在多个条带集上并行读写,提高性能。
缺点
- 单点故障风险:任意一个 Brick 出现故障,会导致整个文件不可用。
6. 条带-复制卷 (Striped-Replicated Volume)
概述
- 定义:结合条带卷和复制卷的特性,文件在多个条带集上分布,并在每个条带集内部进行复制。
- 特点:文件分布在多个条带集上,并在每个条带集内部进行复制。
- 适用场景:适用于既需要高性能又需要高可用性的场景。
优点
- 高性能与高可用性:提供并行读写性能的同时,确保数据冗余和安全性。
- 数据冗余:每个条带集内部进行复制,提高数据安全性。
缺点
- 存储效率较低:由于条带和复制的双重原因,存储空间利用率较低。
7. 分布式-条带-复制卷 (Distributed-Striped-Replicated Volume)
概述
- 定义:结合分布式、条带和复制的特性,提供最高的性能和冗余。
- 特点:文件分布在多个条带-复制集上,实现并行读写和数据冗余。
- 适用场景:适用于需要最大规模、高性能和最高可用性的存储需求。
优点
- 最高性能与高可用性:通过条带化提高性能,通过复制提供冗余,同时分布式扩展存储容量。
- 适合大规模、高性能需求:能够满足最苛刻的存储和性能要求。
缺点
- 最复杂的管理:配置和管理相对复杂,存储效率较低。
七、常用命令
1. 启停和开机启动
systemctl start glusterd.service # 启动 GlusterFS 服务
systemctl enable glusterd.service # 设置 GlusterFS 服务开机启动
systemctl status glusterd.service # 查看 GlusterFS 服务状态
2. 存储池节点管理
gluster peer probe <SERVER> # 将服务器添加到 GlusterFS 存储池
gluster peer detach <SERVER> # 从 GlusterFS 存储池中移除服务器
gluster peer status # 查看存储池中所有节点的状态
3. 挂载 GlusterFS 卷
mount -t glusterfs <SERVER>:/<VOLNAME> <MOUNTDIR> # 挂载 GlusterFS 卷到本地文件系统
4. 卷管理
gluster volume create <NEW-VOLNAME> replica <COUNT> <NEW-BRICK1> <NEW-BRICK2> ... # 创建新的 GlusterFS 卷
gluster volume start <VOLNAME> # 启动 GlusterFS 卷
gluster volume stop <VOLNAME> # 停止 GlusterFS 卷
gluster volume delete <VOLNAME> # 删除 GlusterFS 卷
gluster volume info <VOLNAME> # 查看 GlusterFS 卷的信息
5. 卷配置
gluster volume set <VOLNAME> <OPTION> <PARAMETER> # 配置 GlusterFS 卷的参数
6. 卷扩展与收缩
gluster volume add-brick <VOLNAME> <NEW-BRICK> # 向 GlusterFS 卷中添加新的 Brick 扩展存储容量
gluster volume remove-brick <VOLNAME> <BRICK> start # 从 GlusterFS 卷中移除 Brick 收缩存储容量
7. 卷迁移与重新均衡
gluster volume replace-brick <VOLNAME> <BRICK> <NEW-BRICK> start # 迁移 GlusterFS 卷中的 Brick
gluster volume rebalance <VOLNAME> start # 重新均衡 GlusterFS 卷的数据
8. 磁盘配额
gluster volume quota <VOLNAME> enable | disable # 开启/关闭 GlusterFS 卷的磁盘配额
gluster volume quota <VOLNAME> limit-usage <DIR> <VALUE> # 设置 GlusterFS 卷中目录的配额
gluster volume quota <VOLNAME> list [<DIR>] # 查看 GlusterFS 卷中目录的配额
9. 地域复制
gluster volume geo-replication <MASTER> <SLAVE> start | status | stop # 控制地域复制的启停和状态
10. IO 信息查看
gluster volume profile <VOLNAME> start | info | stop # 启动/查看/停止 GlusterFS 卷的 IO 信息记录
11. Top 监控
gluster volume top <VOLNAME> open[brick <BRICK>] [list-cnt <COUNT>] # 查看 GlusterFS 卷中 Brick 的打开文件信息
gluster volume top <VOLNAME> read-perf [bs <BLOCK-SIZE> count <COUNT>] [brick <BRICK>] [list-cnt <COUNT>] # 查看 GlusterFS 卷中 Brick 的读性能信息
部署GlusterFS 集群
服务器 | 磁盘 | 挂载点 |
---|---|---|
客户端节点:192.168.20.139 | /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 | /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 |
yun01节点:192.168.20.128 | /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 | /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 |
yun02节点:192.168.20.129 | /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 | /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 |
yun03节点:192.168.20.130 | /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 | /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 |
yun04节点:192.168.20.138 | /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 | /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 |
一、服务端配置
1、编写脚本
vim /opt/fdisk.sh
#!/bin/bash
NEWDEV=`ls /dev/sd* | grep -o 'sd[b-z]' | uniq`
for VAR in $NEWDEV
do
echo -e "n\np\n\n\n\nw\n" | fdisk /dev/$VAR &> /dev/null
mkfs.xfs /dev/${VAR}"1" &> /dev/null
mkdir -p /data/${VAR}"1" &> /dev/null
echo "/dev/${VAR}"1" /data/${VAR}"1" xfs defaults 0 0" >> /etc/fstab
done
mount -a &> /dev/null
2、给脚本执行权限
#给权限
chmod +x /opt/fdisk.sh
cd /opt/
#执行脚本
./fdisk.sh
# 查看挂载情况
df -h
3、配置/etc/hosts文件
echo "192.168.20.128 yun01" >> /etc/hosts
echo "192.168.20.129 yun02" >> /etc/hosts
echo "192.168.20.130 yun03" >> /etc/hosts
echo "192.168.20.138 yun04" >> /etc/hosts
4、安装GlusterFS 服务
# 服务端都安装
yum install centos-release-gluster
yum install -y glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
5、启动GlusterFS服务
systemctl start glusterd
6、添加节点到存储信任池中(在yun01节点操作)
#只要在一台yun节点上添加其它节点即可
# GlusterFS 将会尝试建立节点之间的对等关系,从而形成一个分布式存储集群,可以共享数据和提供冗余性。
gluster peer probe yun01
gluster peer probe yun02
gluster peer probe yun03
gluster peer probe yun04
#在每个Node节点上查看群集状态
gluster peer status
7、创建卷
卷名 | 类型 | brick |
---|---|---|
dis-volume | 分布式卷 | yun01-4(/data/sdb1) |
stripe-volume | 条带卷 | yun01-2(/data/sdc1) |
rep-volume | 复制卷 | yun03-4(/data/sdc1) |
dis-stripe | 分布式条带卷 | yun01-4(/data/sdd1) |
dis-rep | 分布式复制卷 | yun01-4(/data/sde1) |
(1) 创建分布式卷
#创建分布式卷,没有指定类型,默认创建的是分布式卷
gluster volume create dis-volume yun01:/data/sdb1 yun02:/data/sdb1 yun03:/data/sdb1 yun04:/data/sdb1 force
#查看卷列表
gluster volume list
#启动新建分布式卷
gluster volume start dis-volume
#查看创建分布式卷信息
gluster volume info dis-volume
(2)创建条带卷
#指定类型为 stripe,数值为 2,且后面跟了 2 个 Brick Server
gluster volume create stripe-volume stripe 2 yun01:/data/sdc1 yun02:/data/sdc1 force
gluster volume start stripe-volume
gluster volume info stripe-volume
- 报错,gluster9版本不支持条带卷
(3)创建复制卷
#指定类型为 replica,数值为 2,且后面跟了 2 个 Brick Server
gluster volume create rep-volume replica 2 yun03:/data/sdc1 yun04:/data/sdc1 force
gluster volume start rep-volume
gluster volume info rep-volume
(4)创建分布式复制卷
#指定类型为 replica,数值为 2,而且后面跟了 4 个 Brick Server,是 2 的两倍
gluster volume create dis-rep replica 2 yun01:/data/sde1 yun02:/data/sde1 yun03:/data/sde1 yun04:/data/sde1 force
gluster volume start dis-rep
gluster volume info dis-rep
#查看当前所有卷的列表
gluster volume list
二、客户端配置
1、客户端GlusterFS服务安装
# 客户端安装
yum install -y glusterfs glusterfs-fuse
2、创建挂载目录
mkdir -p /test/{dis,stripe,rep,dis_stripe,dis_rep}
ls /test
3、配置 /etc/hosts 文件
echo "192.168.20.128 yun01" >> /etc/hosts
echo "192.168.20.129 yun02" >> /etc/hosts
echo "192.168.20.130 yun03" >> /etc/hosts
echo "192.168.20.138 yun04" >> /etc/hosts
4、挂载 Gluster 文件系统
#临时挂载
mount.glusterfs yun01:dis-volume /test/dis
mount.glusterfs yun01:rep-volume /test/rep
mount.glusterfs yun01:dis-rep /test/dis_rep
df -Th
#永久挂载
vim /etc/fstab
node1:dis-volume /test/dis
glusterfs defaults,_netdev 0 0
node1:stripe-volume /test/stripe glusterfs defaults,_netdev 0 0
node1:rep-volume /test/rep
glusterfs defaults,_netdev 0 0
node1:dis-stripe /test/dis_stripe glusterfs defaults,_netdev 0 0
node1:dis-rep
/test/dis_rep
# df -Th查看挂载情况
三、测试 Gluster 文件系统
1、卷中写入文件,客户端操作
cd /opt
dd if=/dev/zero of=/opt/demo1.log bs=1M count=40
dd if=/dev/zero of=/opt/demo2.log bs=1M count=40
dd if=/dev/zero of=/opt/demo3.log bs=1M count=40
dd if=/dev/zero of=/opt/demo4.log bs=1M count=40
dd if=/dev/zero of=/opt/demo5.log bs=1M count=40
ls -lh /opt
cp /opt/demo* /test/dis/
cp /opt/demo* /test/rep/
cp /opt/demo* /test/dis_rep/
2、 查看文件分布
(1)分布式文件分布查看
ls -lh /data/sdb1
(2)查看复制卷分布
ll -h /data/sdc1
(3)查看分布式复制卷
ll -h /data/sde1
四、扩缩容
1、扩容
- 在192.168.20.138的主机上加一块10G硬盘
- 挂载硬盘
- 在分布式卷中加入一个新的brick
- 写入文件测试
- 写入前
- 写入后
- sdf1中为写入文件,尝试重新均衡
2、缩容
- 将
dis-volum
的sdf1
块移除
# 移除命令
gluster volume remove-brick dis-volume yun04:/data/sdf1 status
可以看出移除成功,但 dis-volume 卷中还是存在。当前状态是因为移除 brick 的操作尚未完成。需要通过检查状态命令来确认数据迁移的进度,并在数据迁移完成后使用 commit 命令来最终移除该 brick。
- 查看移除状态
gluster volume remove-brick dis-volume yun04:/data/sdf1 status
- 提交移除 brick 的操作。
gluster volume remove-brick dis-volume yun04:/data/sdf1 commit
- 查看数据是否迁移成功
sdf1中的test1,2,6.log已经从服务器192.168.20.138中移除
数据迁移到192.168.20.130服务器节点中