FastDFS之Binlog同步

FastDFSBinlog同步

 

基于FastDFS 5.03/5.04


2014-12-20

 

一、Binlog同步概述

      FastDFS中为了维护文件的多个副本,会在同组的Storage之间互相同步文件,也就是一个备份过程,若一组有三台机器,那么互相备份后,一个文件就有三个副本。本篇将主要描述Binlog同步的相关概念,与同步逻辑,以及一些注意事项。


1Binlog结构


1)目录结构

      Storage.conf配置文件中,有一个配置如下:base_path=/data/zcs/fdfs_Storage_base

Storaged程序启动时会创建一个 base_path/data/sync 目录,该目录中的文件都是和Storaged之间的同步相关的,如:

10.0.1.1_23000.mark10.0.1.2_23000.mark binlog.000binlog.index

binlog.index ##记录当前使用的Binlog文件序号,如为1,则表示使用binlog.001

binlog.000##真实地Binlog文件

10.0.1.1_23000.mark##同步状态文件,记录本机到10.0.1.1的同步状态


2Mark文件内容描述

      对于10.0.1.1_23000.mark文件,本篇相关的内容有如下两项:

binlog_index=0##表示上次同步给10.0.1.1机器的最后一条binlog文件索引

binlog_offset=116##表示上次同步给10.0.1.1机器的最后一条binlog偏移量,若程序重启了,也只要从这个位置开始向后同步即可。


3Binlog文件内容描述

      对于binlog.000文件,是有一条条binlog日志组成的,如下:

1418285342 c M01/00/00/CgAHl1SJUR6AZqSHAAAF1vgN0rw59.conf
1418285734 C M00/00/00/CgAFklSJUqaAL7hBAAAF1vgN0rw38.conf
1418285809 C M01/00/00/CgAFklSJUvGAL96CAAAF1vgN0rw96.conf

其中的每一条记录都是使用空格符分成三个字段,分别为:


      #1418285342  表示文件upload时间戳

      第二个字段表示文件创建方式,

C表示源创建、c表示副本创建

A表示源追加、a表示副本追加

D表示源删除、d表示副本删除

T表示源Truncatet表示副本Truncate


      注:源表示客户端直接操作的那个Storage即为源,其他的Storage都为副本,如客户端向10.0.1.1主机Upload一个文件,那么在10.0.1.1机器上记录的就是C,当10.0.1.1机器将该条binlog的操作同步给10.0.1.2时,在10.0.1.2上记录的binlog就是c,其他几种操作同理。

#第三个字段为文件的FileID M01/00/00/CgAHl1SJUR6AZqSHAAAF1vgN0rw59.conf其中的M01storepath索引,紧接着00/00/为路径,后面CgAHl1SJUR6AZqSHAAAF1vgN0rw59.conf为文件系统中实际的文件名(不采用合并存储时,若采用合并存储并不是一个实际的文件名)。

      #文件名组成:CgAHl1SJUR6AZqSHAAAF1vgN0rw59.conf,这个文件名中,除了conf 为文件后缀,CgAHl1SJUR6AZqSHAAAF1vgN0rw59 这部分是一个base64编码缓冲区,组成如下:

Storage_idip的数值型)

timestamp(创建时间)

file_size(若原始值为32位则前面加入一个随机值填充,最终为64位)

crc32(文件内容的检验码)

 

二、Binlog同步过程

      FastDFS之中,每个Storaged之间的同步都是由一个独立线程负责的,该线程中的所有操作都是以同步方式执行的。比如一组服务器有ABC三台机器,那么在每台机器上都有两个线程负责同步,如A机器,线程1负责同步数据到B,线程2负责同步数据到C


1、获取组内的其他Storage信息,并启动同步线程

      Storage.conf配置文件中,只配置了TrackerIP地址,并没有配置组内其他的Storage。因此同组的其他Storage必须从Tracker获取。具体过程如下:

      1Storage启动时为每一个配置的Tracker启动一个线程负责与该Tracker的通讯。

      2)默认每间隔30秒,与Tracker发送一次心跳包,在心跳包的回复中,将会有该组内的其他Storage信息。

      3Storage获取到同组的其他Storage信息之后,为组内的每个其他Storage开启一个线程负责同步。


2、同步线程执行过程

      每个同步线程负责到一台Storage的同步,以阻塞方式进行。

      1)打开对应Storagemark文件,如负责到10.0.1.1的同步则打开10.0.1.1_23000.mark文件,从中读取binlog_indexbinlog_offset两个字段值,如取到值为:1100,那么就打开binlog.001文件,seek100这个位置。

      2)进入一个while循环,尝试着读取一行,若读取不到则睡眠等待。若读取到一行,并且该行的操作方式为源操作,如CADT(大写的都是),则将该行指定的操作同步给对方(非源操作不需要同步),同步成功后更新binlog_offset标志,该值会定期写入到10.0.1.1_23000.mark文件之中。

      3、同步前删除

假如同步较为缓慢,那么有可能在开始同步一个文件之前,该文件已经被客户端删除,此时同步线程将打印一条日志,然后直接接着处理后面的Binlog

 

三、Storage的最后最早被同步时间

      这个标题有点拗口,先举个例子:一组内有Storage-AStorage-BStorage-C三台机器。对于A这台机器来说,BC机器都会同步Binlog(包括文件)给他,A在接受同步时会记录每台机器同步给他的最后时间(也就是Binlog中的第一个字段timpstamp)。比如B最后同步给ABinlog-timestamp100C最后同步给ABinlog-timestamp200,那么A机器的最后最早被同步时间就为100.

      这个值的意义在于,判断一个文件是否存在某个Storage上。比如这里A机器的最后最早被同步时间为100,那么如果一个文件的创建时间为99,就可以肯定这个文件在A上肯定有。为什呢?一个文件会Upload到组内三台机器的任何一台上:

      1)若这个文件是直接UploadA上,那么A肯定有。

      2)若这个文件是UploadB上,由于B同步给A的最后时间为100,也就是说在100之前的文件都已经同步A了,那么A肯定有。

      3)同理C也一样。

      Storage会定期将每台机器同步给他的最后时间告诉给TrackerTracker在客户端要下载一个文件时,需要判断一个Storage是否有该文件,只要解析文件的创建时间,然后与该值作比较,若该值大于创建创建时间,说明该Storage存在这个文件,可以从其下载。

      Tracker也会定期将该值写入到一个文件之中,Storage_sync_timestamp.dat,内容如下:

group1,10.0.0.1,0,1408524351,1408524352
group1,10.0.0.2,1408524353,0,1408524354
group1,10.0.0.3,1408524355,1408524356,0

      每一行记录了,对应Storage同步给其他Storage的最后时间,如第一行表示10.0.0.1同步给10.0.0.2的最后时间为1408524351,同步给10.0.0.3的最后时间为1408524352;同理可以知道后面两行的含义了。每行中间都有一个0,这个零表示自己同步给自己,没有记录。按照纵列看,取非零最小值就是最后最早同步时间了,如第三纵列为10.0.0.1被同步的时间,其中1408524353就是其最后最早被同步时间。

 

三、注意事项

      1、由于到每台机器的同步都是有单线程负责的,因此即使主机上有很多个磁盘也不能加快同步速度,因此单线程并不能最大化磁盘IO,最大的速度也就是一个磁盘的速度。

      2、对于重要文件,为了防止机器宕机或者坏磁盘的文件丢失,及时的同步备份是必须得。若同步太慢,还可能导致Tracker不能正确估计可用空间,而导致空间溢出。

      3)同步性能,由于Linux系统的文件缓存机制,若一个刚写入的文件马上读,那么很可能就命中在系统缓存上,此时读数据几乎不耗费时间,若不能命中缓存,从磁盘读,将耗费很长时间。因此写入速度,最好与同步速度相当,这样可以保证及时同步。若写入速度超过同步速度,从某个时刻开始,将会使得所有的读无法命中缓存,同步性能将大幅下滑。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用网络文章开启本课程的开篇: 在大数据分析领域中,传统的大数据分析需要不同框架和技术组合才能达到最终的效果,在人力成本,技术能力和硬件成本上以及维护成本让大数据分析变得成为昂贵的事情。让很多中小型企业非常苦恼,不得不被迫租赁第三方大型公司的数据分析服务。  ClickHouse开源的出现让许多想做大数据并且想做大数据分析的很多公司和企业耳目一新。ClickHouse 正是以不依赖Hadoop 生态、安装和维护简单、查询速度快、可以支持SQL等特点在大数据分析领域越走越远。  本课程采用全新的大数据技术栈:Flink+ClickHouse,让你体验到全新技术栈的强大,感受时代变化的气息,通过学习完本课程可以节省你摸索的时间,节省企业成本,提高企业开发效率。本课程不仅告诉你如何做项目,还会告诉你如何验证系统如何支撑亿级并发,如何部署项目等等。希望本课程对一些企业开发人员和对新技术栈有兴趣的伙伴有所帮助,如对我录制的教程内容有建议请及时交流。 课程概述:在这个数据爆发的时代,像大型电商的数据量达到百亿级别,我们往往无法对海量的明细数据做进一步层次的预聚合,大量的业务数据都是好几亿数据关联,并且我们需要聚合结果能在秒级返回。  那么我们该如何实现这一需求呢?基于Flink+ClickHouse构建电商亿级实时数据分析平台课程,将带领大家一步一步从无到有实现一个高性能的实时数据分析平台,该系统以热门的互联网电商实际业务应用场景为案例讲解,对电商数据的常见实战指标以及难点实战指标进行了详尽讲解,具体指标包括:概况统计、全站流量分析、渠道分析、广告分析、订单分析、运营分析(团购、秒杀、指定活动)等,该系统指标分为分钟级和小时级多时间方位分析,能承载海量数据的实时分析,数据分析涵盖全端(PC、移动、小程序)应用。 本课程凝聚讲师多年一线大数据企业实际项目经验,大数据企业在职架构师亲自授课,全程实操代码,带你体验真实的大数据开发过程,代码现场调试。通过本课程的学习再加上老师的答疑,你完全可以将本案例直接应用于企业。 本套课程可以满足世面上绝大多数大数据企业级的海量数据实时分析需求,全部代码在老师的指导下可以直接部署企业,支撑千亿级并发数据分析。项目代码也是具有极高的商业价值的,大家可以根据自己的业务进行修改,便可以使用。  本课程包含的技术: 开发工具为:IDEA、WebStorm Flink1.9.0 ClickHouseHadoop2.6.0 Hbase1.0.0 Kafka2.1.0 Hive1.0.0 Jmeter(验证如何支撑亿级并发)Docker (虚拟化部署)HDFS、MapReduce Zookeeper SpringBoot2.0.2.RELEASE SpringCloud Finchley.RELEASE Binlog、Canal MySQL Vue.js、Nodejs Highcharts Linux Shell编程  课程亮点: 1.与企业对接、真实工业界产品 2.ClickHouse高性能列式存储数据库 3.大数据热门技术Flink新版本 4.Flink join 实战 5.Flink 自定义输出路径实战 6.全链路性能压力测试 7.虚拟化部署 8.集成指标明细查询 9.主流微服务后端系统 10.分钟级别与小时级别多时间方位分析 11.数据库实时同步解决方案 12.涵盖主流前端技术VUE+jQuery+Ajax+NodeJS 13.集成SpringCloud实现统一整合方案 14.互联网大数据企业热门技术栈 15.支持海量数据的实时分析 16.支持全端实时数据分析 17.全程代码实操,提供全部代码和资料 18.提供答疑和提供企业技术方案咨询 企业一线架构师讲授,代码在老师的指导下企业可以复用,提供企业解决方案。  版权归作者所有,盗版将进行法律维权。 
FastDFS 是一个高性能、轻量级的分布式文件系统,它主要用于存储大规模的文件。在 FastDFS 中,文件同步速度可以通过多种参数进行优化,以下是一些常用的参数: 1. tracker_server:Tracker 服务器地址,可以设置多个,用逗号分隔。Tracker 服务器是 FastDFS 的中心控制节点,负责协调存储节点之间的文件同步和负载均衡等工作。 2. tracker_port:Tracker 服务器端口号,默认为 22122。如果 Tracker 服务器与存储节点不在同一台机器上,则需要设置该参数。 3. anti_steal_token:是否启用防盗链功能,默认为 false。如果开启防盗链功能,则需要在客户端请求文件时携带一个 token,否则请求会被拒绝。 4. secret_key:防盗链 token 的密钥,需要与 Tracker 服务器上的 secret_key 保持一致。 5. group_name:存储组名称,可以设置多个,用逗号分隔。存储组是 FastDFS 存储节点的逻辑分组,用于实现存储节点的负载均衡和故障转移。 6. connect_timeout:连接超时时间,单位为毫秒,默认为 2000 毫秒。 7. network_timeout:网络超时时间,单位为毫秒,默认为 3000 毫秒。 8. charset:字符集,默认为 UTF-8。 9. http.tracker_http_port:Tracker HTTP 端口号,默认为 8080。如果需要使用 HTTP 协议上传和下载文件,则需要设置该参数。 10. http.anti_steal_token:是否启用 HTTP 防盗链功能,默认为 false。如果开启 HTTP 防盗链功能,则需要在客户端请求文件时携带一个 token,否则请求会被拒绝。 11. http.secret_key:HTTP 防盗链 token 的密钥,需要与 Tracker 服务器上的 secret_key 保持一致。 可以通过调整这些参数来优化 FastDFS 的文件同步速度。具体的优化策略需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值