GlusterFS更换故障Brick

1 前言

笔者公司内有一套GlusterFS分布式存储,最近数据分区的文件系统提示错误,群集有一个Brick需要替换掉。

基于稳妥操作的原则,笔者要先搭建测试环境并通过测试后才能在真实环境中执行,以下是笔者的测试文档,给有需要的博友参阅,另外笔者在发表本文时已经在生产环境通过验证。

服务器的故障日志(有修复文件系统方法的博友欢迎指教):

cat /var/log/messages
 

可以看到如下信息:

Mar 21 14:58:04 GH01 kernel: XFS (dm-5): xfs_log_force: error 5 returned.
 

2 实践部分

2.1 环境信息

2.1.1 主机信息

GlusterH0[1-5]:

hostname=GlusterH0[1-5].cmdschool.org

ipaddress=10.168.0.19[1-5]

2.1.2 名称解析配置

In GlusterH0[1-6]

echo "10.168.0.191 GlusterH01.cmdschool.org GH01" >> /etc/hosts
echo "10.168.0.192 GlusterH02.cmdschool.org GH02" >> /etc/hosts
echo "10.168.0.193 GlusterH03.cmdschool.org GH03" >> /etc/hosts
echo "10.168.0.194 GlusterH04.cmdschool.org GH04" >> /etc/hosts
echo "10.168.0.195 GlusterH05.cmdschool.org GH05" >> /etc/hosts
 

2.1.3 配置YUM源

In GlusterH0[1-6]

yum install -y centos-release-gluster38
 

2.1.4 关闭防火墙

In GlusterH0[1-6]

/etc/init.d/iptables stop
chkconfig iptables off
 

2.2 配置数据存储根目录

In GlusterH0[1-5]

2.2.1 新建分区

fdisk /dev/sdb
 

详细向导如下:

Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x089fd1ab.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u'). Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-26108, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-26108, default 26108):
Using default value 26108 Command (m for help): w
The partition table has been altered! Calling ioctl() to re-read partition table.
Syncing disks.
 

2.2.2 发现并校验

partx /dev/sdb
ls /dev/sdb*
 

2.2.3 创建文件系统

mkfs.xfs -i size=512 /dev/sdb1
 

2.2.4 配置挂载

mkdir -p /data
echo '/dev/sdb1 /data xfs defaults 1 2' >> /etc/fstab
mount -a && mount
 

2.3 配置glusterfs服务端

In GlusterH0[1-5] :

2.3.1 安装yum源

yum install -y glusterfs-server
 

2.3.2 启动服务

/etc/init.d/glusterd start
chkconfig glusterd on
 

2.4 配置信任池

In GlusterH01:

gluster peer probe GH02
gluster peer probe GH03
gluster peer probe GH04
 

显示如成功信息:

peer probe: success.
 

检查信任池状态

gluster peer status
 

显示如下:

Number of Peers: 3

Hostname: GH02
Uuid: e935be20-6157-4bc6-804b-a6901850211f
State: Accepted peer request (Connected) Hostname: GH03
Uuid: d91cf978-71d7-4734-b395-fae7ccf4c040
State: Accepted peer request (Connected) Hostname: GH04
Uuid: e05ea224-72f7-48c5-a73a-eeeb253d171d
State: Accepted peer request (Connected)
 

检查本与其他服务器的连接状态

netstat -antp | grep glusterd
 

显示如下:

tcp        0      0 0.0.0.0:24007               0.0.0.0:*                   LISTEN      1213/glusterd
tcp 0 0 10.168.0.191:24007 10.168.0.192:49150 ESTABLISHED 1213/glusterd
tcp 0 0 10.168.0.191:49149 10.168.0.193:24007 ESTABLISHED 1213/glusterd
tcp 0 0 10.168.0.191:24007 10.168.0.193:49149 ESTABLISHED 1213/glusterd
tcp 0 0 10.168.0.191:49151 10.168.0.192:24007 ESTABLISHED 1213/glusterd
tcp 0 0 10.168.0.191:49150 10.168.0.194:24007 ESTABLISHED 1213/glusterd
tcp 0 0 10.168.0.191:24007 10.168.0.194:49151 ESTABLISHED 1213/glusterd
 

注:以上可以看出本机与其他的每个brick都有两个TCP连接,一共6个。

2.5 配置GlusterFS卷

2.5.1 配置存储位置

In GlusterH0[1-4] :

mkdir -p /data/brick1/gv0
 

2.5.2 创建Gluster卷

In GlusterH01 :

gluster volume create gv0 replica 2 transport tcp GH01:/data/brick1/gv0 GH02:/data/brick1/gv0 GH03:/data/brick1/gv0 GH04:/data/brick1/gv0
 

显示如成功信息:

volume create: gv0: success: please start the volume to access data
 

2.5.3 启动GlusterFS卷

In GlusterH01 :

gluster volume start gv0
 

显示如成功信息:

volume start: gv0: success
 

2.5.4 验证卷的信息

In GlusterH01 :

gluster volume info
 

显示如下:

Volume Name: gv0
Type: Distributed-Replicate
Volume ID: cfea514c-cdce-4ae4-bcd9-bf56f4173271
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: GH01:/data/brick1/gv0
Brick2: GH02:/data/brick1/gv0
Brick3: GH03:/data/brick1/gv0
Brick4: GH04:/data/brick1/gv0
Options Reconfigured:
transport.address-family: inet
performance.readdir-ahead: on
nfs.disable: on
 

2.6 配置Gluster客户端

In GlusterH01 :

2.6.1 安装客户端相关包

yum install -y glusterfs-fuse
 

2.6.2 手动挂载卷gv0到本地

mount -t glusterfs GH01:/gv0 /mnt
 

2.7 测试Gluster卷

2.7.1 写入测试

In GlusterH01 :

for i in `seq -w 1 100`; do cp -rp /var/log/messages /mnt/copy-test-$i; done
 

2.7.2 写入确认

In GlusterH01 :

ls -lA /mnt/ | wc -l
 

In GlusterH0[1-4] :

ls -lA /data/brick1/gv0/
 

2.8 模拟brick故障

2.8.1 查看当前存储状态

In GlusterH01 :

gluster volume status
 

显示如下:

Status of volume: gv0
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick GH01:/data/brick1/gv0 49153 0 Y 1447
Brick GH02:/data/brick1/gv0 49153 0 Y 1379
Brick GH03:/data/brick1/gv0 49153 0 Y 1281
Brick GH04:/data/brick1/gv0 49153 0 Y 1375
Self-heal Daemon on localhost N/A N/A Y 1506
Self-heal Daemon on GH02 N/A N/A Y 1440
Self-heal Daemon on GH04 N/A N/A Y 1430
Self-heal Daemon on GH03 N/A N/A Y 1430 Task Status of Volume gv0
------------------------------------------------------------------------------
There are no active volume tasks
 

注:注意到Online项全部为“Y”

2.8.2 制造故障

In GlusterH01 :

vim /etc/fstab
 

注释掉如下行:

#/dev/sdb1 /data xfs defaults 1 2
 

重启服务器

reboot
 

2.8.3 查看当前存储状态

In GlusterH01 :

gluster volume status
 

显示如下:

Status of volume: gv0
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick GH01:/data/brick1/gv0 N/A N/A N N/A
Brick GH02:/data/brick1/gv0 49153 0 Y 1379
Brick GH03:/data/brick1/gv0 49153 0 Y 1281
Brick GH04:/data/brick1/gv0 49153 0 Y 1375
Self-heal Daemon on localhost N/A N/A Y 1484
Self-heal Daemon on GH02 N/A N/A Y 1453
Self-heal Daemon on GH03 N/A N/A Y 1443
Self-heal Daemon on GH04 N/A N/A Y 1444 Task Status of Volume gv0
------------------------------------------------------------------------------
There are no active volume tasks
 

注:注意到GH01的Online项为“N”

注:文件系统故障,假设物理硬盘没有问题或已经更换阵列中的硬盘

2.9 恢复故障brick方法

2.9.1 结束故障brick的进程

In GlusterH01 :

gluster volume status
 

显示如下:

Status of volume: gv0
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick GH01:/data/brick1/gv0 N/A N/A N N/A
Brick GH02:/data/brick1/gv0 49153 0 Y 1379
Brick GH03:/data/brick1/gv0 49153 0 Y 1281
Brick GH04:/data/brick1/gv0 49153 0 Y 1375
Self-heal Daemon on localhost N/A N/A Y 1484
Self-heal Daemon on GH02 N/A N/A Y 1453
Self-heal Daemon on GH03 N/A N/A Y 1443
Self-heal Daemon on GH04 N/A N/A Y 1444 Task Status of Volume gv0
------------------------------------------------------------------------------
There are no active volume tasks
 

注:如果状态Online项为“N”的GH01存在PID号(不显示N/A)应当使用如下命令结束掉进程方可继续下面步骤。

kill -15 pid
 

2.9.2 创建新的数据目录

In GlusterH01:

mkfs.xfs -i size=512 /dev/sdb1
 

编辑fstab

vim /etc/fstab
 

去掉注释:

/dev/sdb1 /data xfs defaults 1 2
 

重新挂载文件系统:

mount -a
 

增加新的数据存放文件夹(不可以与之前目录一样)

mkdir -p /data/brick1/gv1
 

2.9.3 查询故障节点的备份节点(gh02)目录的扩展属性

In GlusterH01:

ssh gh02 getfattr -d -m. -e hex /data/brick1/gv0
 

显示如下:

getfattr: Removing leading '/' from absolute path names
# file: data/brick1/gv0
security.selinux=0x756e636f6e66696e65645f753a6f626a6563745f723a686f6d655f726f6f745f743a733000
trusted.gfid=0x00000000000000000000000000000001
trusted.glusterfs.dht=0x0000000100000000000000007ffffffe
trusted.glusterfs.volume-id=0xcfea514ccdce4ae4bcd9bf56f4173271
 

2.9.4 挂载卷并触发自愈

In GlusterH01:

1)将卷挂到mnt目录下

mount -t glusterfs GH01:/gv0 /mnt
 

2)新建一个卷中不存在的目录并删除

mkdir /mnt/testDir001
rmdir /mnt/testDir001
 

3)设置扩展属性触发自愈

setfattr -n trusted.non-existent-key -v abc /mnt
setfattr -x trusted.non-existent-key /mnt
 

2.9.5 检查当前节点是否挂起xattrs

In GlusterH01:

1)再次查询故障节点的备份节点(gh02)目录的扩展属性

ssh gh02 getfattr -d -m. -e hex /data/brick1/gv0
 

发现如下:

# file: data/brick1/gv0
security.selinux=0x756e636f6e66696e65645f753a6f626a6563745f723a686f6d655f726f6f745f743a733000
trusted.afr.dirty=0x000000000000000000000000
trusted.afr.gv0-client-0=0x000000000000000200000002
trusted.gfid=0x00000000000000000000000000000001
trusted.glusterfs.dht=0x0000000100000000000000007ffffffe
trusted.glusterfs.volume-id=0xcfea514ccdce4ae4bcd9bf56f4173271 getfattr: Removing leading '/' from absolute path names
 

注:留意第4行,表示xattrs已经将源标记为gh02:/data/brick1/gv0

2)检查卷的状态是否显示需要替换

In GlusterH01:

gluster volume heal gv0 info
 

显示如下:

Brick GH01:/data/brick1/gv0
Status: Transport endpoint is not connected
Number of entries: - Brick GH02:/data/brick1/gv0
/
Status: Connected
Number of entries: 1 Brick GH03:/data/brick1/gv0
Status: Connected
Number of entries: 0 Brick GH04:/data/brick1/gv0
Status: Connected
Number of entries: 0
 

注:状态提示传输端点未连接(第2行)

2.9.6 使用强制提交完成操作

In GlusterH01:

gluster volume replace-brick gv0 GH01:/data/brick1/gv0 GH01:/data/brick1/gv1 commit force
 

提示如下表示正常完成:

volume replace-brick: success: replace-brick commit force operation successful
 

注:也可以将数据恢复到另外一台服务器,详细命令如下(可选):

gluster peer probe GH05
gluster volume replace-brick gv0 GH01:/data/brick1/gv0 GH05:/data/brick1/gv0 commit force
 

2.9.7 检查存储的在线状态

In GlusterH01:

gluster volume status
 

显示如下:

Status of volume: gv0
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick GH01:/data/brick1/gv1 49153 0 Y 1658
Brick GH02:/data/brick1/gv0 49153 0 Y 1406
Brick GH03:/data/brick1/gv0 49153 0 Y 1371
Brick GH04:/data/brick1/gv0 49153 0 Y 1406
Self-heal Daemon on localhost N/A N/A Y 1663
Self-heal Daemon on GH04 N/A N/A Y 1703
Self-heal Daemon on GH03 N/A N/A Y 1695
Self-heal Daemon on GH02 N/A N/A Y 1726 Task Status of Volume gv0
------------------------------------------------------------------------------
There are no active volume tasks
 

另外,如果更换到其他服务器状态显示如下:

Status of volume: gv0
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick GH05:/data/brick1/gv0 49152 0 Y 1448
Brick GH02:/data/brick1/gv0 49153 0 Y 1270
Brick GH03:/data/brick1/gv0 49153 0 Y 1328
Brick GH04:/data/brick1/gv0 49153 0 Y 1405
Self-heal Daemon on localhost N/A N/A Y 1559
Self-heal Daemon on GH02 N/A N/A Y 1489
Self-heal Daemon on GH03 N/A N/A Y 1479
Self-heal Daemon on GH04 N/A N/A Y 1473
Self-heal Daemon on GH05 N/A N/A Y 1453 Task Status of Volume gv0
------------------------------------------------------------------------------
There are no active volume tasks
 

参阅文档

===================================

官方更换操作:

http://gluster.readthedocs.io/en/latest/Administrator%20Guide/Managing%20Volumes/#shrinking-volumes

gfs故障恢复的更多相关文章

  1. 典型分布式系统分析: GFS

    本文是典型分布式系统分析系列的第二篇,关注的是GFS,一个分布式文件存储系统.在前面介绍MapReduce的时候也提到,MapReduce的原始输入文件和最终输出都是存放在GFS上的,GFS保证了数据 ...

  2. GFS(Google File System,谷歌文件系统)----(1)读写一致性

    GFS副本控制协议--中心化副本控制协议 对于副本集的更新操作有一个中心节点来协调管理,将分布式的并发操作转化为单点的并发操作,从而保证副本集内各节点的一致性.在GFS中,中心节点称之为Primary ...

  3. Java RMI 实现一个简单的GFS(谷歌文件系统)——背景与设计篇

    目录 背景 系统设计 1. 系统功能 2. Master组件 2.1 命名空间 2.2 心跳机制 2.3 故障恢复和容错机制 3. ChunkServer组件 3.1 本地存储 3.2 内存命中机制 ...

  4. HDFS 与 GFS 的设计差异

    后端分布式系列」前面关于 HDFS 的一些文章介绍了它的整体架构和一些关键部件的设计实现要点. 我们知道 HDFS 最早是根据 GFS(Google File System)的论文概念模型来设计实现的 ...

  5. 故障恢复和恢复模式(Crash Recovery & Recovery Models)

    数据库的恢复模型是否影响故障恢复,在简单恢复模式里,你是否会丢失事务?在今天的文章里我想谈下这点,详细讨论下. 恢复模式(Recovery Models) 对于这个问题的最简单的答案是不会:恢复模型不 ...

  6. VMware下CentOS6.8配置GFS文件系统

    1.GFS介绍 GFS简要说明,它有两种: 1. Google文件系统:GFS是GOOGLE实现的是一个可扩展的分布式文件系统,用于大型的.分布式的.对大量数据进行访问的应用.它运行于廉价的普通硬件上 ...

  7. [MapReduce] Google三驾马车:GFS、MapReduce和Bigtable

    声明:此文转载自博客开发团队的博客,尊重原创工作.该文适合学分布式系统之前,作为背景介绍来读. 谈到分布式系统,就不得不提Google的三驾马车:Google FS[1],MapReduce[2],B ...

  8. Google 云计算中的 GFS 体系结构

          google 公司的很多业务具有数据量巨大的特点,为此,google 公司研发了云计算技术.google 云计 算结构中的 google 文件系统是其云计算技术中的三大法宝之一.本文主要介 ...

  9. 再读GFS论文

    http://loopjump.com/gfs_paper_note/ 再读GFS的一些笔记.主要涉及GFS架构.Chunk大小选择的一些折中考量.元数据管理及锁.写数据流程.GFS一致性模型的理解. ...

随机推荐

  1. python ddt 传多个参数值示例

    import unittest from ddt import ddt,data,file_data,unpack @ddt class TestDDT(unittest.TestCase): lis ...

  2. Atitit 提升效率 界面gui方面的前后端分离与cbb体系建设 规范与推荐标准

    Atitit 提升效率 界面gui方面的前后端分离与cbb体系建设 规范与推荐标准 1. 界面gui方面的前后端分离重大意义1 2. 业务逻辑也适当的迁移js化1 3. 常用分离方法2 3.1. 页面 ...

  3. linux每日命令(29):chown命令

    chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID:组可以是组名或者组ID:文件是以空格分开的要改变权限的文件列表,支持通配符.系统管理员经常使用chown命令,在将文件拷贝 ...

  4. windowsclient开发--为你的client进行国际化

    之前博客讲过函数: GetUserDefaultUILanguage Returns the language identifier for the user UI language for the ...

  5. SQL导出数据到EXCEL的问题

    DTS导出向导 不会 我这有个是用C#语言写的 try { Excel.Application xApp = new Excel.ApplicationClass(); xApp.Visible = ...

  6. asp.net mvc 3.0 知识点整理 ----- (4).asp.net mvc 3 和asp.net mvc 4 对比

    asp.net mvc的版本更新很快,每个版本都在前一个版本的基础上,进行性能的优化和功能的完善和提升. 以下,便是我对比了下两个版本,发现最基本的差异.(更新补充中..) 一.关于配置类Global ...

  7. oracle 学习笔记(2)创建表空间及用户授权

    原文:http://www.cnblogs.com/smartvessel/archive/2009/07/06/1517690.html Oracle安装完后,其中有一个缺省的数据库,除了这个缺省的 ...

  8. Markdown 字体

    在 Markdown 中,使用 * 来表示斜体,使用 ** 来表示加粗,使用 <font> 标签来设置字体 .字号与颜色 *我是斜体* **我是粗体** <font face=&qu ...

  9. SyntheticEvent

    在react 的事件中使用SyntheticEvent 就会出现下面的报错 <input onChange={async e => { await foo() ... }} /> 那 ...

  10. Linux Platform驱动模型(三) _platform+cdev

    平台总线是一种实现设备信息与驱动方法相分离的方法,利用这种方法,我们可以写出一个更像样一点的字符设备驱动,即使用cdev作为接口,平台总线作为分离方式: xjkeydrv_init():模块加载函数 ...