GlusterFSFS恢复数据都是基于副本卷来讲的,GlusterFSFS复制卷是采用镜像的方式作的,而且是同步事务性操做。简单来讲就是,某一个客户要写文件时,先把这个文件锁住,而后同时写两个或多个副本,写完后解锁,这个操做才算结束。那么在写某一个副本时发生故障没有写成功,或者运行过程当中某一个节点断电了,形成数据丢失了,等等,就能经过另外一个副原本恢复。bash
如今这里说一个疑问:
就是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,以下图所示:spa
分别表示数据,元数据,和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,是差别化恢复。blog
一般脑裂的文件时读不出来的,读写它时会报Input/Output error,查看日志/var/log/glusterfs/glustershd.log你会有收获:索引
要找到脑裂文件,还有一个命令能够用,gluster volume heal <VOLMUENAME> info split-brain,它的输出以下:
正常状况下,全部brick的entries都是0,这里同一个副本一个是1一个是0,就是不对劲了,经过此方法找到脑裂的文件,再按上面的方法删除也能够。