在 liunx 下部署Gluster FS分布式文件系统,以及Gluster FS遇到的一些问题解决,常用命令

概述

Gluster FS 是一个开源分布式文件系统,具有强大的横向扩展能力,可支持数PB存储容量和数千客户端,通过Infiniband RDMA 或Tcp/Ip 方式将许多廉价的x86 主机,通过网络互联成一个并行的网络文件系统。具有可扩展性、高性能、高可用性等特点。

Gluster FS采用可堆叠的用户空间设计,如图所示:

Gluster FS 部署复制卷与常用命令 常见问题解决-编程知识网

什么是分布式文件系统

简单的说,分布式文件系统就是将固定于某个点的某个文件系统,扩展到任意多个地点/多个文件系统,众多的节点组成一个文件系统网络。通过网络进行节点间的通信和数据传输。你无需关心数据是存储在哪个节点,或是从哪个节点读取数据。

Gluster FS 卷类型

部署

安装Gluster FS

此处为安装单机流程,安装集群请参考 搭建复制卷

搜索可用安装版本

yum search centos-release-gluster

指定 Glusterfs 6 版本(根据自己要求选择安装版本)

yum -y install centos-release-gluster6.noarch

安装 服务端 + 客户端

yum install -y glusterfs*

只安装客户端

yum install -y glusterfs-fuse.x86_64

查看版本(如果只有客户端无法使用该命令)

glusterfs -V

启动服务

service glusterd start

添加开机启动

systemctl enable glusterd.service

搭建复制卷

参考 centos7下glusterFs 分布式文件系统环境搭建
参考 CentOS7安装GlusterFS

以上两个参考已经很详细了,你也可以自行搜索文章教程,关键字 (CentOS7、GlusterFS、复制卷)

以下是自行总结的步骤

开放通信端口

Linux 有两种防火墙(firewall、iptables ),请确定自己使用的是什么类型防火墙再放行端口

firewall 防火墙

# 通信端口
firewall-cmd --zone=public --add-port=49152/tcp--permanent
firewall-cmd --zone=public --add-port=24007:24011/tcp--permanent
firewall-cmd --zone=public --add-port=38465:38485/tcp--permanent

重新载入

firewall-cmd --reload

查看防火墙规则

firewall-cmd --list-ports 

iptables 防火墙

iptables -A INPUT -p tcp --dport 49152 -j ACCEPT
iptables -A INPUT -p tcp --dport 24007:24011 -j ACCEPT
iptables -A INPUT -p tcp --dport 38465:38485 -j ACCEPT
iptables -A INPUT -p tcp --dport 111 -j ACCEPT

保存规则

service iptables save  

查看防火墙规则

iptables -L -n

安装Gluster FS

集群环境与角色

name ip
node-2 172.16.10.2
node-3 172.16.10.3
node-4 172.16.10.4
client 172.16.10.50
  • 安装 Gluster FS Server (node-2、3、4都需执行以下命令)

    # 搜索可用安装版本
    yum search centos-release-gluster
    # 指定 Glusterfs 6 版本(根据自己要求选择安装版本)
    yum -y install centos-release-gluster6.noarch
    # 安装 服务端 + 客户端 (可以选择不安装客户端)
    yum install -y glusterfs*
    # 查看版本
    glusterfs -V
    # 启动服务
    service glusterd start
    # 添加开机启动
    systemctl enable glusterd.service
    
  • 安装 Gluster FS Client (在 client 执行以下命令,Client 需与 Server 版本一致)

    # 搜索可用安装版本
    yum search centos-release-gluster
    # 指定 Glusterfs 6 版本(根据自己要求选择安装版本)
    yum -y install centos-release-gluster6.noarch
    # 只安装客户端
    yum install -y glusterfs-fuse.x86_64
    

增加集群节点

  • 关闭防火墙 or 开放端口

    • 开放端口参考 开放通信端口
    • 或者关闭每一台机器的防火墙
    # firewalld
    systemctl stop firewalld.service
    systemctl disable firewalld.service
    # or iptables
    systemctl stop iptables.service
    systemctl disable iptables.service
    
  • 添加节点

    在node-2上执行,将node-3、node-4加入集群

    gluster peer probe 172.16.10.2
    gluster peer probe 172.16.10.3
    gluster peer probe 172.16.10.4
    
  • 在node-1上看集群节点状态

    [root@172.16.10.2 db]# gluster peer status
    Number of Peers: 2Hostname: 172.16.10.3
    Uuid: d8d232f-e5fb-4752-b40d-b0103afrf8ea
    State: Peer in Cluster (Connected)Hostname: 172.16.10.4
    Uuid: ff3gg732-ae12-4b6c-4rfb-65fd7886588c
    State: Peer in Cluster (Connected)# 如果节点 State 显示的不是 (Connected) 则添加节点未成功,需排查两个节点之间通信是否正常,可以ping 测试
    

创建网络卷

  • 创建数据存储目录(在三个节点都执行 node-2、3、4)

    mkdir -p /home/hotgv1
    
  • 创建复制卷三节点模式

    # 语法
    gluster volume create 卷名称 replica 节点数量 节点IP:目录... force
    # 示例
    gluster volume create hotgv1 replica 3 172.16.10.2:/home/hotgv1 172.16.10.3:/home/hotgv1 172.16.10.4:/home/hotgv1 force
    
  • 查看卷信息

    # 卷信息
    gluster volume info
    
  • 启动卷

    gluster volume start hotgv1
    
  • 查看卷状态

    gluster volume statusStatus of volume: hotgv1
    Gluster process                             TCP Port  RDMA Port  Online  Pid
    ------------------------------------------------------------------------------
    Brick 172.16.10.2:/home/hotgv1              49152     0          Y       6283
    Brick 172.16.10.3:/home/hotgv1              49152     0          Y       6216
    Brick 172.16.10.4:/home/hotgv1              49152     0          Y       6232# online Y | N  表示节点是否在线
    

性能调优

  • 性能调优(可选操作步骤)

    # 启用卷配额
    gluster volume quota hotgv1 enable
    # 限制 hotgv1中 / (既总目录) 最大使用 100GB 空间 
    gluster volume quota hotgv1 limit-usage / 100GB
    # 设置 cache 大小(此处要根据实际情况,如果设置太大可能导致后面客户端挂载失败) 
    gluster volume set hotgv1 performance.cache-size 512MB
    # 开启 异步,后台操作 
    gluster volume set hotgv1 performance.flush-behind on
    # 设置 io 线程 32 
    gluster volume set hotgv1 performance.io-thread-count 32
    # 设置 回写 (写数据时间,先写入缓存内,再写入硬盘) 
    gluster volume set hotgv1 performance.write-behind on# 查看调优后的卷信息
    gluster volume info
    

挂载网络卷

  • 设置ip白名单

    # 仅白名单IP才能挂载客户端访问卷 *通配符
    gluster volume set hotgv1 auth.allow 172.16.10.50,172.16.10.*,
    
  • 挂载卷(在 client 172.16.10.50 执行)

    # 创建数据访问挂载点
    mkdir -p /mnt/hotgv1
    # 挂载卷
    mount -t glusterfs IP:卷名 挂载点目录
    # 例 1
    mount -t glusterfs 172.16.10.2:hotgv1 /mnt/hotgv1
    # 例 2 不要记录挂载日志
    mount -t glusterfs -o log-level=NONE 172.16.10.2:hotgv1 /mnt/hotgv1# df 命令检查挂载状态
    df -h# 挂载失败 检查卷白名单、测试节点之间通信Ping、防火墙
    

测试卷工作

  • 测试卷工作 (在 client 172.16.10.50 执行)

    # 往该目录写入文件,随后查看gluster服务器的存储情况 
    time dd if=/dev/zero of=/mnt/hotgv1/hello bs=100M count=1
    
  • 查看卷节点文件是否同步

    # 172.16.10.2
    ll /home/hotgv1
    # 172.16.10.3
    ll /home/hotgv1
    # 172.16.10.4
    ll /home/hotgv1
    

常见问题

遇到问题,建议先排查错误日志,90%的问题都可以找到原因

cd /var/log/glusterfs/

节点

  • 新增节点到集群后,集群其余节点无法感知新增节点状态,或者新增节点无法同步数据,通信等情况

    参考 开放通信端口

  • 故障节点重新上线

    当执行 gluster volume status 命令发现有节点 Online 状态为 N,该情况一般为网络通信故障导致节点状态为掉线,解决方法:

    • 重启掉线节点 glusterfs程序,使其重新上线 service glusterd restart
    • 排查掉线节点防火墙
    • 如果仍然无法成功上线 参考 故障节点排除方案
  • 故障节点排除(非复制卷,慎用)

    ​ 如果重启节点仍然无法解决 节点掉线

    1. 备份故障节点目录 /var/lib/glusterd 中的 glusterd.info 文件 与 peers 文件夹
    2. stop gluster 服务 删除 /var/lib/glusterd 目录下的所有文件
    3. 启动 gluster 服务 将备份的 glusterd.info文件与 peers 文件夹覆盖到 /var/lib/glusterd 中
    4. 重启 gluster 服务

挂载

  • 挂载点异常处理方法

    • 当挂载点 出现 挂载点传输未建立

      ??? ? ? ? ? ? /mnt/hotgv1
      

      这种情况是挂载目标节点掉线,导致挂载点崩溃,通常带来 无法访问、写入网络卷等问题

      处理方法:卸载挂载点 重新挂载

      # 卸载挂载点(当出现此情况时通常无法使用该命令卸载)
      umount /mnt/hotgv1cn # 使用此命令卸载
      fusermount-glusterfs -uz /mnt/hotgv1# 重新挂载
      mount -t glusterfs 172.16.10.2:hotgv1 /mnt/hotgv1
      

      该情况一般 伴随网络卷有部分节点掉线

      # 使用此命令排查卷健康状态  每个节点都执行一遍
      gluster volume status# 发现存在掉线节点,可尝试重启服务解决,如果掉线节点自身参考卷状态正常,而其它节点无法连接掉线节点,可排查防火墙原因

注意事项

集群角色

  • Brick 表示是集群节点,集群节点只能读取文件,不支持向卷中写入数据或者改变数据,如果向节点目录写入数据,并不会同步到集群中。
  • Client 即 mount 挂载点,该目录下对文件操作,都会被同步到卷中所有节点,支持都集群中的文件读写。
  • Volume 即 网络卷,由多个节点组成,不同的网络卷模式,工作原理也不同。

网络卷维护

  • 定期查看网络卷健康状态,及时处理故障节点
  • 添加集群哨兵,监控挂载点状态,一但挂载点下线,网络卷就无法访问与存储,可实现多挂载点模式,防止单点故障。
  • 同一台服务器不仅可以作为节点,也可以做挂载点,同一台服务器可以承担多个网络卷的节点组成,自行考虑性能与存储

常用命令

参考 Glusterfs的常用命令

服务器节点

# 查看所有节点信息,显示时不包括本节点
gluster peer status            
# 添加节点
gluster peer probe   NODE-NAME
# 移除节点,需要提前将该节点上的brick移除
gluster peer detach  NODE-NAME 

Glusterd 服务

# 启动glusterd服务
/etc/init.d/glusterd start
# 关闭glusterd服务
/etc/init.d/glusterd stop
# 查看glusterd服务
/etc/init.d/glusterd status

卷管理

# 创建卷# <1> 复制卷# 语法:
gluster volume create NEW-VOLNAME [replica COUNT] [transport tcp | rdma | tcp, rdma] NEW-BRICK
# 示例1:
gluster volume create test-volume replica 2 transport tcp server1:/exp1/brick server2:/exp2/brick# <2>条带卷# 语法:
gluster volume create NEW-VOLNAME [stripe COUNT] [transport tcp | rdma | tcp, rdma] NEW-BRICK...
# 示例:
gluster volume create test-volume stripe 2 transport tcp server1:/exp1/brick server2:/exp2/brick# <3>分布式卷# 语法:  
gluster volume create NEW-VOLNAME [transport tcp | rdma | tcp, rdma] NEW-BRICK
# 示例1:
gluster volume create test-volume server1:/exp1/brick server2:/exp2/brick
# 示例2:
gluster volume create test-volume transport rdma server1:/exp1/brick server2:/exp2/brick server3:/exp3/brick server4:/exp4/brick# <4>分布式复制卷# 语法: 
gluster volume create NEW-VOLNAME [replica COUNT] [transport tcp | rdma | tcp, rdma] NEW-BRICK...
# 示例: 
gluster volume create test-volume replica 2 transport tcp server1:/exp1/brick server2:/exp2/brick server3:/exp3/brick server4:/exp4/brick# <5>分布式条带卷# 语法:
gluster volume create NEW-VOLNAME [stripe COUNT] [transport tcp | rdma | tcp, rdma] NEW-BRICK...
# 示例:
gluster volume create test-volume stripe 2 transport tcp server1:/exp1/brick server2:/exp2/brick server3:/exp3/brick server4:/exp4/brick# <6>条带复制卷# 语法:
gluster volume create NEW-VOLNAME [stripe COUNT] [replica COUNT] [transport tcp | rdma | tcp, rdma] NEW-BRICK...
# 示例:
gluster volume create test-volume stripe 2 replica 2 transport tcp server1:/exp1/brick server2:/exp2/brick server3:/exp3/brick server4:/exp4/brick# 启动卷
gluster volume start test-volume
# 停止卷
gluster volume stop test-volume
# 删除卷 先停止卷后才能删除
gluster volume delete test-volume
# 查看卷
# 列出集群中的所有卷
gluster volume list   
# 查看集群中的卷信息
gluster volume info [all]
# 查看集群中的卷状态
gluster volume status [all]gluster volume status  [detail| clients | mem | inode | fd]# 配置卷
gluster volume set <VOLNAME> <OPTION> <PARAMETER># 扩展卷
gluster volume add-brick <VOLNAME> <NEW-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 

Brick管理

# 添加Brick
gluster volume add-brick test-volume 192.168.1.{151,152}:/mnt/brick2# 删除Brick
# 若是副本卷,则移除的Bricks数是replica的整数倍
gluster volume remove-brick test-volume 192.168.1.{151,152}:/mnt/brick2 start
# 在执行开始移除之后,可以使用status命令进行移除状态查看。
gluster volume remove-brick test-volume 192.168.1.{151,152}:/mnt/brick2 status#使用commit命令执行Brick移除,则不会进行数据迁移而直接删除Brick,符合不需要数据迁移的用户需求。
gluster volume remove-brick test-volume 192.168.1.{151,152}:/mnt/brick2 commit# 替换Brick
# 任务:把192.168.1.151:/mnt/brick0 替换为192.168.1.151:/mnt/brick2# <1>开始替换
gluster volume replace-brick test-volume 192.168.1.:/mnt/brick0 ..152:/mnt/brick2 start
# 异常信息:volume replace-brick: failed: /data/share2 or a prefix of it is already part of a volume 
# 说明 /mnt/brick2 曾经是一个Brick。具体解决方法
rm -rf /mnt/brick2/.glusterfssetfattr -x trusted.glusterfs.volume-id /mnt/brick2
setfattr -x trusted.gfid  /mnt/brick2# 如上,执行replcace-brick卷替换启动命令,使用start启动命令后,开始将原始Brick的数据迁移到即将需要替换的Brick上。# <2>查看是否替换完
gluster volume replace-brick test-volume 192.168.1.151:/mnt/brick0 ..152:/mnt/brick2 status# <3>在数据迁移的过程中,可以执行abort命令终止Brick替换。
gluster volume replace-brick test-volume 192.168.1.151:/mnt/brick0 ..152:/mnt/brick2 abort# <4>在数据迁移结束之后,执行commit命令结束任务,则进行Brick替换。使用volume info命令可以查看到Brick已经被替换。
gluster volume replace-brick test-volume 192.168.1.151:/mnt/brick0 .152:/mnt/brick2 commit# 此时我们再往 /sf/data/vs/gfs/rep2上添加数据的话,数据会同步到 192.168.1.152:/mnt/brick0和192.168.1.152:/mnt/brick2上。而不会同步到 192.168.1.151:/mnt/brick0 上。 

文件系统扩展属性

#获取文件扩展属性
getfattr -d -m . -e hex filename
getfattr -d -m "trusted.afr.*" -e hex filename

如果一句话反过来就必然不成立,那就根本没必要把这句话放进文档。—— Bob Martin