FastDFS不同步怎么破

FastDFS文件同步原理 4. 上述第二条规则有个例外,就是新增加一台storage server时,由已有的一台storage server将已有的所有数据(包括源头数据和备份数据)同步给该新增服务器。服务器宕机,下次重新启动,重新加载同步文件,发现没有同步完成。之间的同步都是由一个独立线程负责的,这个线程中的所有操作都是以同步方式执行的。是否有该文件,只要解析文件的创建时间,然后与该值作比较,若该值大于创建创建时间,说明该。(大写的都是),则将该行指定的操作同步给对方(非源操作不需要同步),同步成功后更新。 阅读详情

一、背景说明

FastDFS是一款开源的分布式文件系统,具体介绍就不说了,有兴趣的可以自行百度下。

 

以下是官方的架构图:

 

 

一次完整的写交互过程如下:

1、Client向Tracker查询可用的Storage;

2、Tracker随机返回一个Storage;

3、Client向Storage发起写请求;

 

一次完整的读交互:

1、Client向Tracker查询可用的Storage;

2、Tracker随机返回一个Storage;

3、Client向Storage发起读请求;

 

可以看到每个Storage都是对等的,即每个Storage上存储的文件都是全量的。

 

最近一朋友线上FastDFS服务器老是报文件不存在的错误,版本为5.11:

  •  
[2020-08-12 23:16:37] WARNING - file: storage_service.c, line: 6899, client ip: xx.xx.xxx.xxx, logic file: 06/75/xxxx.jpg not exist

架构如下:

2台Tracker,2台Storage。

 

每台机器上都有上述报错。

 

二、FastDFS同步机制分析

 

我们先分析FastDFS如何实现文件在不同服务器的同步的,FastDFS是以binglog的格式同步各自上传/修改的文件的,具体位置在安装目录的data/sync目录下,文件一般叫binlog.000这样,以下为我开发机的截图:

 

 

具体内容如下:

1589182799 C M00/00/00/rBVrTV65AU-ACKi2AAARqXyG2io334.jpg1589182885 C M00/00/00/rBVrTV65AaWAAYwKAAARqXyG2io765.jpg1589427410 C M00/00/00/rBVrTV68vNKAbceuAAARqXyG2io657.jpg

 

第1列是时间戳,第2列是修改内容,示例中大部分是创建文件,所以是C,其它参考文件 storage/storage_sync.h:

 

#define STORAGE_OP_TYPE_SOURCE_CREATE_FILE  'C'  //upload file#define STORAGE_OP_TYPE_SOURCE_APPEND_FILE  'A'  //append file#define STORAGE_OP_TYPE_SOURCE_DELETE_FILE  'D'  //delete file#define STORAGE_OP_TYPE_SOURCE_UPDATE_FILE  'U'  //for whole file update such as metadata file#define STORAGE_OP_TYPE_SOURCE_MODIFY_FILE  'M'  //for part modify#define STORAGE_OP_TYPE_SOURCE_TRUNCATE_FILE  'T'  //truncate file#define STORAGE_OP_TYPE_SOURCE_CREATE_LINK  'L'  //create symbol link

 

有了binglog只是保证不同服务器可以同步数据了,真正实现还有很多东西要考虑:

1、每次是全量还是增量同步,如果是增量,如何记录最后同步的位置,同步的位置做持久化吗;

2、binlog如何保证可靠性,即FastDFS实现的时候是binlog刷磁盘即fsync后才返回给客户端吗;

 

关于第1点,FastDFS是实现增量同步的,最后位置保存在安装目录的data/sync目录下,扩展名是mark的文件,具体格式是这样的:

172.21.107.236_23000.mark

 

即 IP_端口.mark。

 

如果集群中有两个Storage,172.21.104.36, 172.21.104.35,则在36上有1个mark文件:172.21.104.35_23000.mark,而在35上mark文件也只有1个:

172.21.104.36_23000.mark。

 

mark文件具体内容如下:​​​​​​​

binlog_index=0binlog_offset=3422need_sync_old=1sync_old_done=1until_timestamp=1596511256scan_row_count=118sync_row_count=62

 

关键参数是binlog_offset,即binlog中最后同步成功的偏移量,每同步一个文件后,都会将偏移量更新。

 

那binlog是异步还是同步将binlog同步给其它的Storage呢,答案是异步,具体可以参考函数:storage_sync_thread_entrance,这个函数是线程的入口,FastDFS在启动时会启动这个线程用来同步:

​​​​​​​

int storage_sync_thread_start(const FDFSStorageBrief *pStorage){  int result;  pthread_attr_t pattr;  pthread_t tid;
 //省略非关键代码
  /*  //printf("start storage ip_addr: %s, g_storage_sync_thread_count=%d\n",       pStorage->ip_addr, g_storage_sync_thread_count);  */
  if ((result=pthread_create(&tid, &pattr, storage_sync_thread_entrance, \    (void *)pStorage)) != 0)  {    logError("file: "__FILE__", line: %d, " \      "create thread failed, errno: %d, " \      "error info: %s", \      __LINE__, result, STRERROR(result));
    pthread_attr_destroy(&pattr);    return result;  }

 

在这个线程中,会周期地读取binlog,然后同步给其它的Storage:​​​​​​​

  while (g_continue_flag && (!g_sync_part_time || \      (current_time >= start_time && \      current_time <= end_time)) && \      (pStorage->status == FDFS_STORAGE_STATUS_ACTIVE || \      pStorage->status == FDFS_STORAGE_STATUS_SYNCING))    {      //读取binlog      read_result = storage_binlog_read(&reader, \          &record, &record_len);      //省略非关键代码      }
      if (read_result != 0)      {        //省略非关键代码      }      else if ((sync_result=storage_sync_data(&reader, \        &storage_server, &record)) != 0)      {        //上面就是就binlog同步到其它Storage        logDebug("file: "__FILE__", line: %d, " \          "binlog index: %d, current record " \          "offset: %"PRId64", next " \          "record offset: %"PRId64, \          __LINE__, reader.binlog_index, \          reader.binlog_offset, \          reader.binlog_offset + record_len);        if (rewind_to_prev_rec_end(&reader) != 0)        {          logCrit("file: "__FILE__", line: %d, " \            "rewind_to_prev_rec_end fail, "\            "program exit!", __LINE__);          g_continue_flag = false;        }
        break;      }          if (reader.last_scan_rows != reader.scan_row_count)    {      //定稿mark文件      if (storage_write_to_mark_file(&reader) != 0)      {        logCrit("file: "__FILE__", line: %d, " \          "storage_write_to_mark_file fail, " \          "program exit!", __LINE__);        g_continue_flag = false;        break;      }    }

 

可以看到,这个线程周期性地调用storage_binlog_read 读取binlog,然后调用storage_sync_data同步给其它Storage,然后调用storage_write_to_mark_file 将mark文件写入到磁盘持久化。

 

通过上面的分析,可以判断FastDFS在异步情况下是会丢数据的,因为同步binlog给其它Storage是异步的,所以还没同步之前这台机器挂了并且起不来,数据是会丢失的;

 

 

另外binlog不是每1次都刷磁盘的,有参数设置,单位为秒:

sync_binlog_buff_interval

 

即保证多久将将mark文件刷新到磁盘中,果设置大于0,也是会容易丢失数据的。

 

 

三、解决方案

回到问题本身,为什么出现数据不同步呢,是因为在搭建 FastDFS的时候,运维的同学直接从其它服务器上拷过来的,包括整个data目录,也包括data下面的sync目录,这样就容易出现mark文件的偏移量不准的问题。

 

如何解决呢,手动修改mark文件,将binlog_offset设为0,这样FastDFS就会从头同步文件,碰到已经存在的文件,系统会略过的,这是我开发机上的日志:

[2020-08-11 20:27:36] DEBUG - file: storage_sync.c, line: 143, sync data file, logic file: M00/00/00/rBVrTV8yZl6ATOQyAAAJTMk6Vgo7337.md on dest server xx.xx.xx.xx:23000 already exists, and same as mine, ignore it

 

当然前提是日志级别开到DEBUG级别。

 

PS:

源代码中同步文件成功是没有日志的,写mark文件成功也是没有日志的,为了调试方便,我们都加上相关的调试日志了。

 

保存mark文件加日志可以在函数storage_write_to_mark_file中加入一条info日志。

  if ((result=storage_write_to_fd(pReader->mark_fd, \    get_mark_filename_by_reader, pReader, buff, len)) == 0)  {    pReader->last_scan_rows = pReader->scan_row_count;    pReader->last_sync_rows = pReader->sync_row_count;
    logInfo("file: "__FILE__", line: %d, " \              "write server:%s mark file success, offset:%d", \              __LINE__, pReader->storage_id, pReader->binlog_offset);          }

 

 

往期精彩文章:

redis-port支持前缀迁移

Nginx配置不当险酿S0

分布式文件系统FastDFS

 

 

码字不易,如果觉得这篇文章有帮助,请关注我的个人公众号:

FastDFS 下载安装和使用FastDFS FastDFS 下载安装和使用 因为博主自己在下载安装和使用的时候是踩了很多坑的所有整理出这篇博客供大家参考,如果发现问题请及时指出! 需要从官网下载我们所需要的依赖包 FastDFS官网传送门 1.下载FastDFS所需要的依赖包 点击第一个进去之后会看到如下图,选择第三个月份日期为2014-12-02(听说这个版本很稳定) 点击进去后你会看到如下图你可以直接点击开始下载 记住上面的步骤 接下来你将以同样的方式下载其他依赖 如果因为某种原因下载不了以上依赖 可以使用博主的依赖 传送门 依赖提取 阅读详情

相关推荐

Nginx和FastDfs完整配置过程_fastdfs安装

看看有没有报错,如果没有错误就可以执行软链接了。

2501_90244936的博客 1522

记一次fastdfs服务器文件同步数据出错的解决

1.由于云服务商提供的ssd硬盘坏道,导致fastdfs文件同步操作无法删除文件和rename动作,造成两storage服务文件同步记录不一致。 2.查看storage节点状态信息,通过tracker或者storage都可以,/usr/bin/fdfs_monitor /etc/fdfs/client.conf或者/usr/bin/fdfs_monitor /etc/fdfs/storage.conf,查看节点状态,看哪台机器同步数据日期有问题 3.进入storage服务器下的data目录(storag

sunice115的专栏 1605

linux 安装fastDFS

linux安装fastDFS

qq_29260989的博客 1685

fdfs storage文件同步失败问题

概述 binlog 文件删除同步失败的文件 tail -f storaged.log查看同步失败的文件,然后查看是那个binlog文件用作同步,然后把binlog中的这个文件记录删除即可。 查看那个binlog在同步 通过fdfs_monitor /etc/fdfs/storage.conf 确定那个storage同步失败(被同步的storage),然后到正确的storage上(也就是同步文件的storage)的storage上 cd /data/fastdfs/storage/data/sync 从mar

抽象的螺旋 1773

CentOS 7安装FastDFS

CentOS7安装FastDFS

梦里逆天的博客 2614

STM32F407+LWIP实战:手把手教你移植mbedtls库实现Modbus TCP双向认证

本文详细介绍了如何在STM32F407微控制器上移植mbedtls库,结合LWIP协议栈实现Modbus TCP的双向认证功能。通过TLS 1.2加密通道,有效提升工业物联网通信的数据安全性,涵盖证书管理、内存优化及性能调优等关键步骤,为嵌入式系统开发者提供了一套完整的解决方案。

weixin_28721917的博客 516

fastdfs选择固定storage节点上传文件(fastdfs同步延时问题解决)

通过上传图片的组件上传成功之后,由于需要回显图片,如果存在延时,会出现图片破裂的情况,所以在这里需要把文件同步的时候调小。另一台只做备份用,这样虽然同步有延时,但是图片回显的问题就可以解决了。修改我们要选择的strage 服务中的 storage.conf中的。按下面方法依然解决不了问题,所以又有了一个想法,可不可以。在fastdfs新加了一台storage服务之后,(此值越小优先级越高,可以为负数)

李振伟的博客 1898

【记录】游戏体验报告怎么写(自我成长篇)

2019年3月更新: 这个倒是不用推翻,我个人虽然写的东西还是有一些偏差的,但是“表哥”说的倒是没毛病的,这篇主要是为了记录用,具体的干货也有,都在图片里,请自行提取 =====18年初原答案 作为一个游戏策划新人,游戏分析可能抓不到点子上,试着总结记录一下游戏体验报告分析的成长(因为水平不同,视野可能也不一样,也许之后几年回头看这些东西都是小儿科或者是错误的,所以只写出当下的想...

eat_human的博客 6万+

fastDFS安装及配置

FastDFS 安装 一、环境预约 服务器 IP 组 ...

weixin_33857679的博客 2739

从CTFShow靶场实战,聊聊Node.js原型链污染漏洞的几种利用姿势(附详细复现步骤)

本文深入剖析Node.js原型链污染漏洞的原理与实战利用,通过复现CTFShow靶场题目(web338-web341),详细演示五种高级利用技巧,包括基础污染、多级污染、模板引擎RCE等,并提供防御方案与最佳实践,帮助开发者提升Web应用安全性。

weixin_30791095的博客 445

PCB设计之ODB++文件格式详解

ODB++(Open Database++)是一种广泛应用于PCB(印制电路板)设计和制造领域的开放数据交换格式。它由Valor Computerized Systems(现为Siemens EDA的一部分)开发,旨在替代传统的Gerber文件格式,提供更完整、结构化的制造数据,从而优化PCB设计到生产的流程。ODB++通过结构化数据整合了PCB设计到制造的全流程信息,显著提高了生产效率和准确性。尽管存在一定的兼容性挑战,但其在复杂项目和高可靠性场景中的价值不可替代。

ZZcppc的博客 1万+

cannot create file怎么解决_FastDFS不同步怎么破

一、背景说明FastDFS是一款开源的分布式文件系统,具体介绍就不说了,有兴趣的可以自行百度下。以下是官方的架构图:一次完整的写交互过程如下:1、Client向Tracker查询可用的Storage;2、Tracker随机返回一个Storage;3、Client向Storage发起写请求;一次完整的读交互:1、Client向Tracker查询可用的Storage;2、Tracker随机返回一个St...

weixin_29452603的博客 1101

时间序列—显著相关性和滞后性分析_python

本文讲述了两个时间序列(信号)的相关性分析,可以利用相关性分析进行特征筛选。此外本文还讲了怎么判断时间序列的滞后性的方法。

qq_34229228的博客 2万+

Linux下使用FastDFS

/make.sh如果安装成功,会看到/etc/init.d/下看到提供的脚本文件:是tracker启动脚本是storage启动脚本能够在 /etc/fdfs/ 目录下看到默认的配置文件模板:是tracker的配置文件模板是storage的配置文件模板是客户端的配置文件模板FastDFS的tracker和storage在刚刚的安装过程中,都已经被安装了,因此我们安装这两种角色的方式是一样的。不同的是,两种需要不同的配置文件。我们要启动tracker,就修改刚刚看到的,并且启动脚本即可。

2401_86352725的博客 2124

基于STM32设计的猪舍养殖的监控系统_325

本课题基于STM32单片机,设计一款能够实时监测猪舍环境的智能监控系统。该系统能够通过温湿度、空气质量、光照强度等传感器实时监测猪舍的环境,并能够通过自动化控制设备(如风扇、照明灯、消毒喷雾等)调节环境参数,确保养殖环境的适宜性。同时,系统还支持通过ESP8266模块实现数据上传与远程控制,使养殖管理者能够通过手机APP或计算机远程监控和控制猪舍环境。

407

文末含资料链接和视频讲解!YOLOv8+RepVGG+QueryDet小目标检测终极指南:从理论到实战,突破遥感图像检测难题

QueryDet(Query Detection)机制代表了目标检测领域的一个重要范式转变。传统的目标检测方法基于anchor或anchor-free的密集预测,需要为图像中的每个可能位置生成预测。而QueryDet采用了稀疏查询的方式,通过少量的可学习查询向量来直接预测目标。 这种设计灵感来源于Transformer架构中的注意力机制。在自然语言处理中,Transformer通过query-key-value机制实现了高效的序列建模。QueryDet将这一思想引入到目标检测中,将检测问题转化为查询匹配问

FJN110的博客 384

k8s部署fastdfs

1.环境准备 1.1、准备好3台服务器,这里我以两台服务器搭建的k8s集群,还有一台用来搭建好harbor远程仓库 1.2、准备好构建fdfs所需的安装包 1.3、准备好fastdfs中相关配置文件模板 2、编写创建fastdfs镜像的Dockerfile脚本 内容如下: FROM centos:7 MAINTAINER kgf <kgf@123.com> ENV FASTDFS_PAT...

花&败 4094

AUTOSAR从入门到精通-【自动驾驶】特斯拉全自动驾驶(FSD)

特斯拉全自动驾驶系统(Full-Self Driving,简称FSD)是特斯拉公司开发的高级驾驶辅助系统,旨在通过神经网络技术实现环境感知与车辆控制,在驾驶员监督下完成导航、转向、变道、泊车等操作。‌ 该系统自2021年发布Beta测试版以来持续迭代,最新版本为2025年10月推出的v14版本。‌FSD v14版本基于端到端神经网络架构,取代了传统代码逻辑,通过数百万视频片段训练模型,以模仿人类驾驶决策。‌ 其功能覆盖住宅区街道、城市道路及高速公路,支持交通信号识别、自动变道和环岛通行等场景。

getusushu的博客 570

SpringBoot整合fastdfs

1、导入jar包 <dependency> <groupId>com.github.tobato</groupId> <artifactId>fastdfs-client</artifactId> <version>1.26.5</version...

... 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Nginx+FastDFS

代理:通过客户机的配置,实现让一台服务器代理客户机,客户的所有请求都交给代理服务 器处理。正向代理比如:各种翻墙软件,vpn,各种游戏加速器等等。反向代理:用一台服务器,代理真实服务器,用户访问时,不再是访问真实服务器,而是代 理服务器。我们需要提前在nginx中配置好反向代理的规则,不同的请求,交给不同的真实服务器处理当请求到达nginx,nginx会根据已经定义的规则进行请求的转发,从而实现路由功能。

qq_45393339的博客 3819

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

FastDfs安装,根据不同项目存放文件到不同目录

1、下载和解压fastdfs,libfastcommon,nginx,fastdfs-nginx-module #master机器执行 #安装一些会用到的包 yum -y install zlib zlib-devel pcre pcre-devel gcc gcc-c++ openssl openssl-devel libevent libevent-devel perl unzip net...

hypon的博客 4298

FastDFS卸载

由于FastDFS软件并未提供直接的一键卸载,所以卸载有点麻烦,FastDFS卸载步骤如下: 注意:所有删除操作请务必先查看是否存在文件文件是否为FastDFS相关 停止服务 [root@bogon fdfs]#service fdfs_trackerd stop [root@bogon fdfs]#service fdfs_storaged stop 通过storage.conf找到bas...

gsq8896的博客 6553

Linux安装FastDFS

传送门链接 fastdfs与nginx整合,使用Java客户端操作fastdfs。 下载 下载传送门 主要下载: 下载完成之后将其压缩包分别进行解压 unzip libfastcommon.zip unzip fastdfs.zip unzip fastdfs-nginx-module.zip 找不到unzip命令的话就直接yum安装:yum -y install unzip 解压...

难受啊马飞的博客 1706

FastDFS安装步骤以及SpringBoot集成fastdfs-client-java

1、前期准备2、CentOS添加编译环境 yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y 二、磁盘目录 mkdir -p /usr/local/soft #所有安装包目录mkdir -p /data/fastdfs #数据存储位置cd /usr/local/soft git clone https://github.co

查查攻城狮 4287

3步搞定经典开始菜单:Open-Shell-Menu完整配置指南

从 Win7 升到 Win11 后,找程序要翻一层层磁贴菜单,搜索框还总不听话。我花了不少时间找到的工具就是 Open-Shell-Menu——一款免费的经典开始菜单还原工具。装上后配了十分钟,熟悉的双列菜单就回来了,操作习惯不用再迁就系统。 ## 项目全景速览 Open-Shell-Menu 是原 Classic Shell 的社区续作,能力拆解如下: | 能力 | 帮你做什么 | |--

gitblog_00998的博客 343

使用SpringBoot集成FastDFS

使用SpringBoot集成FastDFS

YIYIYI 3740
上一篇: 360 Atlas 生产环境使用心得
下一篇: Dubbo2.7试用
programwithebay
博客等级 码龄16年 2粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值