在 liunx 下部署Gluster FS分布式文件系统,以及Gluster FS遇到的一些问题解决,常用命令
概述
Gluster FS 是一个开源分布式文件系统,具有强大的横向扩展能力,可支持数PB存储容量和数千客户端,通过Infiniband RDMA 或Tcp/Ip 方式将许多廉价的x86 主机,通过网络互联成一个并行的网络文件系统。具有可扩展性、高性能、高可用性等特点。
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
- 排查掉线节点防火墙
- 如果仍然无法成功上线 参考 故障节点排除方案
- 重启掉线节点 glusterfs程序,使其重新上线
-
故障节点排除(非复制卷,慎用)
如果重启节点仍然无法解决 节点掉线
- 备份故障节点目录 /var/lib/glusterd 中的 glusterd.info 文件 与 peers 文件夹
- stop gluster 服务 删除 /var/lib/glusterd 目录下的所有文件
- 启动 gluster 服务 将备份的 glusterd.info文件与 peers 文件夹覆盖到 /var/lib/glusterd 中
- 重启 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