Moosefs源代码分析
一、分析MFS非常有用的资源
本来想写的,但是看到了CSDN上的资料就没这个心情了,非常详细的讲解分享给大家:
CSDN中非常详细的文档:http://download.csdn.net/detail/zmfsea/9385601
关键点很突出的博客:http://blog.csdn.net/mwx1234/article/details/38928723
百度运维改进版本的shadowmfs:http://blog.csdn.net/mwx1234/article/details/38945471
shadowmfs源码:https://github.com/ops-baidu/shadow-mfs
二、个人看代码经验
个人认为看源代码的关键点在以下几个方面:(尤其是像mfs这样注释少的)
1. 首先安装程序,体验她的所有功能;(对当前领域已经很熟悉的可以跳过这一步)
2. 如果是多模块的话,应该弄明白多模块之间的通信接口或者信息结构;
3. 通过消息结构猜测代码的实现细节;
4. 粗略看源代码的编码习惯,比如变量命名规则,相关变量和结构的声明位置等;
5. 凭经验找到程序的关键点,比如select、poll、epoll(事件驱动)、pthread_create(多线程运行)、pthread_cond(线程之间通信)、main(主函数);
6. 逐步跟踪代码分析,如果常见的算法什么的如果没有必要的话就直接略过,关键难解的地方进行逐步调试。
三、对MFS分析或猜测后的概要
1、mfsmount:
主要就是两块:fuse和master_conn 流程大约是这样的:
(1) fuse监听挂载目录,调用main函数注册的回调函数;
(2) 读写回调函数分别把任务放到读写队列;一些mfs自定义(toolize,比如mfssetgoal之类)的操作直接走master-proxy;
(3) 读写队列分别由对应的读写线程处理。
(4) 读写线程调用公用的master通信模块发消息给master或者chunkserver,将返回后的消息处理之后返回给fuse,fuse通过VFS把结果返回给用户。
在(1)(3)步骤中,一定都是多线程的,因为客户端不同命令串行处理,万一一个任务耗时长,其他命令都排队等着肯定不行,当然配套的也会有最大的线程数限制。
(5) 在1-4中有各种缓存,缓存都是用hash方式存储在内存之中的。
2、master:
她的任务就比较杂,分别要维护mfsmount、mfschunkserver、mfsmetaloger的心跳和监听他们发的消息,这就是六个任务,还有需要处理一些需要定时的任务;
master、chunkserver和metaloger都是在主要架构中的模块;他们都有一个共同的框架:
(1) 首先初始化一个struct{name,function} RunTab[]的数组;
(2) initialize会遍历这个数组,调用RunTab中的function,
对应的函数就会把任务注册到各种队列中(如重载配置rlhead、定时任务timehead、事件驱动pollhead、心跳kahead),当然还有一些是初始化一些资源,比如说缓存(dcm,datacachememory)什么的;
(3) 然后就是mainloop遍历这些队列处理任务;
mfsmaster设计真是让人感觉太简单粗暴,Linux上用poll,性能过3000的时候就出问题了,整个mfaster是单线程运行的,应该是为了保证读写一致性,反正不一致还要线程间来回用锁同步,还不如直接用一个线程,可以节省锁的开销,设计者应该是这样想的吧,当然简单一点就好,别人可以按照自己的业务自己再重新设计,比如百度的shadowmfs就是把master改成了异步多线程的实现方式。
3、chunkserver
对于chunk的分析,首先要看结构了
(1) chunkserver是按照chunk(64M)来存的,mfshdd指定的存储目录存的就是整块的chunk;
(2) 既然号称文件系统,chunk的组织方式一定是B+树了;
事实上,chunkserver要复杂得多,除了节点之间的关系外,边也掺和进来了,MFS实现的比较全,什么软连接、硬连接、多个目录对应同一个文件之类的都是支持的;
(3) 针对多个用户传输文件,一定是多线程的,而且一定用了线程池,保证所有客户端的文件都在传;
(4)传输和存储都是漫长的过程,中间出现问题的概率也很大,一定有对应的状态机制和状态之间的各种转换和很多容错设计;
(5) 既然mfsmount中有缓存机制,那么chunk中一定会要实时监测mfsmount中的那个cache是不是新的,如果有新的文件被改写,一定要通知客户端更新缓存;
4、metalogger:
应该是没什么内容的,就是直接和master直接通信,比个版本号,定时把master实时的处理数据下载到本地,备份下来;
Moosefs源代码分析的更多相关文章
- MooseFS源代码分析(三)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...
- MooseFS源代码分析(二)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...
- android-plugmgr源代码分析
android-plugmgr是一个Android插件加载框架,它最大的特点就是对插件不需要进行任何约束.关于这个类库的介绍见作者博客,市面上也有一些插件加载框架,但是感觉没有这个好.在这篇文章中,我 ...
- Twitter Storm源代码分析之ZooKeeper中的目录结构
徐明明博客:Twitter Storm源代码分析之ZooKeeper中的目录结构 我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeepe ...
- 转:SDL2源代码分析
1:初始化(SDL_Init()) SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中 ...
- 转:RTMPDump源代码分析
0: 主要函数调用分析 rtmpdump 是一个用来处理 RTMP 流媒体的开源工具包,支持 rtmp://, rtmpt://, rtmpe://, rtmpte://, and rtmps://. ...
- 转:ffdshow 源代码分析
ffdshow神奇的功能:视频播放时显示运动矢量和QP FFDShow可以称得上是全能的解码.编码器.最初FFDShow只是mpeg视频解码器,不过现在他能做到的远不止于此.它能够解码的视频格式已经远 ...
- UiAutomator源代码分析之UiAutomatorBridge框架
上一篇文章<UIAutomator源代码分析之启动和执行>我们描写叙述了uitautomator从命令行执行到载入測试用例执行測试的整个流程.过程中我们也描写叙述了UiAutomatorB ...
- MyBatis架构设计及源代码分析系列(一):MyBatis架构
如果不太熟悉MyBatis使用的请先参见MyBatis官方文档,这对理解其架构设计和源码分析有很大好处. 一.概述 MyBatis并不是一个完整的ORM框架,其官方首页是这么介绍自己 The MyBa ...
随机推荐
- FilterDispatcher已被标注为过时解决办法 >>> FilterDispatcher <<< is deprecated!
一些struts2的教程都是比较早的,当我们基于较新版本的struts2来实现代码的时候,往往会出现一些问题.比如这个警告:FilterDispatcher isdeprecated! 在web.xm ...
- tomcat 自定义classpath(亲自测试)
因为一直以来使用tomcat和weblogic作为应用服务器为主,最近在升级新中间件的过程中遇到一个问题,我们的web前端应用现在升级是进行全量包升级的,因为现在的系统架构为前端和后端通过rpc框架交 ...
- C#语言和数据库基础
第一章 第一个C#程序 Vs2012密钥 RBCXF-CVBGR-382MK-DFHJ4-C69G8 01..net和C#的区别 大概在2000年,微软推出了一种革命性的产品--.NET(战略) 目标 ...
- javascript关于继承
上一篇已介绍了组合继承,现在讲讲剩余的几种继承. 原型式继承 调用一个函数,接收这个函数返回来的对象,这个对象的原型就是传入函数的参数对象. 如: function personObject(o){ ...
- javascript中DOM部分基础知识总结
1.DOM介绍 1.1 DOM概念 文档对象模型(Document Object Model),它定义了访问和处理HTML文档的标准方法.现在我们主要接触到的是HTML DOM. ...
- hyperv 创建虚拟以太网交换机失败
问题: hyperv 创建虚拟以太网交换机失败 解决办法: 取消无线共享,重新创建虚拟以太网交换机即可
- React Native环境配置和简单使用
# 前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会 ...
- IOS开发基础知识--碎片16
1:Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id) 对象在运行时获取其类型的能力称为内省.内省可以有多种方法实现. 判断对象类型 -(BOO ...
- ERROR ITMS-90682: Invalid Bundle - The asset catalog at 'Payload/XXXXX/Assets.car' can't contain 16-bit or P3 assets if the app supports iOS 9.3 or earlier.
刚升级Xcode 8, 幺蛾子又出现了.提交的时候出了这个问题. BTW,感谢google.以下为解决方案:‘ 在 Xcode 8 中,当你资源文件中[含有16位图]或者[图片显示模式γ值为'P3'] ...
- MRC下多个对象的内存管理
//set方法传递进来对象的生命周期,要求是在当前对象销毁之前,它一直存在就好- (void)setCar:(Car *)car{ //1.判断set方法传递进来的值是否与成员变量中保存的是同一个对象 ...