cept源代码目录结构详解_知识树(转)
1 简介
该代码架构基于版本10.0.5整理,先整理根目录里的代码,再整理出src目录的架构。
2 代码架构
2.1 Ceph源码根目录
Ceph的根目录下包含了一些文件夹和若干编译、代码格式相关的文件。
[admin]:架设Document服务器,包括依赖内容并介绍修改doc的流程。
[bin]:目前只包含一个在当前目录针对所有内容生产tar包的脚本
[cmake]:Ceph对cmake的支持。CMake 是一个跨平台的自动化安装编译系统,它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以产生标准的构建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 projects/workspaces 。文件 CMakeLists.txt 需要手工编写,也可以通过编写脚本进行半自动的生成。CMake 提供了比 autoconfig 更简洁的语法。
[debian]:用于制作debian(Ubuntu)安装包的相关脚本和文件。
[doc]:Ceph文档系统的源码,Ceph的文档和manpages都使用rst格式,该目录的内容将通过doc web服务器导出,最终效果如:http://docs.ceph.com/docs/master/
[etc]:Ceph的etc文件
[examples]:一些Ceph开发、命令使用、trace使用的例子。
[qa]:各个模块的功能测试(测试脚本和测试代码)
[src]:Ceph各个模块的源码目录
[systemd]:Ceph对于systemd的支持目录
[udev]:Ceph的udev规则
AUTHORS:记录了Ceph的Maintainer、CTL(Component Technical Leads)以及Contributors信息。
do_autogen.sh/autogen.sh/configure.ac:生成configure文件
run-cmake-check.sh :使用cmake编译ceph,适用于首次自动化编译,自动安装依赖包,需要运行用户有安装包的权限。
run-make-check.sh :使用make编译ceph,适用于首次自动化编译,自动安装依赖包,需要运行用户有安装包的权限。
Makefile.am:用于生成Makefile文件
ceph.spec.in:Ceph打包的spec文件
CMakeLists.txt:CMake工具使用的描述文件
CodingStyle:Ceph的代码编写规范
2.2 Ceph src目录内容
src目录包含了Ceph主要模块的源码,整体上可以分为三层,如下图所示:
1)Base
基础层包含了与业务无关的各类模块,例如对数值类型的定义、线程池、序列化等。
[include]:头文件,包含各种基本类型的定义,简单通用功能等。
[common]:共有模块,包含各类共有机制的实现,例如线程池、管理端口、节流阀等。
[log]:日志模块,主要负责记录本地log信息(默认/var/log/ceph/目录)
[global]:全局模块,主要是声明和初始化各类全局变量(全局上下文)、构建驻留进程、信号处理等。
[tracing]:Ceph tracing模块,目前支持使用lttng,可以在该目录下定义lttng的tracepoint。
2)Component
组件层是为实现各项业务提供的功能组件,例如消息通讯、认证授权、数据分布算法等。
[crush]:Crush模块,Ceph的数据分布算法 。其中CrushCompiler.cc主要负责对crushtool命令传入的crushmap.txt进行compile和parse(parse_tunable、parse_device、parse_bucket_type、parse_bucket、parse_rule),拿parse rule来说,解析后会通过CrushWrapper.h中的add_rule调用builder.cc的crush_add_rule实现rule的添加。总的来说crush.h 中定义了crush_map的结构和四种bucket类型,builder.c文件定义了crushmap中关于rule、bucket的增删改查操作。mapper定义了crushmap中的step、choose操作,而hash.c中定义了crush中使用的rjenkins算法。
[os]:对象存储(Object Store)模块,用于实现本地的对象存储功能,目前包括:bluestore、filestore、kstore、memstore;其中*store的基类为ObjectStore,定义在ObjectStore.h中。常用的是FileStore,定义在filestore目录,而Ceph为了解决性能问题,目前正在全力开发bluestore。这里先主要关注一下FileStore,在FileStore.h中主要定义了FileStore和FileStoreBackend两个类,其中FileStore中定义了Op的操作模型(OpWQ、OpSequencer)和transaction的操作模型,它继承自JournalingObjectStore类。而FileStoreBackend类定义了FileStore获取后端具体文件系统的一些操作。
[auth]:授权模块,实现了三方认知机制。
[msg]:消息通讯模块, OSD使用msg模块进行网络通讯,包括监听客户端的IO,与其它osd收发消息,以及与mon进行通讯等。该目录下包括用于定义通讯功能的抽象类Messenger以及目前的实现SimpleMessager、AsyncMessenger、XIO。
[messages]:消息模块,定义了Ceph各节点之间消息通讯中用到的消息类型。
[osdc]:OSD客户端(OSD Client),主要包括Objecter、ObjectCacher、Striper、Filer和Journaler。Objecter主要是将request封装成对应的Ops、计算出request需要发送的OSD并且以message的方式将Op发送出去。ObjectCacher是client端的Cache层。Stripper是将一个块设备映射成object,而Filer是把file的range映射成object。Journaler主要是用于MDS的
[kv]:定义了keyvaluestore的后端存储实现。
[cls]:针对第三方插件的支持。
3)SubSystem
子系统层即Ceph中各个功能节点,包括:
[mon]:Monitor作为Ceph集群状态管理者管理MonMap、PGMap和OSDMap,其主要由各种Monitor组件组成,并使用Paxos协议实现Mon之间数据同步来保证数据一致性,通过quorum协议来保证Mon之间的高可用。
AuthMonitor、LogMonitor、MDSMonitor、MonmapMonitor、OSDMonitor、PGMonitor、HealthMonitor
MonMap、PGMap、OSDMap
MonClient、MonCommands
Paxos、PaxosService、QuorumService
DataHealthService、HealthService、ConfigKeyService
MonitorDBStore
[osd]:定义了后端OSD、PG相关的类和处理逻辑。 在OSD模块中,最核心、也是实际处理IO请求和故障恢复的模块类是PG。 PG是一个对象的集合,包含对象名称的哈希值与PG的ID相符的所有对象。而在Ceph的软件设计中,PG是osd中处理IO的类,即属于某一个PG的对象的请求,全部由该对象对应的PG类的实例进行处理。 相对于PG,OSD实际扮演了一个服务者的角色,即为PG提供了以下服务:1)通过调用os模块提供本地存储服务;2)通过调用msg模块提供消息通讯服务;3)通过提供线程池提供计算服务。 可以将OSD理解为PG的运行环境。PG“生活”在某一个OSD中,也可能由于系统的变化,而迁移到另一个OSD中,这一过程实际也就是数据迁移的过程。
学习osd模块可以从一下类开始,稍后会整理出各类的作用以及相互之间的关系。
OSD、OSDService、OSDMap
PG、PGBackend、ReplicatedPG、ReplicatedBackend、PGLog
ECBackend、ECTransaction
HitSet
[mds]:MDS定义了维护了CephFS中的元数据,包括文件系统的树形结构、文件的属性、访问控制信息等,这些数据都是存在MDS节点的内存中,而真正的数据是存储在Rados里的。
MDSDaemon、MDSRank、MDSMap、Beacon、MDCache、MDBalancer
CDir、CDentry、CInode
MDSTable、InoTable
[client]:Client主要定义了CephFS client端的代码。
[rbd]:实现包括两部分:krbd(kernel版的rbd,源码在drivers/block/rbd.c)和librbd。
[rgw]:实现了rgw的功能,rgw的主要作用是协议转换,即把HTTP协议的请求转化为RGW Object再转换为Rados Object,交由Rados处理。
[tools]:Ceph中的各种工具的实现:cephfs、rados、rbd、rbd-nbd、ceph-authtool、ceph-conf、ceph-kvstore-tool、ceph-monstore-tool、ceph-objectstore-tool、crushtool、monmaptool、osdmaptool
[librados]:librados实现了rados层的接口,其中几个重要的数据结构有Rados、RadosClient、IoCtx、IoCtxImpl。IoCtx(include/rados/librados.hpp)是Rados I/O的一个上下文,其定义了大部分的I/O接口如read、write等;
从GitHub上Clone的Ceph项目,其目录下主要文件夹和文件的内容为:
1 根目录
[src]:各功能某块的源代码
[qa]:各个模块的功能测试(测试脚本和测试代码)
[wireshark]:#wireshark的ceph插件。
[admin]:管理工具,用于架设文档服务器等
[debian]:用于制作debian(Ubuntu)安装包的相关脚本和文件
[doc]:用于生成项目文档,生成结果参考http://ceph.com/docs/master/
[man]:ceph各命令行工具的man文件
configure.ac:用于生成configure的脚本
Makefile.am:用于生成Makefile的脚本
autogen.sh:负责生成configure。
do_autogen.sh:生成configure的脚本,实际上通过调用autogen.sh实现
ceph.spec.in:RPM包制作文件
2 src目录
[include]:头文件,包含各种基本类型的定义,简单通用功能等。
[common]:共有模块,包含各类共有机制的实现,例如线程池、管理端口、节流阀等。
[log]:日志模块,主要负责记录本地log信息(默认/var/log/ceph/目录)
[global]:全局模块,主要是声明和初始化各类全局变量(全局上下文)、构建驻留进程、信号处理等。
[auth]:授权模块,实现了三方认知机制。
[crush]:Crush模块,Ceph的数据分布算法
[msg]:消息通讯模块,包括用于定义通讯功能的抽象类Messenger以及目前的实现SimpleMessager
[messages]:消息模块,定义了Ceph各节点之间消息通讯中用到的消息类型。
[os]:对象(Object Store)模块,用于实现本地的对象存储功能,
[osdc]:OSD客户端(OSD Client),封装了各类访问OSD的方法。
[mon]:mon模块
[osd]:osd部分
[mds]:mds模块
[rgw]:rgw模块的
[librados]:rados库模块的代码
[librdb]:libbd库模块的代码
[client]:client模块,实现了用户态的CephFS客户端
[mount]:mount模块
[tools]:各类工具
[test]:单元测试
[perfglue]:与性能优化相关的源代码
[json_spirit]:外部项目json_spirit
[leveldb]:外部项目leveldb from google
[gtest]:gtest单元测试框架
[doc]:关于代码的一些说明文档
[bash_completion]:部分bash脚本的实现
[pybind]:python的包装器
[script]:各种python脚本
[upstart]:各种配置文件
ceph_mds.cc:驻留程序mds
ceph_mon.cc:驻留程序mon
ceph_osd.cc:驻留程序osd
libcephfs.cc:cephfs库
librdb.cc:rdb库
ceph_authtool.cc:工具ceph_authtool
ceph_conf.cc:工具ceph_conf
ceph_fuse.cc:工具ceph_fuse
ceph_syn.cc:工具ceph_syn
cephfs.cc:工具cephfs
crushtool.cc:工具crushtool
dupstore.cc:工具dupstore
librados-config.cc:rados库配置工具
monmaptool.cc:工具monmap
osdmaptool.cc:工具osdmap
psim.cc:工具psim
rados.cc:工具rados
rdb.cc:工具rdb
rados_export.cc:rados工具相关类
rados_import.cc:rados工具相关类
rados_sync.cc:rados工具相关类
rados_sync.h:rados工具相关类
sample.ceph.conf:配置文件样例
ceph.conf.twoosds:配置文件样例
Makefile.am:makefile的源文件
valgrind.supp:内存检查工具valgrind的配置文件
init-ceph.in:启动和停止ceph的脚本
mkcephfs.in:cephfs部署脚本



cept源代码目录结构详解_知识树(转)的更多相关文章
- Linux内核源代码目录结构详解
http://blog.csdn.net/u013014440/article/details/44024207
- Linux文件系统的目录结构详解
Linux文件系统的目录结构详解 一.前 言 文章对Linux下所有目录一一说明,对比较重要的目录加以重点解说,以帮助初学者熟练掌握Linux的目录结构. 二.目 录 1.什么是文件系统 2.文件 ...
- Angular-cli新建项目目录结构详解
Angular-cli新建项目目录结构详解 在上一篇博客中我们已经通过Angular CLI命令行工具创建出来一个全新的Angular项目,要想写项目,首先我们要先搞清楚项目的目录结构是怎样的,每个文 ...
- [转帖]Tomcat目录结构详解
Tomcat目录结构详解 https://www.cnblogs.com/veggiegfei/p/8474484.html 之前应该是知道一点 但是没有这么系统 感谢原作者的描述. 1.bin: 该 ...
- Linux目录结构(目录结构详解是重点)
1.Linux目录与Windows目录对比 1.Windows目录结构 2.Linux目录结构 深刻理解Linux 树状文件目录是非常重要的,只有记住他们,你才能在命令行中任意切换,想去哪里去哪里 2 ...
- Nuxt.js学习(二) --- Nuxt目录结构详解、Nuxt常用配置项、Nuxt路由配置和参数传递
[TOC] 1.Nuxt目录结构详解 Nuxt项目文件目录结构 |-- .nuxt // Nuxt自动生成,临时的用于编辑的文件,build |-- assets // 用于组织未编译的静态资源入LE ...
- Linux 目录结构详解
Linux目录详解 Linux目录详解(RHEL5.4) 由于linux是开放源代码,各大公司和团体根据linux的核心代码做各自的操作,编程.这样就造成在根下的目录的不同.这样就造成个人不能使用他人 ...
- Vue脚手架(vue-cli)搭建和目录结构详解
一.环境搭建 1.安装node.npm.webpack,不多说 2.安装vue-cli脚手架构建工具,打开命令行工具输入:npm install vue-cli -g,安装完成之后输入 vue -V( ...
- Linux中的文件和目录结构详解
对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...
随机推荐
- Kali无法启动、无法安装
好久未用Kali,换了个电脑后拷贝过去,发现打开登录界面无限循环,后删除下载新的vm镜像,发现无法开机,界面如下: 后经过各种尝试,发现为vmware版本太低的原因造成,升级vmware到版本14,可 ...
- js入门 关于js属性及其数据类型(详解)
1. js的本质就是处理数据.数据来自于后台的数据库. 所以变量就起到一个临时存储数据的作用. ECMAScript制定了js的数据类型. 数据类型有哪些? 1. 字符串 String 2. 数字 ...
- CSS奇淫技巧
对于图标,使用fontsize设置大小,而非宽高! 高度不够的时候使用min-height 保持宽高比 四个方向的padding都是相对于 本盒子的宽度来的 常用于视频和图片的展示,比如轮播图. 所以 ...
- Django学习笔记之视图高级-类视图
类视图 在写视图的时候,Django除了使用函数作为视图,也可以使用类作为视图.使用类视图可以使用类的一些特性,比如继承等. View django.views.generic.base.View是主 ...
- tolua 转换 std::shared_ptr
tolua 转换 std::shared_ptr 自从c++11以后std::shared_ptr几乎是比用的东西,经常会遇到类似如下应用 std::shared_ptr<Tst_ShareTe ...
- Ant将Jmeter的jtl文件转为html文件报“前言中不允许有内容”
ant执行jmeter的脚本的时候提示“Fatal Error! 前言中不允许有内容” 解决办法: 在jmeter的bin目录中找到jmeter.properties: 将文件中#jmeter.sav ...
- 记录一个源码安装mysql5.6的方法
https://www.jb51.net/article/118853.htm 如果之前源码安装过mysql5.6的话,卸载方法如下:rm -rf /var/lib/mysql/rm -rf /usr ...
- H3C BFD MAD检测方式的IRF典型配置举例
一.组网需求 由于网络规模迅速扩大,当前中心交换机(Device A)转发能力已经不能满足需求,现需要在保护现有投资的基础上将网络转发能力提高一倍,并要求网络易管理.易维护. 二.组网图 三.配置思路 ...
- HashMap与LinkedHashMap的区别
/** * remark: * HashMap与LinkedHashMap的区别 * 这里必须使用LinkedHashMap: * 原因 ...
- 17款提高编码效率的CSS工具
摘要:作为WEB前端开发人员,你的工作可能很大一部分都在编写CSS代码,为了提高前端开发人员编写CSS代码的效率,编程文库从 网上搜集了17款可以提高你CSS代码效率的CSS工具,它们可以帮助你快速生 ...