MDS 业务功能详细分析

MDS 业务功能详细分析

1. 概述

MDS(Metadata Server,元数据服务器)是 CephFS 的核心组件,负责管理分布式文件系统的元数据,包括目录树、文件属性、权限、快照等。本文档详细分析 ceph_mds.cc 的业务功能以及 MDS 的完整功能集。

1.1 ceph_mds.cc 的作用

ceph_mds.cc 是 MDS 守护进程的入口点,主要负责:

  • MDS 守护进程的启动和初始化
  • 信号处理
  • 守护进程化
  • MDSDaemon 的创建和管理

1.2 MDS 架构

1
2
3
4
5
6
7
8
9
10
11
12
13
ceph_mds.cc (入口)

MDSDaemon (守护进程管理)

MDSRank (Rank 管理)
├── Server (客户端请求处理)
├── MDCache (元数据缓存)
├── MDLog (元数据日志)
├── Locker (锁管理)
├── SnapServer/SnapClient (快照管理)
├── MDBalancer (负载均衡)
├── Migrator (目录迁移)
└── SessionMap (会话管理)

2. ceph_mds.cc 业务功能分析

2.1 启动流程

2.1.1 初始化阶段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main(int argc, const char **argv)
{
// 1. 设置线程名称
ceph_pthread_setname("ceph-mds");

// 2. 全局初始化
auto cct = global_init(NULL, args,
CEPH_ENTITY_TYPE_MDS,
CODE_ENVIRONMENT_DAEMON, 0);

// 3. NUMA 节点亲和性配置
// 4. 参数解析
// 5. 守护进程化(Preforker)
// 6. 网络地址选择
// 7. MDS ID 验证
// 8. 创建 Messenger
// 9. 创建 MDSDaemon
// 10. 初始化 MDSDaemon
}

关键步骤

  1. NUMA 亲和性配置

    • 支持将 MDS 绑定到特定 NUMA 节点
    • 提高性能,减少跨节点内存访问
  2. MDS ID 验证

    • MDS ID 不能为空
    • MDS ID 不能以数字开头(避免与 Rank 混淆)
  3. 守护进程化

    • 使用 Preforker 实现守护进程化
    • 父进程等待子进程初始化后退出

2.1.2 消息传递器配置

1
2
3
4
5
6
7
8
// 创建消息传递器
Messenger *msgr = Messenger::create(...);

// 配置消息策略
msgr->set_default_policy(Messenger::Policy::lossy_client(required));
msgr->set_policy(entity_name_t::TYPE_MON, ...); // Monitor:有损客户端
msgr->set_policy(entity_name_t::TYPE_MDS, ...); // MDS:无损对等体
msgr->set_policy(entity_name_t::TYPE_CLIENT, ...); // 客户端:有状态服务器

消息策略说明

  • Monitor:有损客户端,连接失败可重连
  • MDS:无损对等体,保证消息可靠传输
  • Client:有状态服务器,维护客户端会话

2.1.3 信号处理

1
2
3
4
// 注册信号处理器
register_async_signal_handler(SIGHUP, sighup_handler); // 重新加载配置
register_async_signal_handler_oneshot(SIGINT, handle_mds_signal); // 中断
register_async_signal_handler_oneshot(SIGTERM, handle_mds_signal); // 终止

信号处理

  • SIGHUP:重新加载配置
  • SIGINT/SIGTERM:优雅关闭 MDS

2.2 MDSDaemon 创建

1
2
3
4
5
// 创建 MDSDaemon
mds = new MDSDaemon(g_conf()->name.get_id().c_str(), msgr, &mc, ctxpool);

// 初始化
r = mds->init();

MDSDaemon 职责

  • 管理 MDSRank
  • 处理 MDSMap 更新
  • 处理管理命令
  • 心跳和健康检查

3. MDS 核心功能模块

3.1 元数据管理(MDCache)

功能:管理文件系统元数据的缓存

核心组件

  • CInode:Inode 缓存对象
  • CDir:目录缓存对象
  • CDentry:目录项缓存对象

主要功能

  1. 元数据缓存

    • 缓存 Inode、目录、目录项
    • LRU 淘汰策略
    • 内存压力管理
  2. 路径遍历

    • 根据路径查找 Inode
    • 支持多种遍历标志(发现、锁定等)
    • 跨 MDS 路径解析
  3. 目录碎片化

    • 大目录自动碎片化
    • 目录合并
    • 碎片管理
  4. Stray 管理

    • 处理删除的文件
    • Stray 目录管理
    • 延迟清理

3.2 客户端请求处理(Server)

功能:处理客户端发送的文件系统操作请求

支持的操作

3.2.1 文件操作

  • LOOKUP:查找文件/目录
  • GETATTR:获取文件属性
  • SETATTR:设置文件属性
  • OPEN:打开文件
  • CREATE:创建文件
  • MKNOD:创建设备节点
  • UNLINK:删除文件
  • LINK:创建硬链接
  • SYMLINK:创建符号链接
  • READLINK:读取符号链接

3.2.2 目录操作

  • MKDIR:创建目录
  • RMDIR:删除目录
  • READDIR:读取目录
  • RENAME:重命名文件/目录

3.2.3 扩展属性操作

  • GETXATTR:获取扩展属性
  • SETXATTR:设置扩展属性
  • LISTXATTR:列出扩展属性
  • REMOVEXATTR:删除扩展属性

3.2.4 快照操作

  • MKSNAP:创建快照
  • RMSNAP:删除快照
  • LSSNAP:列出快照
  • LOOKUPSNAP:查找快照

3.2.5 其他操作

  • FLUSH:刷新数据
  • FSYNC:同步文件系统
  • SETFILELOCK:设置文件锁
  • GETFILELOCK:获取文件锁

请求处理流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
客户端请求

Server::dispatch_client_request()

Server::handle_client_request()

路径解析(MDCache::path_traverse)

权限检查(Locker::check_caps)

执行操作(do_* 方法)

日志记录(MDLog::submit_entry)

发送回复(send_reply)

3.3 锁管理(Locker)

功能:管理文件系统的各种锁

锁类型

  1. SimpleLock:简单锁

    • 用于文件大小、时间戳等属性
    • 支持读锁和写锁
  2. ScatterLock:分散锁

    • 用于目录统计信息
    • 支持分散更新
  3. FileLock:文件锁

    • 用于文件范围锁定
    • 支持共享锁和排他锁
  4. LocalLock:本地锁

    • 用于本地操作
    • 不跨 MDS 传播

锁管理功能

  • 锁获取和释放
  • 锁升级和降级
  • 锁超时处理
  • 死锁检测

3.4 元数据日志(MDLog)

功能:记录元数据变更日志,用于恢复和复制

日志事件类型

  1. EUpdate:更新事件

    • 记录元数据变更
    • 包含完整的变更信息
  2. ESession:会话事件

    • 记录客户端会话
    • 用于会话恢复
  3. ESubtreeMap:子树映射事件

    • 记录目录树分布
    • 用于负载均衡
  4. EFragment:碎片事件

    • 记录目录碎片化
    • 用于目录管理
  5. ESegment:段事件

    • 日志段管理
    • 用于日志轮转

日志功能

  • 日志提交
  • 日志回放
  • 日志轮转
  • 日志同步

3.5 快照管理(SnapServer/SnapClient)

功能:管理文件系统快照

核心组件

  • SnapServer:快照服务器(主 MDS)
  • SnapClient:快照客户端(从 MDS)
  • SnapRealm:快照域

主要功能

  1. 快照创建

    • 创建快照
    • 快照元数据管理
    • 快照版本控制
  2. 快照删除

    • 删除快照
    • 清理快照数据
    • 快照引用计数
  3. 快照查询

    • 列出快照
    • 查找快照
    • 快照差异计算
  4. 快照回滚

    • 回滚到快照
    • 数据恢复

3.6 负载均衡(MDBalancer)

功能:在多个 MDS 之间平衡元数据负载

负载均衡策略

  1. 基于目录的负载均衡

    • 将目录树分布到不同 MDS
    • 根据负载情况迁移目录
  2. 动态负载均衡

    • 监控各 MDS 负载
    • 自动迁移热点目录
  3. 负载均衡算法

    • 基于目录大小的均衡
    • 基于访问频率的均衡
    • 基于 MDS 能力的均衡

负载均衡触发条件

  • MDS 负载差异超过阈值
  • 新 MDS 加入
  • MDS 故障恢复

3.7 目录迁移(Migrator)

功能:在 MDS 之间迁移目录子树

迁移类型

  1. 导出(Export)

    • 将目录子树导出到其他 MDS
    • 更新目录映射
    • 通知客户端
  2. 导入(Import)

    • 从其他 MDS 导入目录子树
    • 重建缓存
    • 更新引用

迁移流程

1
2
3
4
5
6
1. 选择迁移目标
2. 冻结目录操作
3. 导出目录数据
4. 更新目录映射
5. 通知客户端
6. 完成迁移

3.8 会话管理(SessionMap)

功能:管理客户端会话

会话状态

  • OPEN:会话打开
  • STALE:会话过期
  • CLOSING:会话关闭中
  • CLOSED:会话已关闭

会话功能

  • 会话创建和销毁
  • 会话超时处理
  • 会话恢复
  • 会话统计

3.9 权限管理(Capability)

功能:管理客户端对文件和目录的访问权限

Capability 类型

  1. CAP_AUTH:认证权限
  2. CAP_READ:读权限
  3. CAP_WRITE:写权限
  4. CAP_EXEC:执行权限
  5. CAP_ANY:任意权限

Capability 管理

  • Capability 授予
  • Capability 回收
  • Capability 刷新
  • Capability 迁移

3.10 文件锁管理(flock)

功能:管理 POSIX 文件锁

锁类型

  • F_RDLCK:读锁(共享锁)
  • F_WRLCK:写锁(排他锁)
  • F_UNLCK:解锁

锁管理

  • 锁获取和释放
  • 锁冲突检测
  • 锁超时处理
  • 死锁检测

3.11 恢复队列(RecoveryQueue)

功能:管理文件大小恢复

恢复场景

  • MDS 重启后恢复文件大小
  • 从日志中恢复文件大小
  • 修复不一致的文件大小

3.12 清理队列(PurgeQueue)

功能:管理已删除文件的清理

清理流程

  1. 文件删除后进入 Stray 目录
  2. 延迟清理(等待引用释放)
  3. 从 OSD 删除数据
  4. 清理元数据

3.13 打开文件表(OpenFileTable)

功能:跟踪打开的文件

功能

  • 记录打开的文件
  • 文件引用计数
  • 文件关闭通知
  • 文件迁移处理

3.14 指标处理(MetricsHandler)

功能:收集和报告 MDS 性能指标

指标类型

  • 请求延迟
  • 请求吞吐量
  • 缓存命中率
  • 内存使用
  • CPU 使用

3.15 健康检查(Beacon)

功能:向 Monitor 发送心跳,报告 MDS 健康状态

健康信息

  • MDS 状态(Active、Standby、Stopped)
  • MDS 负载
  • MDS 版本
  • 故障信息

4. MDS 状态管理

4.1 MDS 状态

  1. Standby:待机状态

    • MDS 已启动但未分配 Rank
    • 等待成为 Active 或 Standby-Replay
  2. Standby-Replay:待机回放状态

    • 跟随 Active MDS 回放日志
    • 准备接管
  3. Active:活跃状态

    • 处理客户端请求
    • 管理分配的 Rank
  4. Stopped:停止状态

    • MDS 已停止
    • 等待清理

4.2 Rank 管理

Rank:MDS 的职责范围,每个 Rank 由一个 Active MDS 管理

Rank 分配

  • Monitor 分配 Rank
  • 一个 Rank 只能有一个 Active MDS
  • 可以有多个 Standby MDS

Rank 功能

  • 目录树分片
  • 负载均衡
  • 故障隔离

5. MDS 关键特性

5.1 高可用性

  1. Standby MDS

    • 多个 Standby MDS 待命
    • Active MDS 故障时自动接管
  2. 日志回放

    • Standby-Replay MDS 回放日志
    • 快速故障恢复
  3. 故障检测

    • Beacon 心跳机制
    • 自动故障转移

5.2 可扩展性

  1. 多 MDS 支持

    • 多个 Active MDS
    • 目录树分片
  2. 动态负载均衡

    • 自动迁移热点目录
    • 平衡 MDS 负载
  3. 目录碎片化

    • 大目录自动碎片化
    • 提高并发性能

5.3 一致性保证

  1. 日志机制

    • 所有元数据变更记录日志
    • 支持日志回放
  2. 锁机制

    • 分布式锁管理
    • 保证操作原子性
  3. 版本控制

    • 元数据版本管理
    • 冲突检测和解决

5.4 性能优化

  1. 元数据缓存

    • 内存缓存热点元数据
    • LRU 淘汰策略
  2. 批量操作

    • 批量提交日志
    • 批量更新元数据
  3. 异步 I/O

    • 异步处理客户端请求
    • 提高并发性能

6. MDS 管理功能

6.1 Admin Socket 命令

通过 Admin Socket 可以执行以下命令:

  1. status:显示 MDS 状态
  2. lockup:锁定测试
  3. exit:退出 MDS
  4. respawn:重启 MDS
  5. dump cache:转储缓存
  6. flush journal:刷新日志
  7. scrub:数据校验
  8. export dir:导出目录
  9. import dir:导入目录

6.2 监控和统计

  1. 性能计数器

    • 请求延迟
    • 请求吞吐量
    • 缓存命中率
  2. 内存统计

    • Inode 数量
    • 目录数量
    • 目录项数量
  3. 操作统计

    • 各种操作的计数
    • 操作延迟分布

7. MDS 与其他组件的交互

7.1 与 Monitor 的交互

  • MDSMap 同步:接收 MDSMap 更新
  • 心跳报告:通过 Beacon 发送心跳
  • 状态报告:报告 MDS 状态和负载

7.2 与 OSD 的交互

  • 元数据存储:将元数据存储在 OSD
  • 文件数据:文件数据存储在 OSD
  • 快照数据:快照数据存储在 OSD

7.3 与客户端的交互

  • 请求处理:处理客户端文件系统操作
  • 会话管理:管理客户端会话
  • 权限管理:管理客户端权限

7.4 与其他 MDS 的交互

  • 目录迁移:在 MDS 之间迁移目录
  • 日志同步:同步日志到 Standby MDS
  • 负载均衡:协调负载均衡

8. 总结

8.1 ceph_mds.cc 的核心职责

  1. 启动管理:MDS 守护进程的启动和初始化
  2. 信号处理:处理系统信号(SIGHUP、SIGINT、SIGTERM)
  3. 守护进程化:实现守护进程化
  4. MDSDaemon 管理:创建和管理 MDSDaemon

8.2 MDS 的完整功能集

  1. 元数据管理:Inode、目录、目录项的管理
  2. 客户端服务:处理客户端文件系统操作
  3. 锁管理:分布式锁管理
  4. 日志管理:元数据变更日志
  5. 快照管理:文件系统快照
  6. 负载均衡:多 MDS 负载均衡
  7. 目录迁移:目录子树迁移
  8. 会话管理:客户端会话管理
  9. 权限管理:Capability 管理
  10. 文件锁:POSIX 文件锁
  11. 恢复机制:文件大小恢复
  12. 清理机制:已删除文件清理
  13. 监控统计:性能指标收集

8.3 MDS 的关键特性

  • 高可用性:Standby MDS、日志回放、故障转移
  • 可扩展性:多 MDS、负载均衡、目录碎片化
  • 一致性:日志机制、锁机制、版本控制
  • 高性能:元数据缓存、批量操作、异步 I/O

8.4 相关文件

  • ceph_mds.cc:MDS 守护进程入口
  • MDSDaemon.h/cc:MDS 守护进程管理
  • MDSRank.h/cc:MDS Rank 管理
  • Server.h/cc:客户端请求处理
  • MDCache.h/cc:元数据缓存
  • MDLog.h/cc:元数据日志
  • Locker.h/cc:锁管理
  • SnapServer.h/cc:快照服务器
  • MDBalancer.h/cc:负载均衡
  • Migrator.h/cc:目录迁移

文章互动

阅读 --

留言

0 条留言

正在加载留言…