Iawen's Blog

我喜欢这样自由的随手涂鸦, 因为我喜欢风......

1. Glusterfs简介

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

2. Glusterfs特点

2.1 扩展性和高性能

GlusterFS利用双重特性来提供几TB至数PB的高扩展存储解决方案。Scale-Out架构允许通过简单地增加资源来提高存储容量和性能, 磁盘、计算和I/O资源都可以独立增加, 支持10GbE和InfiniBand等高速网络互联。Gluster弹性哈希(ElasticHash)解除了GlusterFS对元数据服务器的需求, 消除了单点故障和性能瓶颈, 真正实现了并行化数据访问。

2.2 高可用性

GlusterFS可以对文件进行自动复制, 如镜像或多次复制, 从而确保数据总是可以访问, 甚至是在硬件故障的情况下也能正常访问。自我修复功能能够把数据恢复到正确的状态, 而且修复是以增量的方式在后台执行, 几乎不会产生性能负载。GlusterFS没有设计自己的私有数据文件格式, 而是采用操作系统中主流标准的磁盘文件系统(如EXT3、ZFS)来存储文件, 因此数据可以使用各种标准工具进行复制和访问。

2.3 全局统一命名空间

全局统一命名空间将磁盘和内存资源聚集成一个单一的虚拟存储池, 对上层用户和应用屏蔽了底层的物理硬件。存储资源可以根据需要在虚拟存储池中进行弹性扩展, 比如扩容或收缩。当存储虚拟机映像时, 存储的虚拟映像文件没有数量限制, 成千虚拟机均通过单一挂载点进行数据共享。虚拟机I/O可在命名空间内的所有服务器上自动进行负载均衡, 消除了SAN环境中经常发生的访问热点和性能瓶颈问题。

2.4 弹性哈希算法

GlusterFS采用弹性哈希算法在存储池中定位数据, 而不是采用集中式或分布式元数据服务器索引。在其他的Scale-Out存储系统中, 元数据服务器通常会导致I/O性能瓶颈和单点故障问题。GlusterFS中, 所有在Scale-Out存储配置中的存储系统都可以智能地定位任意数据分片, 不需要查看索引或者向其他服务器查询。这种设计机制完全并行化了数据访问, 实现了真正的线性性能扩展。

2.5 弹性卷管理

数据储存在逻辑卷中, 逻辑卷可以从虚拟化的物理存储池进行独立逻辑划分而得到。存储服务器可以在线进行增加和移除, 不会导致应用中断。逻辑卷可以在所有配置服务器中增长和缩减, 可以在不同服务器迁移进行容量均衡, 或者增加和移除系统, 这些操作都可在线进行。文件系统配置更改也可以实时在线进行并应用, 从而可以适应工作负载条件变化或在线性能调优。

2.6 基于标准协议

 Gluster存储服务支持NFS,CIFS, HTTP, FTP以及Gluster原生协议, 完全与POSIX标准兼容。现有应用程序不需要作任何修改或使用专用API, 就可以对Gluster中的数据进行访问。这在公有云环境中部署Gluster时非常有用, Gluster对云服务提供商专用API进行抽象, 然后提供标准POSIX接口。

3. 部署安装

3.1 yum源安装

yum list | grep gluster
yum install -y centos-release-gluster7 

3.2 安装glusterfs

yum install -y glusterfs-server glusterfs

3.3 启动服务并设置volume

systemctl enable glusterd
systemctl start glusterd
systemctl status glusterd

mkdir /data/gluster

gluster peer probe 192.168.137.4
gluster peer probe 192.168.137.5
gluster peer status

gluster volume create VolumeName replica 3 192.168.137.3:/data/gluster 192.168.137.4:/data/gluster 192.168.137.5:/data/gluster # force
# 注: 2个节点系统会提示产生脑裂问题, 至少需要3个节点, 另外如果只有一块硬盘, 直接使用根节点下面的当存储节点, 在创建分布式复制卷那里最后需要加上参数force才行

gluster volume start VolumeName

mkdir /mnt/gluster
mount -t glusterfs 192.168.137.3:/VolumeName /mnt/gluster

# test
echo "hello" > /mnt/gluster/test.txt

4. volume 模式说明

4.1 默认模式, 既DHT, 也叫 分布卷: 将文件已hash算法随机分布到 一台服务器节点中存储

gluster volume create VolumeName server1:/path server2:/path

4.2 复制模式, 既AFR, 创建volume 时带 replica x 数量: 将文件复制到 replica x 个节点中

gluster volume create VolumeName replica 2 transport tcp server1:/exp1 server2:/exp2

4.3 条带模式, 既Striped, 创建volume 时带 stripe x 数量: 将文件切割成数据块, 分别存储到 stripe x 个节点中 ( 类似raid 0 )

gluster volume create VolumeName stripe 2 transport tcp server1:/exp1 server2:/exp2

4.4 分布式条带模式(组合型), 最少需要4台服务器才能创建。 创建volume 时 stripe 2 server = 4 个节点: 是DHT 与 Striped 的组合型

gluster volume create VolumeName stripe 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4

4.5 分布式复制模式(组合型), 最少需要4台服务器才能创建。 创建volume 时 replica 2 server = 4 个节点: 是DHT 与 AFR 的组合型。

gluster volume create VolumeName replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4

4.6 条带复制卷模式(组合型), 最少需要4台服务器才能创建。 创建volume 时 stripe 2 replica 2 server = 4 个节点: 是 Striped 与 AFR 的组合型。

gluster volume create VolumeName stripe 2 replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4

4.7 三种模式混合, 至少需要8台 服务器才能创建。 stripe 2 replica 2 , 每4个节点 组成一个 组。

gluster volume create VolumeName stripe 2 replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4 server5:/exp5 server6:/exp6 server7:/exp7 server8:/exp8

5. 常用命令

5.1 建立卷及常用操作

如果你打算使用gluster分布式存储, 那么首要的步骤是建立卷。建立卷的模式有很多种, 具体模式可以参见官方网站。我们这里来建立一个复制卷(类似raid1)。

5.1.1 将所有服务器加入存储池

gluster peer probe HOSTNAME

5.1.2 创建卷

gluster volume create NEWVOLNAME [stripe COUNT | replica COUNT] [transport [tcp | rdma | tcp,rdma]]NEWBRICK1 NEWBRICK2 NEWBRICK3...

5.1.3 启动卷

gluster volume start VOLNAME

5.1.4 停止卷

gluster volume stop VOLNAME

5.1.5 删除卷

gluster volume delete VOLNAME

5.1.6 扩展卷(Expanding Volume)

你可能在使用gluster的过程中想在线扩展卷的大小, 比如给分布式的卷中添加brick, 以增加卷的容量。如果你的卷是分布式复制卷或者分布式条带卷, 你新增的brick的数量必须是复制或者条带数目的倍数。比如你建立的卷replica为2, 那么新增的brick的数量必须是2,4,6,8等。

  1. 把新增的存储服务器加入存储池
gluster peer probe HOSTNAME
  1. 把brick加入卷中
gluster volume add-brick VOLNAME NEWBRICK
  1. 查看卷信息
gluster volume info
  1. 重新平衡卷
gluster volume rebalance VOLNAME start | stop | status

5.1.7 缩小卷(Shrinking Volume)

你可能在使用gluster过程中想在线缩小卷的大小, 比如当服务器故障或网络故障时, 你想移除卷中相关的brick。同样需要注意的是如果你建立的是分布式复制卷或分布式条带卷, 你删除的brick数量必须是复制或条带数目的倍数。

  1. 把brick从卷中移除
gluster volume remove-brick VOLNAME BRICK

5.1.8 在线迁移数据(Migrating Data)

你可能想在线迁移一个brick中的数据到另一个brick中, 首先确保相应存储服务器已加入存储池中。

  1. 迁移数据到另一个brick中
gluster volume replace-brick VOLNAME BRICK NEWBRICK start
  1. 查看迁移进度状态
gluster volume replace-brick VOLNAME BRICK NEWBRICK status
  1. 提交迁移数据
gluster volume replace-brick VOLNAME BRICK NEWBRICK commit

6. 常见错误

6.1 Connection failed. Please check if gluster daemon is operational.

gluster peer status
Connection failed. Please check if gluster daemon is operational.

原因: 未开启glusterd服务
解决方法: 开启glusterd服务#systemctl start glusterd

6.2 peer probe: failed: Probe returned with unknown errno 107

gluster peer probe 192.168.230.130
peer probe: failed: Probe returned with unknown errno 107

原因: 防火墙没开启24007端口
解决方法: 开启24007端口或者关掉防火墙

7. Glusterfs调优

7.1 开启 指定 volume 的配额

gluster volume quota img enable

7.2 限制 指定 volume 的配额

gluster volume quota img limit-usage / 1TB

7.3 设置 cache 大小, 默认32MB

gluster volume set img performance.cache-size 4GB

7.4 设置 io 线程, 太大会导致进程崩溃

gluster volume set img performance.io-thread-count 16

7.5 设置 网络检测时间, 默认42s

gluster volume set img network.ping-timeout 10

7.6 设置 写缓冲区的大小, 默认1M

gluster volume set img performance.write-behind-window-size 1024MB