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 | ceph_mds.cc (入口) |
2. ceph_mds.cc 业务功能分析
2.1 启动流程
2.1.1 初始化阶段
1 | int main(int argc, const char **argv) |
关键步骤:
NUMA 亲和性配置:
- 支持将 MDS 绑定到特定 NUMA 节点
- 提高性能,减少跨节点内存访问
MDS ID 验证:
- MDS ID 不能为空
- MDS ID 不能以数字开头(避免与 Rank 混淆)
守护进程化:
- 使用 Preforker 实现守护进程化
- 父进程等待子进程初始化后退出
2.1.2 消息传递器配置
1 | // 创建消息传递器 |
消息策略说明:
- Monitor:有损客户端,连接失败可重连
- MDS:无损对等体,保证消息可靠传输
- Client:有状态服务器,维护客户端会话
2.1.3 信号处理
1 | // 注册信号处理器 |
信号处理:
- SIGHUP:重新加载配置
- SIGINT/SIGTERM:优雅关闭 MDS
2.2 MDSDaemon 创建
1 | // 创建 MDSDaemon |
MDSDaemon 职责:
- 管理 MDSRank
- 处理 MDSMap 更新
- 处理管理命令
- 心跳和健康检查
3. MDS 核心功能模块
3.1 元数据管理(MDCache)
功能:管理文件系统元数据的缓存
核心组件:
- CInode:Inode 缓存对象
- CDir:目录缓存对象
- CDentry:目录项缓存对象
主要功能:
元数据缓存:
- 缓存 Inode、目录、目录项
- LRU 淘汰策略
- 内存压力管理
路径遍历:
- 根据路径查找 Inode
- 支持多种遍历标志(发现、锁定等)
- 跨 MDS 路径解析
目录碎片化:
- 大目录自动碎片化
- 目录合并
- 碎片管理
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 | 客户端请求 |
3.3 锁管理(Locker)
功能:管理文件系统的各种锁
锁类型:
SimpleLock:简单锁
- 用于文件大小、时间戳等属性
- 支持读锁和写锁
ScatterLock:分散锁
- 用于目录统计信息
- 支持分散更新
FileLock:文件锁
- 用于文件范围锁定
- 支持共享锁和排他锁
LocalLock:本地锁
- 用于本地操作
- 不跨 MDS 传播
锁管理功能:
- 锁获取和释放
- 锁升级和降级
- 锁超时处理
- 死锁检测
3.4 元数据日志(MDLog)
功能:记录元数据变更日志,用于恢复和复制
日志事件类型:
EUpdate:更新事件
- 记录元数据变更
- 包含完整的变更信息
ESession:会话事件
- 记录客户端会话
- 用于会话恢复
ESubtreeMap:子树映射事件
- 记录目录树分布
- 用于负载均衡
EFragment:碎片事件
- 记录目录碎片化
- 用于目录管理
ESegment:段事件
- 日志段管理
- 用于日志轮转
日志功能:
- 日志提交
- 日志回放
- 日志轮转
- 日志同步
3.5 快照管理(SnapServer/SnapClient)
功能:管理文件系统快照
核心组件:
- SnapServer:快照服务器(主 MDS)
- SnapClient:快照客户端(从 MDS)
- SnapRealm:快照域
主要功能:
快照创建:
- 创建快照
- 快照元数据管理
- 快照版本控制
快照删除:
- 删除快照
- 清理快照数据
- 快照引用计数
快照查询:
- 列出快照
- 查找快照
- 快照差异计算
快照回滚:
- 回滚到快照
- 数据恢复
3.6 负载均衡(MDBalancer)
功能:在多个 MDS 之间平衡元数据负载
负载均衡策略:
基于目录的负载均衡:
- 将目录树分布到不同 MDS
- 根据负载情况迁移目录
动态负载均衡:
- 监控各 MDS 负载
- 自动迁移热点目录
负载均衡算法:
- 基于目录大小的均衡
- 基于访问频率的均衡
- 基于 MDS 能力的均衡
负载均衡触发条件:
- MDS 负载差异超过阈值
- 新 MDS 加入
- MDS 故障恢复
3.7 目录迁移(Migrator)
功能:在 MDS 之间迁移目录子树
迁移类型:
导出(Export):
- 将目录子树导出到其他 MDS
- 更新目录映射
- 通知客户端
导入(Import):
- 从其他 MDS 导入目录子树
- 重建缓存
- 更新引用
迁移流程:
1 | 1. 选择迁移目标 |
3.8 会话管理(SessionMap)
功能:管理客户端会话
会话状态:
- OPEN:会话打开
- STALE:会话过期
- CLOSING:会话关闭中
- CLOSED:会话已关闭
会话功能:
- 会话创建和销毁
- 会话超时处理
- 会话恢复
- 会话统计
3.9 权限管理(Capability)
功能:管理客户端对文件和目录的访问权限
Capability 类型:
- CAP_AUTH:认证权限
- CAP_READ:读权限
- CAP_WRITE:写权限
- CAP_EXEC:执行权限
- CAP_ANY:任意权限
Capability 管理:
- Capability 授予
- Capability 回收
- Capability 刷新
- Capability 迁移
3.10 文件锁管理(flock)
功能:管理 POSIX 文件锁
锁类型:
- F_RDLCK:读锁(共享锁)
- F_WRLCK:写锁(排他锁)
- F_UNLCK:解锁
锁管理:
- 锁获取和释放
- 锁冲突检测
- 锁超时处理
- 死锁检测
3.11 恢复队列(RecoveryQueue)
功能:管理文件大小恢复
恢复场景:
- MDS 重启后恢复文件大小
- 从日志中恢复文件大小
- 修复不一致的文件大小
3.12 清理队列(PurgeQueue)
功能:管理已删除文件的清理
清理流程:
- 文件删除后进入 Stray 目录
- 延迟清理(等待引用释放)
- 从 OSD 删除数据
- 清理元数据
3.13 打开文件表(OpenFileTable)
功能:跟踪打开的文件
功能:
- 记录打开的文件
- 文件引用计数
- 文件关闭通知
- 文件迁移处理
3.14 指标处理(MetricsHandler)
功能:收集和报告 MDS 性能指标
指标类型:
- 请求延迟
- 请求吞吐量
- 缓存命中率
- 内存使用
- CPU 使用
3.15 健康检查(Beacon)
功能:向 Monitor 发送心跳,报告 MDS 健康状态
健康信息:
- MDS 状态(Active、Standby、Stopped)
- MDS 负载
- MDS 版本
- 故障信息
4. MDS 状态管理
4.1 MDS 状态
Standby:待机状态
- MDS 已启动但未分配 Rank
- 等待成为 Active 或 Standby-Replay
Standby-Replay:待机回放状态
- 跟随 Active MDS 回放日志
- 准备接管
Active:活跃状态
- 处理客户端请求
- 管理分配的 Rank
Stopped:停止状态
- MDS 已停止
- 等待清理
4.2 Rank 管理
Rank:MDS 的职责范围,每个 Rank 由一个 Active MDS 管理
Rank 分配:
- Monitor 分配 Rank
- 一个 Rank 只能有一个 Active MDS
- 可以有多个 Standby MDS
Rank 功能:
- 目录树分片
- 负载均衡
- 故障隔离
5. MDS 关键特性
5.1 高可用性
Standby MDS:
- 多个 Standby MDS 待命
- Active MDS 故障时自动接管
日志回放:
- Standby-Replay MDS 回放日志
- 快速故障恢复
故障检测:
- Beacon 心跳机制
- 自动故障转移
5.2 可扩展性
多 MDS 支持:
- 多个 Active MDS
- 目录树分片
动态负载均衡:
- 自动迁移热点目录
- 平衡 MDS 负载
目录碎片化:
- 大目录自动碎片化
- 提高并发性能
5.3 一致性保证
日志机制:
- 所有元数据变更记录日志
- 支持日志回放
锁机制:
- 分布式锁管理
- 保证操作原子性
版本控制:
- 元数据版本管理
- 冲突检测和解决
5.4 性能优化
元数据缓存:
- 内存缓存热点元数据
- LRU 淘汰策略
批量操作:
- 批量提交日志
- 批量更新元数据
异步 I/O:
- 异步处理客户端请求
- 提高并发性能
6. MDS 管理功能
6.1 Admin Socket 命令
通过 Admin Socket 可以执行以下命令:
- status:显示 MDS 状态
- lockup:锁定测试
- exit:退出 MDS
- respawn:重启 MDS
- dump cache:转储缓存
- flush journal:刷新日志
- scrub:数据校验
- export dir:导出目录
- import dir:导入目录
6.2 监控和统计
性能计数器:
- 请求延迟
- 请求吞吐量
- 缓存命中率
内存统计:
- Inode 数量
- 目录数量
- 目录项数量
操作统计:
- 各种操作的计数
- 操作延迟分布
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 的核心职责
- 启动管理:MDS 守护进程的启动和初始化
- 信号处理:处理系统信号(SIGHUP、SIGINT、SIGTERM)
- 守护进程化:实现守护进程化
- MDSDaemon 管理:创建和管理 MDSDaemon
8.2 MDS 的完整功能集
- 元数据管理:Inode、目录、目录项的管理
- 客户端服务:处理客户端文件系统操作
- 锁管理:分布式锁管理
- 日志管理:元数据变更日志
- 快照管理:文件系统快照
- 负载均衡:多 MDS 负载均衡
- 目录迁移:目录子树迁移
- 会话管理:客户端会话管理
- 权限管理:Capability 管理
- 文件锁:POSIX 文件锁
- 恢复机制:文件大小恢复
- 清理机制:已删除文件清理
- 监控统计:性能指标收集
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:目录迁移
正在加载留言…