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等。
- 把新增的存储服务器加入存储池
gluster peer probe HOSTNAME
- 把brick加入卷中
gluster volume add-brick VOLNAME NEWBRICK
- 查看卷信息
gluster volume info
- 重新平衡卷
gluster volume rebalance VOLNAME start | stop | status
5.1.7 缩小卷(Shrinking Volume)
你可能在使用gluster过程中想在线缩小卷的大小, 比如当服务器故障或网络故障时, 你想移除卷中相关的brick。同样需要注意的是如果你建立的是分布式复制卷或分布式条带卷, 你删除的brick数量必须是复制或条带数目的倍数。
- 把brick从卷中移除
gluster volume remove-brick VOLNAME BRICK
5.1.8 在线迁移数据(Migrating Data)
你可能想在线迁移一个brick中的数据到另一个brick中, 首先确保相应存储服务器已加入存储池中。
- 迁移数据到另一个brick中
gluster volume replace-brick VOLNAME BRICK NEWBRICK start
- 查看迁移进度状态
gluster volume replace-brick VOLNAME BRICK NEWBRICK status
- 提交迁移数据
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