FastDFS集群同步机制

在这里插入图片描述

FastDFS文件同步采用binlog异步复制方式

在storage server上有新文件操作时,写入binlog文件,用于同步新文件到其它storage

正常文件上传完成后,就记录近binlog缓存中,定时刷入binlog文件。 storage有线程定时读取binlog文件,当有新增行时,判断该记录是源文件记录还是副本文件记录。 只主动发送源文件,副本文件不做处理(非启动时流程)。

同步规则:

  1. 只在本组内的storage server之间进行同步
  2. 源头数据才需要同步,备份数据不需要再次同步,否则就构成环路了,源数据和备份数据区分是
    用binlog的操作类型来区分,操作类型是大写字母,表示源数据,小写字母表示备份数据
  3. 当先新增加一台storage server时,由tracker选择已有的一台storage server将已有的所有数据(包括源头数据和备份数据)同步给该新增服务器。

binlog文件格式

时间戳      |  操作类型  |   文件名
1490251373       C         M02/52/CB/CtAqWVjTbm2AIqTkAAACd_nIZ7M797.jpg

操作类型(部分):

  • C表示源创建、c表示副本创建
  • A表示源追加、a表示副本追加
  • D表示源删除、d表示副本删除

注:源表示客户端直接操作的那个Storage即为源,,其他的Storage都为副本

文件同步采用增量方式,记录已同步的位置到mark文件中

mark文件存放路径为 $base_path/data/sync/

114.215.169.67_23000.mark

binlog_index=0 //binlog索引id 表示上次同步给114.215.169.67机器的最后一条binlog文件索引
binlog_offset=3944 //当前时间binlog 大小 (单位是字节)表示上次同步给114.215.169.67机器的最后
一条binlog偏移量,若程序重启了,也只要从这个位置开始向后同步即可。
need_sync_old=1 //是否需要同步老数据
sync_old_done=1 //是否同步完成
until_timestamp=1621667115 //同步已有数据文件的截至时间
scan_row_count=68 //扫描记录数
sync_row_count=53 //同步记录数

问题

1.两个storage如何相互备份,会不会出现备份死循环的问题?

答:源storage写入文件后记录该操作到binlog文件,用操作符的大小写区分该操作是源文件操作还是副本文件操作,源storage的监听线程(多个)捕捉到新记录,判断操作符,**决定是否开始将新数据push同步到其它storage。**对于此文件的数据,其它storage记录到binlog后,监听线程判断是副本文件,不会进行push同步

2.已经存在两个storage了,然后加入第三个storage,那谁同步给第三个storage?

答:

​ 1.新增一台storage C,首先向tracker上报信息(所属group、ip等)

​ 2.tracker更新本地storage list,并通过心跳同步给sotrage A和B

​ 3.storage A和B收到心跳包,更新storage list,发现C是新增的,则向tracker发送同步申请

​ 4.tracker server选择一个storage作为同步源,对storage C进行同步

​ 5.被选中的同步源storage启动同步线程开始向storage C进行push同步

3.binlog的格式是怎么设计的,如果binlog文件太大该怎么处理?

答:binlog由 时间戳、操作类型(分大小写)、文件名(包含fileid)

​ fastdfs支持文件压缩

4.已有A、B、C三个storage,我现在上传一个文件到A,然后发起请求下载,会不会出现从B请求下载,但此时B没有同步文件,导致下载失败的情况?

答:下载文件请求由tracker server处理时,会根据策略选择一个合适的storage:

​ 1.优先选择源storage,一定存在该文件

​ 2.storage同步完成时间戳 > 文件创建时间戳(在storage中创建)

可以确保选择的storage存在该文件

5.同步线程读取binlog进行storage备份,应该该从binlog文件的哪个位置开始读取?

答:同步线程进行storage同步时,会先读取对方的.mark同步文件,其中包含该storage的同步记录,其中binlog_offset字段记录了上一次同步binlog的位置。随后读取本端binlog,向对方push同步命令

推荐学习 https://xxetb.xetslk.com/s/p5Ibb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wjq++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值