CephFS 介绍及使用经验分享
阅读 1179
收藏 2
2019-01-14
原文链接:
www.jianshu.com
WebRTC SFU中发送数据包的丢失反馈juejin.im
目录
- Ceph架构介绍
- NFS介绍
- 分布式文件系统比较
- CephFS介绍
- MDS介绍
- 5.1 单活MDS介绍
- 5.2 单活MDS高可用
- CephFS遇到的部分问题
- 6.1 客户端缓存问题
- 6.2 务端缓存不释放
- 6.3 客户端夯住或者慢查询
- 6.4 客户端失去连接
- 6.5 主从切换问题
- CephFS问题解决方案
- 7.1 服务端缓存警告问题
- 7.2 客户端夯住问题
- 7.2.1 MDS锁的问题
- 7.3 MDS主从切换问题
- 7.3.1 为什么mds切换耗时比较高?
- 7.3.2 MDS切换循环?
- 7.4 客户端失去连接
- 总结及优化方案推荐
- 多活MDS
- 9.1 简介
- 9.2 多活MDS优势
- 9.3 多活MDS特点
- 9.4 CephFS Subtree Partitioning
- 9.4.1 介绍
- 9.5 Subtree Pinning(static subtree partitioning)
- 9.6 动态负载均衡
- 9.6.1 介绍
- 9.6.2 可配置的负载均衡
- 9.6.3 负载均衡策略
- 9.6.4 通过lua灵活控制负载均衡
- 9.6.5 内部结构图
- 多活负载均衡-实战演练
- 10.1 集群架构
- 10.2 扩容活跃MDS
- 10.3 多活MDS压测
- 10.4 多活MDS-动态负载均衡
- 10.5 多活MDS-静态分区(多租户隔离)
- 10.6 多活MDS-主备模式
- 多活负载均衡-总结
- 11.1 测试报告
- 11.2 结论
- MDS状态说明
- 12.1 MDS主从切换流程图
- 12.2 MDS状态
- 12.3 State Diagram
- 深入研究
- 13.1 MDS启动阶段分析
- 13.2 MDS核心组件
- 13.3 MDSDaemon类图
- 13.4 MDSDaemon源码分析
- 13.5 MDSRank类图
- 13.6 MDSRank源码分析
1. Ceph架构介绍

Ceph是一种为优秀的性能、可靠性和可扩展性而设计的统一的、分布式文件系统。
特点如下:
- 高性能
- a. 摒弃了传统的集中式存储元数据寻址的方案,采用CRUSH算法,数据分布均衡,并行度高。
- b.考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等。
- c. 能够支持上千个存储节点的规模,支持TB到PB级的数据。
- 高可用性
- a. 副本数可以灵活控制。
- b. 支持故障域分隔,数据强一致性。
- c. 多种故障场景自动进行修复自愈。
- d. 没有单点故障,自动管理。
- 高可扩展性
- a. 去中心化。
- b. 扩展灵活。
- c. 随着节点增加而线性增长。
- 特性丰富
- a. 支持三种存储接口:块存储、文件存储、对象存储。
- b. 支持自定义接口,支持多种语言驱动。
使用场景:
- 块存储 (适合单客户端使用)
- 典型设备:磁盘阵列,硬盘。
- 使用场景:
- a. docker容器、虚拟机远程挂载磁盘存储分配。
- b. 日志存储。
- ...
- 文件存储 (适合多客户端有目录结构)
- 典型设备:FTP、NFS服务器。
- 使用场景:
- a. 日志存储。
- b. 多个用户有目录结构的文件存储共享。
- ...
- 对象存储 (适合更新变动较少的数据,没有目录结构,不能直接打开/修改文件)
- 典型设备:s3, swift。
- 使用场景:
- a. 图片存储。
- b. 视频存储。
- c. 文件。
- d. 软件安装包。
- e. 归档数据。
- ...
系统架构:
Ceph 生态系统架构可以划分为四部分:
- Clients:客户端(数据用户)
- mds:Metadata server cluster,元数据服务器(缓存和同步分布式元数据)
- osd:Object storage cluster,对象存储集群(将数据和元数据作为对象存储,执行其他关键职能)
- mon:Cluster monitors,集群监视器(执行监视功能)

image.png
2. NFS介绍
1. NAS(Network Attached Storage)
- 网络存储基于标准网络协议NFSv3/NFSv4实现数据传输。
- 为网络中的Windows / Linux / Mac OS 等各种不同操作系统的计算机提供文件共享和数据备份。
- 目前市场上的NAS存储是专门的设备,成本较高,且容量不易动态扩展,数据高可用需要底层RAID来保障。
- CephFS属于NAS的解决方案的一种,主要优势在成本,容量扩展和高性能方案。
2. NFS(Network File System)
- NFS即网络文件系统,通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。
- NFS客户端和NFS服务器之间正是通过NFS协议进行通信的。
- 目前NFS协议版本有NFSv3、NFSv4和NFSv4.1,NFSv3是无状态的,NFSv4是有状态,NFSv3和NFSv4是基于Filelayout驱动的,而NFSv4.1是基于Blocklayout驱动。本文主要使用NFSv4协议。
3. 分布式文件系统比较
名称 | 功能 | 适合场景 | 优缺点 |
---|---|---|---|
MFS | 1. 单点MDS 2. 支持FUSE 3. 数据分片分布 4. 多副本 5. 故障手动恢复 |
大量小文件读写 | 1. 运维实施简单 2. 但存在单点故障 |
Ceph | 1. 多个MDS,可扩展 2. 支持FUSE 3. 数据分片(crush)分布 4. 多副本/纠删码 5. 故障自动恢复 |
统一小文件存储 | 1. 运维实施简单 2. 故障自愈,自我恢复 3. MDS锁的问题 4. J版本很多坑, L版本可以上生产环境 |
ClusterFS | 1. 不存在元数据节点 2. 支持FUSE 3. 数据分片分布 4. 镜像 5. 故障自动恢复 |
适合大文件 | 1. 运维实施简单 2. 不存储元数据管理 3. 增加了客户端计算负载 |
Lustre | 1. 双MDS互备,不可用扩展 2. 支持FUSE 3. 数据分片分布 4. 冗余(无) 5. 故障自动恢复 |
大文件读写 | 1. 运维实施复杂 2. 太庞大 3. 比较成熟 |
4. CephFS介绍

image.png
说明:
- CephFS 是个与 POSIX 标准兼容的文件系统。
- 文件目录和其他元数据存储在RADOS中。
- MDS缓存元信息和文件目录信息。
- 核心组件:MDS、Clients、RADOS。
- Client <–> MDS
元数据操作和capalities。 - Client <–> OSD
数据IO。 - MDS <–> OSD
元数据IO。
- Client <–> MDS
- 挂载方式:
- ceph-fuse ... 。
- mount -t ceph ... 。
- 可扩展性
- client读写osd 。
- 共享文件系统
- 多个clients可以同时读写 。
- 高可用
- MDS主备模式,Active/Standby MDSs 。
- 文件/目录Layouts
- 支持配置文件/目录的Layouts使用不同的Ppool 。
- POSIX ACLs
- CephFS kernel client默认支持。
- CephFS FUSE client可配置支持 。
- NFS-Ganesha
- 一个基于 NFSv3\v4\v4.1 的NFS服务器
- 运行在大多数 Linux 发行版的用户态空间下,同时也支持 9p.2000L 协议。
- Ganesha通过利用libcephfs库支持CephFS FSAL(File System Abstraction Layer,文件系统抽象层),可以将CephFS重新Export出去。
- Client Quotas
- CephFS FUSE client支持配置任何目录的Quotas。
- 负载均衡
- 动态负载均衡。
- 静态负载均衡。
- hash负载均衡。
5. MDS介绍
5.1 单活MDS介绍

image.png
说明:
- MDS全称Ceph Metadata Server,是CephFS服务依赖的元数据服务。
- 元数据的内存缓存,为了加快元数据的访问。
- 保存了文件系统的元数据(对象里保存了子目录和子文件的名称和inode编号)
- 保存cephfs日志journal,日志是用来恢复mds里的元数据缓存
- 重启mds的时候会通过replay的方式从osd上加载之前缓存的元数据
- 对外提供服务只有一个active mds。
- 所有用户的请求都只落在一个active mds上。
5.2 单活MDS高可用

image.png
说明:
- 对外提供服务只有一个active mds, 多个standby mds。
- active mds挂掉,standby mds会立马接替,保证集群高可用性。
- standby mds
- 冷备就是备份的mds,只起到一个进程备份的作用,并不备份lru元数据。主备进程保持心跳关系,一旦主的mds挂了,备份mds replay()元数据到缓存,当然这需要消耗一点时间。
- 热备除了进程备份,元数据缓存还时时刻刻的与主mds保持同步,当 active mds挂掉后,热备的mds直接变成主mds,并且没有replay()的操作,元数据缓存大小和主mds保持一致。