ceph_mgr源码解析

本文档深入解析Ceph Manager Daemon(ceph-mgr)的源码实现,介绍其作为存储系统管理组件的作用,详细讲解了mgr的启动过程、组件、功能及自定义plugin的编写。内容涵盖MgrStandby、Mgr、DaemonServer、PyModules等关键类的功能,以及handle_command和notify处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Ceph-Mgr之源码解析

导读

ceph luminous版本中新增加了一个组件: Ceph Manager Daemon,简称ceph-mgr。 该组件的主要作用是分担和扩展monitor的部分功能,减轻monitor的负担,让更好地管理ceph存储系统。
本文档基于luminous版本简单介绍ceph-mgr的源码实现。由于ceph-mgr还在开发完善,可能最新版与本文档部分内容有所出入,但是大体框架上应该是没什么变化的。
本文档不介绍ceph-mgr的安装部署与使用,具体请参照官网:Ceph Manager Daemon
本文档代码基于Luminous 12.2版本进行解析,由于社区存在代码变动,其它版本有可能对不上号,但是整体架构应该不会有太大的变化。

mgr的实现与用途

ceph-mgr是由C/C++、python以及Cpython等共同编写完成的,mgr的实现使用了大量的Extending Python with C or C++的语法,不熟悉这块的可以先在python官网中科普一下。
由ceph-mgr的实现其实大概可以猜到,其将ceph的部分C/C++实现的接口python化(即以前只能通过调用c/c++接口发送msg获取比如osdmap、monmap等集群状态,现通过mgr可以很方便地拿到。同时,ceph-mgr支持用户自定义的plugin(插件纯python开发,特别方便),用以实现特殊功能。
截至目前为止,ceph-mgr的官方plugins包括:

  • Dashboard(WEB界面的管理)、
  • Restful API(API方式获取ceph信息,应该与之前的ceph-rest-api功能一致)、
  • Zabbix、Prometheus、Influx(这三个实现了ceph的数据收集、监控等功能)

mgr组件

ceph-mgr的重要类或模块包括:MgrStandy、Mgr、DaemonServer、PyModules、ClusterState、DaemonState等。其主要功能描述如下:

MgrStandby
所有mgr服务启动时身份都是standby,唯一作用是包含一个mgr的client端,获取mgrmap及相关msg。在获取了mgr-map发现自己为当前active时,才会初始化mgr主服务进程。当mgrmap中变为非active状态,则shutdown mgr主服务进程,释放资源。

Mgr
主要工作是初始化daemonserver、pymodules、clusterstate等主要功能类,并handle standby mgr client的非mgrmap的消息(osdmap、pgmap、fsmap等)。执行了monc->sub_want()函数,注册了定期获取数据操作。

DaemonServer
为mgr主要的服务进程,和osd、mds等类似,初始化了一个mgr类型的Messenger,监听有关mgr消息,主要是MSG_PGSTATS、MSG_MGR_REPORT、MSG_MGR_OPEN、MSG_COMMAND。比如执行‘ceph tell mgr {command}’时就被发送到daemonserver中handle_command函数进行处理(包括了native命令和plugin的commands)

PyModules
包含ActivePyModule、StandbyPyModules、ActivePyModules、BaseMgrModules、BaseMgrStandbyModules、PyModulesRegistry、PyModuleRunner等类,分别处理mgr处于active和standby时对plugins的处理,并在active时初始化python的运行环境,将plugin模块初始化并加载运行。该类大量使用了python的c++扩展接口。

ClusterState
保存了cluster的状态,部分状态在monc中,由mgr类定期更新状态(ms_dispatch)

DaemonState
保存了DaemonServer的状态信息

这些类之间的关系如下图所示:
ceph-mgr 类图

Ceph-Mgr 启动过程

ceph-mgr启动流程

图片已经很详细了,文字就不多说了。
mgr基于Active-Standby模式,大体流程就是mgr进程启动时先以MgrStandby身份启动,即所有mgr启动时都是standby,然后通过map知道自己是Active的mgr后,才会启动实际处理程序初始化DaemonServer,监听有关mgr的消息,加载并运行modules(一部分为用户自定义plugins)。

Mgr的一些功能介绍

mgr提供了常用的几种函数接口,只要重载这些接口,就能开发plugin实现特定功能。以下是官方的介绍,即实现服务器、消息通知、自定义命令等功能:

serve: member function for server-type modules. This function should block forever.
notify: member function if your module needs to take action when new cluster data is available.
handle_command: member function if your module exposes CLI commands.

编写自定义plugin

下面以简单的自定义命令为例,描述如何编写mgr的plugin。其他功能可自行参考源码中的ceph plugin,自行学习模仿编写。

  • 步骤一:在src/pybind/mgr/ 目录下新建一个plugin,名字为hello,然后在hello目录下新建一个名为init.py和module.py(名字必须是module.py,这是mgr程序识别这个plugin的核心文件)。两个文件内容如下所示:

                
<think>好的,用户现在问的是“ceph_pg_total - ceph_pg_active > 0”,需要解释这个指标的含义以及如何处理。首先,我需要回忆一下Ceph中的PG相关知识。PG是Placement Group,用于分布数据的重要概念。用户提到的这个指标是总PG数减去活跃PG数,如果差值大于0,说明有部分PG不处于活跃状态。 接下来,我得先解释这个指标的基本含义。用户可能是运维人员或者开发人员,遇到了集群健康问题,需要诊断为什么有些PG不活跃。需要明确PG的状态,比如active、peering、recoverying等等。当PG不活跃时,可能影响数据的读写,所以用户需要知道如何处理。 然后,要分析可能的原因。可能的原因包括OSD故障、网络问题、数据不一致需要恢复,或者是新创建的PG还没完全激活。需要逐个解释这些原因,并给出对应的排查步骤。例如,检查OSD状态,查看集群日志,确认网络连通性等等。 用户可能已经检查过ceph health,或者通过监控系统发现了这个指标异常,需要进一步的指导。所以需要给出具体的命令,比如ceph pg stat,ceph pg dump_stuck,以及如何查看特定PG的详细信息。 解决方案部分,需要针对不同原因给出不同的处理方法。如果是OSD下线,可能需要重启服务或更换硬件;如果是数据恢复,需要等待或调整恢复参数;如果是网络问题,需要检查配置和连通性。 还需要考虑预防措施,比如监控配置、定期维护、硬件冗余等。用户可能不仅想解决当前问题,还想避免未来再次发生。 需要确保回答清晰,步骤明确,命令正确,并且用中文口语化表达,避免术语过于晦涩。同时,用户可能希望得到直接的解决方案,所以结构要分明,分点列出原因、排查步骤和解决方法,便于用户快速执行。 最后,提醒用户如果问题依然存在,需要提供更多日志或输出来进一步诊断。这有助于用户在遇到复杂问题时,知道如何收集必要的信息寻求帮助。</think>你提到的 **`ceph_pg_total - ceph_pg_active > 0`** 是 Ceph 存储集群中的一个重要监控指标,表示当前集群中存在 **非活跃状态的 PG(Placement Group,放置组)**。以下是详细解释及应对方法: --- ### **1. 术语解释** - **PG(Placement Group)**: Ceph 将数据划分为多个 PG,每个 PG 是数据分布的最小逻辑单元,负责将数据映射到具体的 OSD(Object Storage Daemon)。 - **`ceph_pg_total`**:集群中所有 PG 的总数。 - **`ceph_pg_active`**:处于 **`active`** 状态的 PG 数量(即正常提供读写服务的 PG)。 - **指标含义**: `ceph_pg_total - ceph_pg_active > 0` 表示有部分 PG 处于非活跃状态(如 `peering`、`recovering`、`incomplete` 等),可能导致数据暂时不可访问或性能下降。 --- ### **2. 常见原因** #### **(1) OSD 故障或下线** - 某个 OSD 宕机或网络中断,导致 PG 的副本数不足。 - 触发 PG 进入 `peering` 状态(正在协商副本一致性)。 #### **(2) 数据恢复或回填** - 新增/移除 OSD 或调整 CRUSH Map 后,PG 正在执行数据迁移(`backfilling`、`recovering`)。 - 此时 PG 处于临时非活跃状态。 #### **(3) PG 状态异常** - PG 因数据不一致进入 `incomplete` 状态(无法选举出权威副本)。 - 集群配置错误(如 `pg_num` 设置不合理)。 #### **(4) 资源不足** - OSD 负载过高(CPU、磁盘 IO 或网络带宽耗尽),导致 PG 无法及时激活。 --- ### **3. 排查步骤** #### **(1) 查看集群健康状态** ```bash ceph health detail # 检查具体告警信息 ceph pg stat # 查看 PG 统计(active、peering、recovering 数量) ceph pg dump_stuck # 列出“卡住”的 PG(如 inactive 超过阈值) ``` #### **(2) 检查 PG 详细状态** ```bash # 查看所有 PG 的状态分布 ceph pg stat # 检查具体 PG 的状态(替换 <pg-id>) ceph pg <pg-id> query # 显示 PG 的详细状态、OSD 映射和事件历史 ``` #### **(3) 关联 OSD 状态** ```bash ceph osd tree # 检查 OSD 是否在线(`up`)和容量 ceph osd perf # 查看 OSD 的延迟和负载 ``` #### **(4) 检查日志** ```bash # 查看 Ceph 集群日志(通常位于 /var/log/ceph/) tail -f /var/log/ceph/ceph.log | grep -i pg_stat ``` --- ### **4. 解决方案** #### **(1) 处理 OSD 故障** - 重启故障 OSD: ```bash systemctl restart ceph-osd@<osd-id> ``` - 若 OSD 无法恢复,替换硬件后重新加入集群。 #### **(2) 等待数据恢复完成** - 如果是临时迁移或恢复操作,监控进度: ```bash ceph -w # 实时观察 PG 恢复状态 ceph pg dump | grep recovering ``` - 调整恢复速度(若需加快): ```bash ceph tell osd.* injectargs '--osd-max-backfills=4' # 增加并发恢复数 ``` #### **(3) 修复异常 PG** - 若 PG 卡在 `incomplete` 或 `stale` 状态,尝试修复: ```bash ceph pg repair <pg-id> # 触发 PG 修复(谨慎操作!) ``` - 若修复无效,可能需要手动干预(如重置 PG),建议联系社区或专业支持。 #### **(4) 优化 PG 分布** - 调整 PG 数量(需谨慎,避免数据震荡): ```bash ceph osd pool set <pool-name> pg_num <new-pg-num> ``` - 确保 `pg_num` 和 `pgp_num` 设置合理(参考 [Ceph PG 计算器](https://ceph.io/pgcalc/))。 --- ### **5. 预防措施** - **监控告警**:配置 PG 状态监控(如 `active+clean` 比例)。 - **容量规划**:避免 OSD 过载,预留足够的 PG 数量。 - **定期维护**:升级 Ceph 版本、检查硬件状态、优化 CRUSH Map。 --- 如果需要进一步分析,请提供以下信息: - `ceph pg stat` 的输出 - `ceph health detail` 的告警详情 - 相关 PG 的查询结果(`ceph pg <pg-id> query`)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值