Ceph架构简介及使用场景
Ceph简介
Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。
Ceph项目最早起源于Sage就读博士期间的工作(最早的成果于2004年发表),并随后贡献给开源社区。在经过了数年的发展之后,目前已得到众多云计算厂商的支持并被广泛应用。RedHat及OpenStack都可与Ceph整合以支持虚拟机镜像的后端存储。
为什么要用Ceph
Ceph本身优势突出,追求用最廉价的设备做最牛逼的存储。
先进的设计思想可以总结为以下四点。
-
高性能
摈弃了传统的集中式存储元数据寻址的方案,采用CRUSH算法,数据分布均衡,并行度高。考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等等。能够支持上千个存储节点的规模,支持TB到PB级的数据
-
高可用性
副本数可以灵活控制。支持故障域分割,数据强一致性。多种故障场景自动进行修复。没有单点故障,自动管理。
-
高拓展性
拓展灵活,随着节点的增加而线性增长
-
特性丰富
支持三种存储接口:块存储、文件存储、对象存储。支持自定义接口,支持多语言驱动。
什么是文件存储,块存储,对象存储
块存储
rbd
典型设备:磁盘阵列,硬盘
主要是将裸磁盘空间映射给主机使用的。
优点:
通过Raid与LVM等手段,对数据提供了保护。
多块廉价的硬盘组合起来,提高容量
多块磁盘组合出来的逻辑盘,提升读写效率。
缺点:
采用SAN架构组网时,光纤交换机,造价成本高。
主机之间无法共享数据。
使用场景:
docker容器、虚拟机磁盘存储分配。
日志存储。
文件存储。
...
文件存储
fs
典型设备:FTP、NFS服务器
为了克服块存储文件无法共享的问题,所以有了文件存储。
在服务器上架设FTP与NFS服务,就是文件存储。
优点:
造价低,随便一台机器就可以了。
方便文件共享。
缺点:
读写速率低。
传输速率慢。
使用场景:
日志存储。
有目录结构的文件存储。
...
对象存储
rgw
如果你只需要提供文件的元数据与真实数据,存储设备负责帮你生成文件,然后存到硬盘中去,这就称之为对象存储,你操作的内容都称之为对象。
典型设备:内置大容量硬盘的分布式服务器(swift, s3)
多台服务器内置大容量硬盘,安装上对象存储管理软件,对外提供读写访问功能。
优点:
具备块存储的读写高速。
具备文件存储的共享等特性。
使用场景:(适合更新变动较少的数据)
图片存储。
视频存储。
…
关于ceph的块存储、文件存储、对象存储
- Block(块):支持精简配置、快照、克隆
- File(文件系统):Posix接口,支持快照
- Object(对象):有原生的API,而且也兼容swift和S3的API
ceph的架构层级
自下而上:
1、基础存储系统RADOS,即可靠的,自动化的,分布式的对象存储
2、基础库LIBRADOS
3、高层应用接口
1、对象存储接口:RADOS GW (RADOS Gateway)
2、块存储接口:RBD (Reliable Block Device)
3、文件存储接口: Ceph FS (Ceph File System)
4、应用层:基于高层文件接口或者数据库librados开发出来的各种app,或者主机、vm等诸多客户端
图1
基础存储系统RADOS
RADOS的子集群
Ceph的底层是Rados,而RADOS由多个子集群构成
-
1、若干个数据盘:一个Ceph存储节点上可以有一个或者多个数据盘,每个数据盘上部署有特定的文件系统。可以是一个分区当一个disk,也可以是一个raid当一个disk,一整块盘当disk效率更高更加的稳定。
文件系统: 1、btrfs(b-tree 文件系统),功能强大,但是资源耗费也高 2、xfs 在高伸缩性数据存储方面具有优势
-
2、OSD集群:一个做好文件系统的disk由一个OSD Daemon管理,OSD Daemon负责
1、负责控制数据盘上的文件读写操作,与client通信完成各种数据对象操作等等
2、负责数据的拷贝和恢复
3、每个OSD守护进程监视它自己的状态,以及别的OSD的状态,并且报告给Monito
在一个服务器上,一个数据盘对应一个OSD Daemon,而一个服务器可以有多块数据盘,所以一台服务器就会运行多个OSD Daemon , 该服务称之为OSD节点,一个Ceph集群中有n个OSD节点,综合算下来,OSD集群由一定数目的OSD Daemon组成。
- 3、MON(Montior)集群:由少量的,数目为奇数个的Monitor守护进程,负责ceph所有集群中所有OSD状态的发现与记录。理论上来讲,一个MON就可以完成,之所以需要一个或者多个守护进程组成的集群的原因是保证高可靠性。
- 4、要使用CephFS、还需要MDS集群,用于保存CephFS的元数据
- 5、要使用对象存储接口,还需要RADOS Gateway,它对外提供REST接口,兼容S3和Swift的API
Ceph的逻辑单位
-
pool(存储池):
在创建存储池时需要指定pg个数,来创建pg,创建pg的时候需要用到crush算法,crush决定了pg与osd daemon的对应关系,所以说,在客户端往Ceph中写入数据之前,pg与osd daemon的对应关系是确定的动态关系。
-
pg(归置组)
是分配数据的最小单位,一个pg内包含多个osd daemon
osd deamon负责的三件事
干垃圾活的
- 读写数据
- 数据的拷贝与恢复
- 监控自己以及pg组内的其他成员的状态,汇报给monitor节点
monitor节点
整个集群的大管家,主要负责以下三件事
-
监控全局状态
cluster map
- osd daemon map
- monitor map
- pg map
- crush map
-
负责管理集群内部状态(osd deamon挂掉,数据恢复等操作)
-
负责授权
客户端再访问时会先通过monitor验证操作权限
客户端需要跟monitor要到cluster map
ps:monitor节点的个数=2n+1
- 必须为奇数个
- 一个monitor也可以,但是不应该这么做,因为有单点故障,所以最少三个起。
1、为何monitor节点个数应该为奇数个
因为monitor节点同步数据用的是paxos算法(分布式强一致性算法)
paxos算法规定至少有三个节点
2、可以挂掉几个monitor节点
paxos算法下,monitor集群不能超过半数挂掉
3、monitor进程与osd daemon能否在同一个物理节点上
可以,但是不好,但是这就是一种集中式的思想了
如果考虑到成本,可以这么做
rados的网络结构
pool
在rados集群构建完毕后,使用ceph的时候需要用到很多的逻辑概念,pool就好比是一家公司的部门。
pool的四大属性
- 所有性和访问权限
- 对象副本数目,默认pool池中的一个pg只包含两个osd daemon,即一份数据交给pg后会存下两个副本,生产环境中推荐使用
- pg数目,pg是pool的存储单位,pool的存储空间就由pg组成
- CRUSH规则集合
ceph的pool有两种类型
-
Replicated pool(默认)
拷贝型 pool,通过生成对象的多份拷贝
存储池类型,把每个存入的对象(Object)存储为多个副本,其中分为主副本和从副本,从副本相当于备份副本,从而确保在部分 OSD 丢失的情况下数据不丢失。这种类型的 pool 要更多的裸存储空间,但是它支持所有的 pool 操作。
如果客户端在上传对象的时候不指定副本数,认为3个副本。在开始存数据之前会计算出该对象存储的主副本与从副本的位置,会将数据存入到主副本,然后主副本再将数据分别同步到从副本。主副本与从副本同步完毕后会通知主副本,这时候主副本再响应客户端,并表示数据上传成功。所以如果客户端收到存储成功的请求后,说明数据已经完成了所有副本的存储。
-
Erasure-coded pool
用的少,了解即可
pg
归置组
-
主 (primary) OSD:在 acting set 中的几个 OSD,负责接收客户端写入数据;默认情况下,提供数据读服务,但是该行为可以被修改。它还负责 peering 过程,以及在要的时候申请 PG temp。
-
次 (replica)OSD:在 acting set 中的了第一个以外的其余 OSD。
-
OSD:已经不是 acting set 中了,但是还没有被告知去删数据 的 OSD。PG 的 acting set 是由 CRUSH 算法根据 CRUSH Rules 动态地计算得出的。
osd daemon个数 < 5 128
5< osd daemon个数 < 10 512
10< osd daemon个数 < 50 4096
osd daemon个数 > 50 官网PG计算器
pg的状态
状态 | 意义 |
---|---|
creating | 创建中 |
peering | 对等互联,无法响应io |
active | 活动的 |
clean | 就绪态 |
down | down机 |
Degraded | 降级 |
Remapped | 重映射 |
Stale | 过期的 |
Undersized | 少于副本数 |
Scrubbing | 检查完整性 |
Recovering | 恢复中 |
Backfilling | 回填中 |