Gluster 简介
Gluster 概述
- Glusterfs是一个开源的分布式文件系统; 是Scale存储的核心,能够处理千数量级的客户端.在传统的解决方案中Glusterfs能够灵活的结合物理的,虚拟的和云资源去体现高可用和企业级的性能存储.
- Glusterfs通过TCP/IP或InfiniBand RDMA网络链接将客户端的存储资块源聚集在一起; 使用单一的全局命名空间来管理数据,磁盘和内存资源.
- Glusterfs基于堆叠的用户空间设计,可以为不同的工作负载提供高优的性能.
- Glusterfs支持运行在任何标准IP网络上标准应用程序的标准客户端,用户可以在全局统一的命名空间中使用NFS/CIFS等标准协议来访问应用数据.
Gluster 主要特征
扩展性和高性能
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接口。
显著优点
- 开源,且网上的文档基本上足够你维护一套简单的存储系统。
- 支持多客户端处理,当前已知的支持千级别及以上规模客户。
- 支持POSIX<简单来说,软件跨平台,也可以看找的其他博客说明,见‘参考文件’>。
- 支持各种低端硬件,当然并不推崇,但是可以实现。我在线上用过8核,32G,依然跑的很溜。
- 支持NFS/SMB/CIFS/GLUSTERFS等行业标准协议访问。
- 提供各种优秀的功能,如磁盘配额、复制式、分布式、快照、性能检测命令等。
- 支持大容量存储,当前已知的支持PB及以上规模存储。
- 可以使用任何支持扩展属性的ondisk文件系统,比如xattr.
- 强大且简单的扩展能力,你可以在任何时候快速扩容。
- 自动配置故障转移,在故障发生时,无需任何操作即可恢复数据,且最新副本依然从仍在运行的节点获取。
术语介绍
Brick: GFS中的存储单元,通常是一个受信存储池中的服务器的一个导出目录。可以通过主机名和目录名来标识,如’SERVER:EXPORT’
Client: 挂载了GFS卷的设备
Extended Attributes: xattr是一个文件系统的特性,其支持用户或程序关联文件/目录和元数据。
FUSE: Filesystem Userspace是一个可加载的内核模块,其支持非特权用户创建自己的文件系统而不需要修改内核代码。通过在用户空间运行文件系统的代码通过FUSE代码与内核进行桥接。
GFID: GFS卷中的每个文件或目录都有一个唯一的128位的数据相关联,其用于模拟inode
Namespace: 每个Gluster卷都导出单个ns作为POSIX的挂载点
Node: 一个拥有若干brick的设备
RDMA: 远程直接内存访问,支持不通过双方的OS进行直接内存访问。
RRDNS: round robin DNS是一种通过DNS轮转返回不同的设备以进行负载均衡的方法
Self-heal: 用于后台运行检测复本卷中文件和目录的不一致性并解决这些不一致。
Split-brain: 脑裂
Volfile: glusterfs进程的配置文件,通常位于/var/lib/glusterd/vols/volname
Volume: 一组bricks的逻辑集合
工作原理
- 首先是在客户端, 用户通过glusterfs的mount point 来读写数据, 对于用户来说,集群系统的存在对用户是完全透明的,用户感觉不到是操作本地系统还是远端的集群系统。
- 用户的这个操作被递交给 本地linux系统的VFS来处理。
- VFS 将数据递交给FUSE 内核文件系统:在启动 glusterfs 客户端以前,需要想系统注册一个实际的文件系统FUSE,如上图所示,该文件系统与ext3在同一个层次上面, ext3 是对实际的磁盘进行处理, 而fuse 文件系统则是将数据通过/dev/fuse 这个设备文件递交给了glusterfs client端。所以, 我们可以将 fuse文件系统理解为一个代理。
- 数据被fuse 递交给Glusterfs client 后, client 对数据进行一些指定的处理(所谓的指定,是按照client 配置文件据来进行的一系列处理, 我们在启动glusterfs client 时需要指定这个文件。
- 在glusterfs client的处理末端,通过网络将数据递交给 Glusterfs Server,并且将数据写入到服务器所控制的存储设备上。
GlusterFS 整体工作流
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,该请求将在每个翻译器中发挥相应的功能。
常用volume 卷类型
分布(distributed)
默认模式,既DHT, 也叫 分布卷: 将文件已hash算法随机分布到 一台服务器节点中存储。
复制(replicate)
复制模式,既AFR, 创建volume 时带 replica x 数量: 将文件复制到 replica x 个节点中。
条带(striped)
条带模式,既Striped, 创建volume 时带 stripe x 数量: 将文件切割成数据块,分别存储到 stripe x 个节点中 ( 类似raid 0 )。
分布式条带卷(distribute stripe volume)
分布式条带模式(组合型),最少需要4台服务器才能创建。 创建volume 时 stripe 2 server = 4 个节点: 是DHT 与 Striped 的组合型。
分布式复制卷(distribute replica volume)
分布式复制模式(组合型), 最少需要4台服务器才能创建。 创建volume 时 replica 2 server = 4 个节点:是DHT 与 AFR 的组合型。
条带复制卷(stripe replica volume)
条带复制卷模式(组合型), 最少需要4台服务器才能创建。 创建volume 时 stripe 2 replica 2 server = 4 个节点: 是 Striped 与 AFR 的组合型。
分布式条带复制卷(distribute stripe replicavolume)
三种模式混合, 至少需要8台 服务器才能创建。 stripe 2 replica 2 , 每4个节点 组成一个 组。
环境准备
前置条件
- 至少需要两台设备/节点。
- 具备正常的网络连接
- 至少需要两个磁盘,一个用于OS安装,一个用于服务gluster存储;
环境配置
关闭防火墙
1 | systemctl stop firewalld.service #停止firewalld |
关闭SELinux
1 | sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config #关闭SELinux |
配置host文件
1 | 10.0.0.101 node01 |
同步时间
1 | ntpdate time.windows.com #同步时间 |
*安装 gluster 源 *
1 | yum -y install centos-release-gluster312.noarch |
安装glusterfs
1 | yum -y --enablerepo=centos-gluster*-test install glusterfs-server glusterfs-cli glusterfs-geo-replication |
启动gluster, 并设置开机自启动
1 | glusterfs -v |
格式化磁盘(全部gluster )
在每台主机上创建几块硬盘,做接下来的分布式存储使用
注:创建的硬盘要用xfs格式来格式化硬盘,如果用ext4来格式化硬盘的话,对于大于16TB空间格式化就无法实现了。所以这里要用xfs格式化磁盘(centos7默认的文件格式就是xfs),并且xfs的文件格式支持PB级的数据量
1 | fdisk -l # 查看所有磁盘设备 |
将server 主机加入到信任池
随便在一个开启glusterfs服务的主机上将其他主机加入到一个信任的主机池里,这里选择node01
1 | gluster peer probe node01 |
gluster 卷 操作
GlusterFS 五种卷的创建注意
- Distributed:分布式卷,文件通过 hash 算法随机分布到由 bricks 组成的卷上。
- Replicated: 复制式卷,类似 RAID 1,replica 数必须等于 volume 中 brick 所包含的存储服务器数,可用性高。
- Striped: 条带式卷,类似 RAID 0,stripe 数必须等于 volume 中 brick 所包含的存储服务器数,文件被分成数据块,以 Round Robin 的方式存储在 bricks 中,并发粒度是数据块,大文件性能好。
- Distributed Striped: 分布式的条带卷,volume中 brick 所包含的存储服务器数必须是 stripe 的倍数(>=2倍),兼顾分布式和条带式的功能。
- Distributed Replicated: 分布式的复制卷,volume 中 brick 所包含的存储服务器数必须是 replica 的倍数(>=2倍),兼顾分布式和复制式的功能。
分布式复制卷的brick顺序决定了文件分布的位置,一般来说,先是两个brick形成一个复制关系,然后两个复制关系形成分布。
企业一般用后两种,大部分会用分布式复制(可用容量为 总容量/复制份数),通过网络传输的话最好用万兆交换机,万兆网卡来做。这样就会优化一部分性能。它们的数据都是通过网络来传输的。
配置分布式卷
1 | 在信任的主机池中任意一台设备上创建卷都可以,而且创建好后可在任意设备挂载后都可以查看 |
配置复制卷
复制模式,既AFR, 创建volume 时带 replica x 数量: 将文件复制到 replica x 个节点中。
1 | 这条命令的意思是使用Replicated的方式,建立一个名为gv2的卷(Volume),存储块(Brick)为2个,分别为node01:/data/brick2 和 node02:/data/brick2; |
配置条带卷
1 | [root@node01 ~] gluster volume create gv3 stripe 2 node01:/data/brick3 node02:/data/brick3 force |
配置分布式复制卷(拓展卷)
注意:
- 块服务器的数量必须是复制的倍数
- 将按块服务器的排列顺序指定相邻的块服务器成为彼此的复制; 例如,8台服务器:
- 当复制副本为2时,按照服务器列表的顺序,服务器1和2作为一个复制,3和4作为一个复制,5和6作为一个复制,7和8作为一个复制
- 当复制副本为4时,按照服务器列表的顺序,服务器1/2/3/4作为一个复制,5/6/7/8作为一个复制
1 | 将原有的复制卷gv2进行扩容,使其成为分布式复制卷; |
配置分布式条带卷(拓展卷)
1 | 将原有的复制卷gv3进行扩容,使其成为分布式条带卷 |
磁盘存储平衡(拓展卷后操作)
平衡布局是很有必要的,因为布局结构是静态的,当新的 bricks 加入现有卷,新创建的文件会分布到旧的 bricks 中,所以需要平衡布局结构,使新加入的 bricks 生效。布局平衡只是使新布局生效,并不会在新的布局中移动老的数据,如果你想在新布局生效后,重新平衡卷中的数据,还需要对卷中的数据进行平衡。
1 | 在gv2的分布式复制卷的挂载目录中创建测试文件如下 |
移除brick(收缩卷)
你可能想在线缩小卷的大小,例如:当硬件损坏或网络故障的时候,你可能想在卷中移除相关的 bricks。
注意:当你移除 bricks 的时候,你在 gluster 的挂载点将不能继续访问数据,只有配置文件中的信息移除后你才能继续访问 bricks 中的数据。当移除分布式复制卷或者分布式条带卷的时候,移除的 bricks 数目必须是 replica 或者 stripe 的倍数。
但是移除brick在生产环境中基本上不做的,如果是硬盘坏掉的话,直接换个好的硬盘即可,然后再对新的硬盘设置卷标识就可以使用了,后面会演示硬件故障或系统故障的解决办法。
1 | [root@node01 ~] gluster volume stop gv2 |
迁移卷(迁移卷)
1 | [root@node01 ~] gluster volume stop gv2 |
删除卷
一般会用在命名不规范的时候才会删除
1 | [root@node01 ~] gluster volume stop gv1 |
卷误删解决办法
1 | [root@node01 ~] ls /var/lib/glusterd/vols/ |
卷数据不一致解决办法
1 | [root@node01 ~] ls /data/brick2 #复制卷的存储位置的数据 |
glusterfs 分布式存储优化
优化参数
1 | Auth_allow #IP访问授权;缺省值(*.allow all);合法值:Ip地址 |
优化方式
1 | 命令格式: |
glusterfs 监控及维护
1 | 使用zabbix自带的模板即可,CPU、内存、磁盘空间、主机运行时间、系统load。日常情况要查看服务器监控值,遇到报警要及时处理。 |
故障处理
一台主机故障
一台节点故障的情况包含以下情况:
- 物理故障
- 同时有多块硬盘故障,造成数据丢失
- 系统损坏不可修复
解决方法:
找一台完全一样的机器,至少要保证硬盘数量和大小一致,安装系统,配置和故障机同样的 IP,安装 gluster 软件,保证配置一样,在其他健康节点上执行命令 gluster peer status,查看故障服务器的 uuid
1 | [root@mystorage2 ~] gluster peer status |