FastDFS原理系列文章
FastDFS原理系列文章
基于FastDFS 5.03/5.04
2014-12-19
一、概述
FastDFS文档极少,仅仅能找到一些宽泛的架构文档,以及ChinaUnix论坛上作者对网友提问的一些回答。对于要将FastDFS应用到生产系统来说,这点了解绝对是不够的。
这段时间研究FastDFS源代码,而且做了大量的性能測试。中间也做了大量的笔记。基本上把程序的结构与基本的操作摸索清楚,因此写了一些文章即是对前段工作的总结,同一时候也分享给想很多其它了解FastDFS内部的同行们。
这里对每篇文章做个介绍。
、机器之间的同步
Storage之间的同步可能是大家首先关心的了,这篇文章做了具体的介绍,最后我还写了注意事项。主要是性能方面的。
《FastDFS之Binlog同步》 http://blog.csdn.net/hfty290/article/details/42041155
、加入新机器同步
大家可能不怎么会注意到这部分。可是事实上非常重要。
在实际的生产系统。坏掉一台机器,或者为了读压力而添加机器,等都是非常正常的。在一个执行的系统上加入一台机器涉及到存量文件的同步与融入到系统中。以下这篇文章做了具体的回答。
《FastDFS之加入机器同步》 http://blog.csdn.net/hfty290/article/details/42041953
、磁盘恢复
线上机器坏个磁盘算是个大概率事件了,换了一个新磁盘。问题来了,数据怎么恢复啊。不用急,重新启动下Storaged。他会检測到并进行恢复,尽管恢复时间可能要非常长(数据量大时),这篇文章对这个功能做了说明。
《FastDFS之磁盘恢复过程》 http://blog.csdn.net/hfty290/article/details/42032817
、Storaged程序结构
到此处Storaged基本的功能点已经讲述了。或者你还想知道程序内部是怎样组织的,线程之间的协调等信息,请看这篇文章。
《FastDFS之Storage程序框架》http://blog.csdn.net/hfty290/article/details/42048001
、Client与Tracker的通讯
如今是时候从client角度来端详下Tracker了。由于无论是上传、下载、删除等操作都须要先查询Tracker。那么这些查询Tracker是怎样计算。并返回的呢?请看本篇。
《FastDFS之client与Tracker通讯》http://blog.csdn.net/hfty290/article/details/42064429
、合并存储
海量小文件导致性能下降,可能大家都听说过。福音是FastDFS通过合并小文件成大文件的方式来规避这个问题。FastDFS是怎样实现这个功能的,具体请看这里。
《FastDFS合并存储原理分析》 http://blog.csdn.net/hfty290/article/details/42026215
、Tracker-Leader选举
看过了《FastDFS合并存储原理分析》这篇文章后。对于当中提到的Tracker-Leader怎样选举可能会好奇,通过这篇文章你会看到Leader的选举过程。
《FastDFS之Tracker-Leader选择》 http://blog.csdn.net/hfty290/article/details/42030339
、合并存储设计缺陷
对于FastDFS合并存储功能不得不面对一个问题,在某些情况下会导致数据错误或丢失。
你在看《FastDFS合并存储原理分析》这篇文章时可能已经发现了,如今让我们完完整整地重现下这样的错误的出现,请看。
《FastDFS之合并存储缺陷导致数据丢失或错误》 http://blog.csdn.net/hfty290/article/details/42030481
FastDFS原理系列文章的更多相关文章
- MapReduce调度与执行原理系列文章
转自:http://blog.csdn.net/jaytalent?viewmode=contents MapReduce调度与执行原理系列文章 一.MapReduce调度与执行原理之作业提交 二.M ...
- Consul实现原理系列文章2: 用Gossip来做集群成员管理和消息广播
工作中用到了Consul来做服务发现,之后一段时间里,我会陆续发一些文章来讲述Consul实现原理.这篇文章会讲述Consul是如何使用Gossip来做集群成员管理和消息广播的. Consul使用Go ...
- Consul实现原理系列文章1: 用Raft来实现分布式一致性
工作中用到了Consul来做服务发现,之后一段时间里,我会陆续发一些文章来讲述Consul实现原理.在前一篇文章中,我介绍了Raft算法.这篇文章会讲讲Consul是如何使用Raft算法来实现分布式一 ...
- Consul实现原理系列文章3: Consul的整体架构
工作中用到了Consul来做服务发现,之后一段时间里,我会陆续发一些文章来讲述Consul实现原理.在前几篇文章介绍完了Consul用到的两个关键性东西Raft和Gossip之后,这篇文章会讲述Con ...
- java nio系列文章
java nio系列教程 基于NIO的Client/Server程序实践 (推荐) java nio与并发编程相关电子书籍 (访问密码 48dd) 理解NIO nio学习记录 图解ByteBuff ...
- .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引
系列文章索引: .NET面试题解析(01)-值类型与引用类型 .NET面试题解析(02)-拆箱与装箱 .NET面试题解析(03)-string与字符操作 .NET面试题解析(04)-类型.方法与继承 ...
- 【深入ASP.NET原理系列】--ASP.NET请求管道、应用程序生命周期、整体运行机制
微软的程序设计和相应的IDE做的很棒,让人很快就能有生产力..NET上手容易,生产力很高,但对于一个不是那么勤奋的人,他很可能就不再进步了,没有想深入下去的动力,他不用去理解整个框架和环境是怎么执行的 ...
- 分布式文件系统FastDFS原理介绍
在生产中我们一般希望文件系统能帮我们解决以下问题,如:1.超大数据存储:2.数据高可用(冗余备份):3.读/写高性能:4.海量数据计算.最好还得支持多平台多语言,支持高并发. 由于单台服务器无法满足以 ...
- 【转载】Android异步处理系列文章
本博文地址:http://blog.csdn.net/mylzc/article/details/6777767 转载请注明出处. 为了给用户带来良好的交互体验,在Android应用的开发过程中需要把 ...
随机推荐
- bzoj3224: Tyvj 1728 普通平衡树(splay)
3224: Tyvj 1728 普通平衡树 题目:传送门 题解: 啦啦啦啦又来敲个模版水经验啦~ 代码: #include<cstdio> #include<cstring> ...
- EM算法——有隐含变量时,极大似然用梯度法搞不定只好来猜隐含变量期望值求max值了
摘自:https://www.zhihu.com/question/27976634 简单说一下为什么要用EM算法 现在一个班里有50个男生,50个女生,且男生站左,女生站右.我们假定男生的身高服从正 ...
- TestNG环境搭建以及框架初识
TestNG的英文为Test Next Generation, 听上去好像下一代测试框架已经无法正常命名了的样子,哈哈,言归正传,啥是TestNG呢,它是一套测试框架,在原来的Junit框架的思想基础 ...
- docker(部署常见应用):docker部署mysql
上节回顾:docker(部署常见应用):docker部署nginx docker部署mysql:5.7.26 # 下载镜像 docker pull mysql: # 查看镜像 docker image ...
- 22.Generate Parentheses[M]括号生成
题目 Given n pairs of parentheses, write a function to generate all combinations of well-formed parent ...
- Arduino-IIC-Wire.h
前言:Wire.h是Arduino的IIC库. 一.Wire库函数 Wire.begin() Wire.requestFrom() Wire.beginTransmission() Wire.endT ...
- O - Masha and Bears
Problem description A family consisting of father bear, mother bear and son bear owns three cars. Fa ...
- CentOS6.5下编译R源码并安装Spark R
不多说,直接上干货! 为了使用SparkR,决定要在Spark所在的Linux上装上R,结果血泪篇了.主要原因是公司内部的虚机,无法连外网,所以网上很多的直接rpm或者yum的方法都没用,需要自己编译 ...
- GCC G++ Make CMake自我科普
Linux下gcc g++ make cmake 联系和区别 C/C++程序从编写到可执行一般经历这几个阶段 编写源代码 编译器编译代码生成目标文件,如.o文件 链接器链接目标文件和其他目标文件/库文 ...
- 获取listview的高度代码
public int getTotalHeightofListView(ListView listView) { ListAdapter mAdapter = (ListAdapter) listVi ...