GlusterFS分布式存储数据的恢复机制(AFR)的说明
GlusterFSFS恢复数据都是基于副本卷来说的,GlusterFSFS复制卷是采用镜像的方式做的,并且是同步事务性操作。简单来说就是,某一个客户要写文件时,先把这个文件锁住,然后同时写两个或多个副本,写完后解锁,这个操作才算结束。那么在写某一个副本时发生故障没有写成功,或者运行过程中某一个节点断电了,造成数据丢失了,等等,就能通过另一个副本来恢复。
现在这里说一个疑问:
就是GlusterFS写副本时同步写的,就是客户端同时写两份数据,这样就会产生两倍的流量,测2副本的分布式复制卷性能时,能明确看到性能只有无副本的一半,或者只有读的一半;另一个分布式文件系统ceph就不是这样,是异步来写副本的,就是写到一个主OSD(ceph的存储单元)就返回了,这个OSD再通过内部网络异步写到其他的OSD,这样不是更快了。那么这两种方法有什么优缺点呢,那种比较好,或者各自为什么采用这样的方法?
说道恢复就有什么时候恢复,怎么恢复,凭什么说这个副本是好的,那个副本是坏的呢,这样的问题,一个一个来说吧。
1)首先,什么时候恢复?有这样三种场景会触发恢复,宕机的节点恢复正常时;副本缺失的文件被读写到时,比如运行如下命令:
ls -l <file-path-on-gluster-mount>; 每十分钟gluster会自行检查;手动下命令触发恢复,命令为gluster volume heal VOLNAME
2)怎么恢复?在这三种环境的任何一种下,gluster都会做检查,看需不需要来个恢复,检查什么呢,就是changelog,通过这个changelog来决定哪个副本坏了,要修复了。
3)凭什么说它坏了呢?刚才说了changelog会记录的,记录的什么呢,就是这个文件操作了什么,这个可以从文件的扩展属性反正出来,每一个文件都有一个扩展属性,主要记录了这个文件操作了什么,以及所有其他的副本操作了什么,副本的扩展属性如果不一样,那么就是有问题,要恢复自己,还是凭自己去恢复其他副本,都看这个扩展属性了,可以用命令getfattr -m . -d -e hex <FILENAME>,(和getfattr对应,有一个setfattr命令是可以设置这些属性的,具体命令为setfattr -n trusted.glusterfs.volume-id -v 0x937d9caf46544ed0a2d22e25edb23a75 /brick2,)这样设置了/brick2所在卷的id,查到扩展属性的值就是如下图所示的这样的一个东西:

这张图中值得注意的是,trusted.afr.repvol1-client-0,还有trusted.afr.repvol1-client-1,这两条就是自己的和副本的扩展属性了。先讲名字,repvol1是卷名,client是固定的,0或1是subvolume-index,是brick的一个编号。后面的值看起来一大串,一共有24bit,分三部分,每部分4byte,如下图所示:

分别表示数据,元数据,和entry,数据就是文件内容啦,元数据就是属性这些,entry我不知道翻译成什么好,就是gfid,那么这三个东西每一个变化了在这个扩展属性上都会做相应的变化,怎么变化呢,这三个部分分别是三个计数,操作文件之前要先写计数,简单来说可以理解为加一,操作完就减一,这样最后还是保持0,就表示OK。扩展属性被设置的文件和目录会在/<BRICK>/.glusterfs/indices/xattrop目录中有一个索引,具体如下所示,这个文件的内容好像是会定时清空的,啥时候清空呢?

每一个文件不仅记了自己的状态,还记了所有副本的状态,根据这些状态的组合,有下面几种情况:
IGNORANT:压根没有changelog,比如说这个文件副本已经丢失了,这样的情况changelog也跟着丢失了
INNOCENT :表示自己和其他副本的计数值都是0,表示双方都OK的
FOOL:表示自己的计数不为0,就是说加了没有减,这之间操作出现问题了,而其他副本为0,就是自己有问题别人没问题,让别人来恢复我
WISE:相反,自己是0,别人不是0 ,自己没问题别人有问题,自己来恢复别人。
涉及到数据恢复,有如下几种场景:
1)所有文件都是IGNORANT,这是手动触发了heal,也就是通过命令,这是怎么恢复呢,就找UID最小的文件作为源,去恢复大小为0的那些文件。
2)有一个节点为WISE,其他事FOOL,或其他非WISE的状态,那么就以WISE去恢复其他节点。
3)好几个都是WISE,就是好几个副本都说自己正常,同时还说别人不正常,这就是脑裂现象,这样就必须靠管理员手动找出脑裂的副本,自行判断哪些是对的哪些不对,自行恢复了,通常的做法留下一个对的副本,其他都删除,同样还要删除 /<BRICK>/.glusters这个目录下对应的文件,这样就只有一个WISE副本了,再出发heal,就以这个为源恢复所有副本了,触发命令为 gluster volume heal <VOLMUENAME> full,这里的full是一种自愈方式,全部恢复文件,另一种自愈方式叫diff,是差异化恢复。
通常脑裂的文件时读不出来的,读写它时会报Input/Output error,查看日志/var/log/glusterfs/glustershd.log你会有收获:

要找到脑裂文件,还有一个命令可以用,gluster volume heal <VOLMUENAME> info split-brain,它的输出如下:

正常情况下,所有brick的entries都是0,这里同一个副本一个是1一个是0,就是不对劲了,通过此方法找到脑裂的文件,再按上面的方法删除也可以。
GlusterFS分布式存储数据的恢复机制(AFR)的说明的更多相关文章
- GlusterFS分布式存储集群部署记录-相关补充
接着上一篇Centos7下GlusterFS分布式存储集群环境部署记录文档,继续做一些补充记录,希望能加深对GlusterFS存储操作的理解和熟悉度. ======================== ...
- GlusterFS分布式存储学习笔记
分布式文件系统 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源并不直接与本地节点相连,而是分布于计算网络中的一个或者多个节点的计算机上.目前意义上的分布 ...
- Glusterfs 分布式存储安装部署
Glusterfs 分布式存储部署 是存储当中可以选择的一种 现在很多虚拟化 云计算都在用软件存储 例如 ceph Glusterfs 等等 今天我们部署一下Glusterfs环境 GlusterFs ...
- Android提升篇系列:Activity recreate(Activity 重新创建/自我恢复)机制(一)
注:本文中的recreate是指当内存不足时,Activity被回收,但再次来到此Activity时,系统重新恢复的过程.例如:当Activity A到Activity B时,如果内存不足,A被回收, ...
- Android IOS WebRTC 音视频开发总结(七五)-- WebRTC视频通信中的错误恢复机制
本文主要介绍WebRTC视频通信中的错误恢复机制(我们翻译和整理的,译者:jiangpeng),最早发表在[这里] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blac ...
- HDFS副本机制&负载均衡&机架感知&访问方式&健壮性&删除恢复机制&HDFS缺点
副本机制 1.副本摆放策略 第一副本:放置在上传文件的DataNode上:如果是集群外提交,则随机挑选一台磁盘不太慢.CPU不太忙的节点上:第二副本:放置在于第一个副本不同的机架的节点上:第三副本:与 ...
- oracle误删除数据的恢复方法
学习数据库时,我们只是以学习的态度,考虑如何使用数据库命令语句,并未想过工作中,如果误操作一下,都可能导致无可挽回的损失.当我在工作中真正遇到这些问题时,我开始寻找答案. 今天主要以oracle数据库 ...
- Spark Streaming的容错和数据无丢失机制
spark是迭代式的内存计算框架,具有很好的高可用性.sparkStreaming作为其模块之一,常被用于进行实时的流式计算.实时的流式处理系统必须是7*24运行的,同时可以从各种各样的系统错误中恢复 ...
- Centos7下GlusterFS分布式存储集群环境部署记录
0)环境准备 GlusterFS至少需要两台服务器搭建,服务器配置最好相同,每个服务器两块磁盘,一块是用于安装系统,一块是用于GlusterFS. 192.168.10.239 GlusterFS-m ...
随机推荐
- 函数重载(overload)
重载的定义及特点 在同一个类中,允许存在一个以上的同名函数, 只要他们的参数个数或者参数类型不同(不仅指两个重载方法的参数类型不同,还指相同参数拥有不同的参数类型顺序)就构成重载. 重载只和参数列表有 ...
- 阿里八八β阶段Scrum(2/5)
今日进度 黄梅玲:尝试修复日程界面的不可点击问题 李嘉群:修改数据库,增加写入识别功能临时文本存入的项 张岳:信息抽取算法的编写 叶文滔:尝试侧边栏的信息调用,但因为侧边栏不是单独的活动,调用碰到了困 ...
- [ZJOI2005]午餐
嘟嘟嘟 贪心+dp. 首先贪心很容易想到,把吃饭时间长的人排在前面.因为打饭时间的顺序对最终答案没有影响,所以可以以吃饭时间为关键字排序. 然后就是dp了(我当时还自信满满的贪心交了一发--显然WA啊 ...
- [NOI2005]瑰丽华尔兹
嘟嘟嘟 这题大家应该都做过,就是暴力dp+单调队列优化. dp方程其实很好想,最初是这样的:dp[t][i][j]表示时刻\(t\)后,走到\((i, j)\)格子的最远路程,于是就有: \[dp[t ...
- Spring Component注解处理过程
接下来: org.springframework.context.annotation.ComponentScanBeanDefinitionParser#parse方法展开加载过程:
- !important的用法
如果写成:a{color:teal !important},IE6和其它高版本浏览器都认识,(IE6虽然不认识!important,但它还是能够认识!important之前的color:teal这个属 ...
- 2017-2018-2 20155314《网络对抗技术》Exp2 后门原理与实践
2017-2018-2 20155314<网络对抗技术>Exp2 后门原理与实践 目录 实验要求 实验内容 实验环境 预备知识 1.后门概念 2.常用后门工具 实验步骤 1 用nc或net ...
- 转载 锁机制与原子操作 <第四篇>
一.线程同步中的一些概念 1.1临界区(共享区)的概念 在多线程的环境中,可能需要共同使用一些公共资源,这些资源可能是变量,方法逻辑段等等,这些被多个线程共用的区域统称为临界区(共享区),临界区的资源 ...
- day12 Python数字,字符串,列表,元祖,字典总结
一.数字 int() 二.字符串 replace/find/join/strip/startswith/split/upper/lower/format tempalte = "i am { ...
- python3 列表的赋值和深浅拷贝
'''列表赋值:不会创建新对象两个列表的内存地址一样'''# lst1 = ["apple", "banana", ["blueberry" ...