分享

Ceph源码目录架构

 hello_worldw6 2017-08-14

 简介

该代码架构基于版本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./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主要模块的源码,整体上可以分为三层,如下图所示:

Ceph软件架构(转载)_第1张图片

基础层包含了与业务无关的各类模块,例如对数值类型的定义、线程池、序列化等。

[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等;


上图中的每一个模块对应Ceph的src目录下的一个目录,还有部分目录没有体现在该图中,这些通常是一些辅助性质的目录,详细情况可以参考《Ceph源代码目录结构详解》。

从图中可以看出,整个Ceph从依赖关系角度,大体可以划分为三个层次:

1. 基础层(Base)
基础层包含了如业务无关的各类模块,例如对数值类型的定义、线程池、序列化等。

基础层包括以下模块:

  • include:包含数值类型的定义、API的定义、容器类、Buffer、枚举、序列化等

  • common:包含业务无关的通用模块,例如定时器、字符串处理、CRC、多线程、心跳、应用对象管理接口、配置文件解析等。

  • log:日志记录功能

  • global:全局的初始化、信号量处理等。

2. 组件层(Component)
组件层是为实现各项业务提供的功能组件,例如消息通讯、认证授权、数据分布算法等。

组件层包括以下模块:

  • auth:认证授权模块

  • crush:CRUSH数据分布算法

  • os(ObjectStore):对象存储,将本地存储组织为支持事务的本地存储接口,只用于OSD

  • msg:消息通讯

  • messages:各类消息的定义

  • osdc(osd client):osd的客户端,用于访问osd的数据

  • cls:插件机制

3. 子系统层(SubSystem)
子系统层即Ceph中各个功能节点,包括mon、osd、mds、client

子系统层包括以下功能模块:

  • mon:监控节点

  • osd:对象存储设备

  • mds:元数据服务器,用于CephFS的元数据管理

  • client:对osdc、mdsc的封装

在以上模块中,并没有提到RBD和RGW,因为严格说来,这两种仅仅是基于RADOS实现的一种应用,可以作为单独的系统进行分析。实际 上,CephFS也可以作为基于RADOS的一个应用来对待,但由于CephFS对应的mds和client与整个Ceph紧耦合(历史原因),所以我们 把这两个模块一并放到了整个Ceph的软件架构中。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多