概述

今天主要介绍一下fastdfs磁盘恢复的过程,大家一起来看看吧~


一、磁盘恢复概述

顾名思义,磁盘恢复也就是一台服务器的某个磁盘坏掉,换了一个新的硬盘,然后将旧磁盘本应该有的数据拷贝到新硬盘的过程。FastDFS原生支持该过程,可以自动检测,并完成。

FastDFS推荐的方式是一个磁盘挂载成一个Store-Path,换了一个新的磁盘后,该Store_path目录下的数据丢失了,但是这部分数据在同组的其他Storage都有,因此只要从对应的Storage上拷贝到目录下的数据即可。

FastDFS-Storaged程序在启动时会检查每个Store_path目录下的子目录个数,默认情况下,每个Store_path下面会创建两级256个子目录。当非首次启动时,发现某个Store_path下没有任何目录,则会进入磁盘恢复过程。


二、磁盘恢复过程

磁盘恢复过程包括三个步骤:RecoveryStart、RecoveryStore、RecoveryFinish;这三个步骤之中的RecoveryStore可以多次执行,因此在恢复过程中记录了中间状态,因此即使在磁盘恢复过程中宕机或停止,下次再次启动时还是可以从上次的状态继续恢复数据。而RecoveryStart与RecoveryFinish都是只执行一次。

磁盘恢复过程的两个状态文件: .recovery.mark;.binlog.recovery

这两个状态文件保存与StorePath目录下,用于记录恢复过程的状态。

.recovery.mark文件包括三个字段:

  • saved_storage_status= ##表示状态
  • binlog_offset= ##表示恢复的binlog偏移量
  • fetch_binlog_done= ##表示是否已经下载binlog

.binlog.recovery文件,记录的是需要恢复的文件binlog,内容类似下面这样的记录:

1910858030 C M00/00/00/CmQPRlPa8y6AbW3ZAAADWjN_G5k15.conf

1、磁盘恢复开始RecoveryStart

在Storaged启动时,会依次检查每一个StorePath,首次启动时会为每个StorePath创建两级256个子目录(默认256,可配置),因此当非首次启动时,检测到StorePath下不存在这两级的256个子目录,那么程序就会认为该StorePath数据丢失,开始进行这个StorePath的磁盘恢复。

该过程在storage_disk_recovery_start函数之中。

RecoveryStart执行如下操作:

1)创建状态文件 .recovery.mark;.binlog.recovery,并初始化。

2)连接Tracker,查询该Storage的最大状态值(该值用于在磁盘恢复完成后,恢复到之前的状态),查询所在组的Storage列表,从中获取一个状态为Active的Storage,若获取不到Active的Storage则睡眠5秒后再次尝试;获取到的该Storage我们称为源Storage。

3)向Tracker报告,将自己状态设置成RECOVERY。

4)向源Storage发送FETCH_ONE_PATH_BINLOG命令,参数为group_name、store_path_index;源Storage收到该命令后从头遍历整个binlog,过滤出符合下列条件的binlog返回来:binlog文件的目录为指定的store_path;该binlog的操作类型为Create方式;该binlog对应的文件在文件系统中还存在;

5)将从源Storage返回的binlog写入到.binlog.recovery文件之中,若完成收到源Storage的整个回复,则设置.recovery.mark文件中的fetch_binlog_done标志为1;表示已经完成binlog文件的获取,设置saved_storage_status为第二步中查询到的最大状态值。

6)检查若采用合并存储,则需要将该binlog进行分割(由于合并存储存在缺陷,这里就不在详细叙述)。

2、磁盘恢复下载文件

这个步骤也就是真实地从一个源Storage上下载文件。详见storage_disk_recovery_store函数。如下:

1)检查是否存在.recovery.mark, .binlog.recovery文件,若任何一个不存在则返回。

2)向RecoveryStart一样,向Tracker请求,查找该组内的一个状态为Active的Storage作为源Storage。

3)打开.recovery.mark 文件,读取binlog_offset值,打开.binlog.recovery文件,定位到binlog_offset这个位置,也就是从上次最后保存的状态开始继续下载文件。

4)依次读取.binlog.recovery文件的后面记录,对于每一条记录都从源Storage中去下载对应文件

5)每下载1000个文件,将状态值binlog_offset写入到.recovery.mark 文件之中

6)当所有的binlog对应文件都下载完成后,向所有Tracker报告恢复之前的最高状态(该状态在恢复开始时从Trakcer中查询得到,见1.2的描述)。

3、磁盘恢复结束

该步骤清理开始时创建的临时文件 .recovery.mark, .binlog.recovery


三、注意

1、磁盘恢复是在Storaged程序的初始化过程中,此时进程还没有变成后台进程,因此若知道要进入磁盘恢复,最好使用nohup方式来启动。因此如果数据量大,该过程可能要持续很久,进程一致处于控制台。

2、恢复过程中需要下载对应的binlog与文件,可能到A机器下载binlog,而到B机器下载文件。所有的文件只会在选择好的原Storage上下载,因此压力会集中到一台的Storage上。

3、下载文件的过程中是以单线程,同步的方式进行的,因此不能最大化磁盘IO或者网络性能。


觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

catia保存成stp文件时部件丢失_超详细的分布式文件系统FastDFS磁盘恢复介绍相关推荐

  1. catia保存成stp文件时部件丢失_在线教学文件同步神器——坚果云

    教师在线办公期间,有教研组.备课组资源共享与协同办公的需求.在此推荐一款应用--坚果云[1],可以实现市面上绝大部分设备间的文件共享和同步,极高地提高在文件管理方面的效率. 推荐指数:★★★★★ ↓教 ...

  2. catia保存成stp文件时部件丢失_电脑硬盘恢复教程,简单复原硬盘丢失数据的做法...

    电脑硬盘恢复教程?大家应该都听过数据恢复的案例,例如一些文件数据被损坏,使用技术手段给修复回来等.电脑的数据恢复也是如此,也是一种技术手段,硬盘数据恢复大家可能都会接触到,因此我们就来看看硬盘数据恢复 ...

  3. iframe关闭时触发事件_超详细的mysql数据库事件--定时任务介绍及日常管理

    概述 由于最近在做某些日志表的清理工作,会用到定时任务,所以这里也简单介绍一下mysql如何用事件来实现定时任务. 后面会介绍两个日志表清理实现方案,一种是传统的定时delete,另一种会稍微复杂点, ...

  4. 解决Scrapy抓取中文网页保存为json文件时中文不显示而是显示unicode的问题

    注意:此方法跟之前保存成json文件的写法有少许不同之处,注意区分 情境再现: 使用scrapy抓取中文网页,得到的数据类型是unicode,在控制台输出的话也是显示unicode,如下所示 {'au ...

  5. tcpdump抓包ftp协议_tcpdump抓包并保存成cap文件

    首选介绍一下tcpdump的常用参数 tcpdump采用命令行方式,它的命令格式为: tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ] [ -i 网络接 ...

  6. python将数据保存为json文件时,打开json文件里面的中文发现是unicode码

    最近要将爬取的数据通过json.dump处理后保存成json文件,程序一切运行正常,但是打 开保存之后的json文件发现除了字母,原来的字典数据里面的中文全部变成了unicode 码,像下面这个样子 ...

  7. Unity3d 提取mesh并保存成asset文件

    Unity3d 提取mesh并保存成asset文件 应用背景 下载链接 使用步骤 贴出脚本 应用背景 有些FBX文件过大,但是只用其中的一个mesh时,我们可以考虑把这个mesh单独提取出来保存问as ...

  8. 解决使用FireFox下Flash上传文件时SESSION丢失的问题(swfupload)

    解决使用FireFox下Flash上传文件时SESSION丢失的问题(swfupload) 这几天在项目中遇到的问题,稍微整理一下. HTML 表单是我们常用来进行浏览器与服务器数据交互的途径,除了传 ...

  9. csv逗号分割不兼容 解决_关于Excel保存为csv文件时提示 “可能含有与CSV(逗号分隔)不兼容的功能”...

    关于Excel保存为csv文件时提示"可能含有与CSV(逗号分隔)不兼容的功能" 当我们用Excel去保存一个文件为 .csv文件时,会弹出对话框: *.csv 可能含有与CSV( ...

  10. 解决python 保存json到文件时 中文显示16进制编码的问题

    解决python 保存json到文件时 中文显示16进制编码的问题 参考文章: (1)解决python 保存json到文件时 中文显示16进制编码的问题 (2)https://www.cnblogs. ...

最新文章

  1. 编译器设计-解析类型
  2. 经典HTML5学习资源
  3. uvc音频传输协议_蓝牙中的三种音频编码:Apt-X、SBC、AAC,请问分别有什么区别?...
  4. Pydoc 本地 HTML 形式查看
  5. matlab scatter cdata,matlab cdatamapping
  6. 趣谈NAT和防火墙的对话+防火墙静态PAT的应用
  7. Struts的MVC和Spring的MVC的区别
  8. Tampermonkey油猴插件各种浏览器下载教程【chrome、firefox、Edge、360、QQ、Safari等】
  9. Centos搭建FTP服务
  10. mysql md5函数加密
  11. 进程间的通信——无名管道
  12. esrgan_港中文-商汤联合实验室:ECCV2018 PIRM-SR 超分辨率比赛冠军:ESRGAN(已开源)...
  13. 检索COM类工厂中CLSID为{00024500-0000-0000-C000-000000000046}的组件时失败
  14. linux 判断文件上传轨迹,linux各种常用命令
  15. 引入LeakCanary到项目
  16. 存储过程中定义sql语句_学习SQL:用户定义的存储过程
  17. H5图像遮罩-遁地龙卷风
  18. java程序员面试真题及详解2017(纯手动)
  19. 魔兽8.0最新服务器人口普查,魔兽世界8.0最新人口普查: DH稳坐第一职业宝座 同盟种族人数惨淡...
  20. LM2903器件使用说明

热门文章

  1. 理解 Linux 配置文件【转】
  2. Sublime Text 如何连接 FTP/SFTP ——图文详细教程
  3. unity使用屏幕后处理实现闪烁特效,创建新的shader文件过程
  4. [vue-router] Duplicate named routes definition: { name: “XXX“, path: “XXX“ }
  5. mysql多表条件查询,mysql实现RBAC权限管理sql语句详解
  6. zabbix监控mysql集群_zabbix监控elasticsearch集群
  7. maven工程打包老是报错_Maven 项目打包及启动时的报错解决
  8. java ip范围_Java判断IP是否在指定范围
  9. java我的世界1.6.2_我的世界1.6.2
  10. AJAX 跨域访问 — 方法大全