分布式存储系统,就是通过网络将数据分散存储在多台独立的设备上
可扩展性
1)节点扩展后,旧数据会自动迁移到新节点上,实现负载均衡,避免单点过热的情况出现
2)水平扩展只需要将新节点和原有集群连接到同一网络,整个过程不会对集群业务造成影响
3)当节点添加到集群,集群系统的整体容量和性能也会随之线性扩展,此后新节点的资源就会被管理平台接管,被用于分配或者回收
低成本
高性能
易用
分布式存储系统需要能提供易用的对外接口,另外也需要完整的监控,运维工具,并能够与其他系统集成
易管理
分布式存储系统的挑战主要在于数据,状态信息的持久化,要求在自动迁移,自动容错,并发读写的过程中保证数据的一致性。
分布式存储系统涉及的技术主要在两个领域: 分布式系统以及数据库
简介:
Ceph是一个统一的分布式存储系统,涉及初衷是提供较好的性能,可靠性和可扩展性
优势:
高扩展性: 使用普通x86服务器,支持10~1000台服务器,支持TB到EB级别的扩展
高可靠性: 没有单点故障,多数据副本,自动管理,自动修复
高性能: 数据分布均衡
可用于对象存储,块设备存储和文件系统存储
基础存储系统
rados:基础存储系统RADOS(Reliable Autonomic,Distributed Object Store,即可靠的,自动化的,分布式的对象存储)。所有存储在
Ceph系统中的用户数据事实上最终都是由这一层来存储的。Ceph的高可靠,高扩展性,高性能,高自动化等等特性本质上都是由这一层完成的
基础库LIBEADOS
librados:这一层的功能是对RADOS进行抽象和封装,并向上层提供API,以便于基于基础DADOS(而不是整个Ceph)进行应用开发。特别注意的是是
RAOCS是一个对象存储,因此,librados实现的API也是针对对象存储功能的。
高层应用接口
radosgw:对象网关接口(对象存储)
rdb: 块存储
cephfs: 文件系统存储
其作用是在librados库的基础上提供抽象层次更高,更便于应用或客户端使用的上层接口。
如上图,Ceph主要有三个基本进程
OSD
用于集群中所有数据及对象的存储。处理数据的复制,恢复,回填,在均衡。并向其他osd守护进程发送心跳,然后想Mon发送一些信息。
当Ceph存储集群设定有两个副本时(一共存两份),则至少需要两个OSD守护集成即两个OSD节点,集群才能达到actice+clean状态
MDS(可选)
为Ceph文件系统提供元数据计算,缓存与同步(也就是说Ceph块设备和Ceph对象存储不需要MDS)。在Ceph中,元数据也是存储在osd节点中的。
mds类似于元数据的代理服务器。MDS进程并不是必须的,只有需要使用Cephfs时候,才需要配置MDS节点。
Monitor
监控整个集群的状态,维护集群的cluster MAP二进制表,保证集群数据的一致性。ClusterMAP描述了对象块存储的物理位置,以及一个将设备
聚合到物理位置的桶列表
Manager(ceph-mgr)
用于收集ceph集群状态,运行指标,比如存储利用率,当前性能指标,和系统负载。对外提供ceph dashboard(ceph ui)和restful api。
Manage开启高可用时,至少2个
ceph client: 访问ceph底层服务或组件,对外提供各种接口。对象存储接口,块存储接口,文件级存储接口
ceph node: ceph底层服务提供端,也就是ceph存储集群
无论使用哪种存储方式(对象,块,文件),存储的数据都会被切割成对象(object),Object Size大小可以有管理员进行调整,通常为2M或4M。每个对象存储都会有一个唯一的OID,由ino和ono生产,ino即是文件的File ID,用于在全局唯一标识的一个文件,而ono则是分片的编号。如一个文件FILE ID 为A,它被切割成两个对象,一个对象编号为0,一个对象编号为1,那么这两个文件的oid则为A0和A1。OID的好处则是可以唯一标识每个不通的对象,并且存储了对象与文件的关系。由于ceph的所有数据都虚拟成立整齐划一的对象,所以在读写时效率都会比较高。
但是对象并不会直接存储进OSD中,因为对象的size很小,在一个大规模的集群中可能有几百到几千万个对象。这么多对象光是遍历寻址,速度都是很缓慢的;并且如果将对象直接通过某种固定映射的哈希算法映射到osd上,当这个osd损坏时,对象无法自动迁移到其他osd上面(因为映射函数不允许),为了解决这些问题,ceph引入了归置组的概念,即PG
PG是一个逻辑概念,我们linux系统中可以直接看到对象,但是无法直接看到PG。他在数据寻址时类似于数据库中的索引;每个对象都会固定映射进一个PG中,所以当我们要寻找一个对象时,只需要先找到这个对象所属的PG,然后再遍历这个PG就可以了,无需遍历所有的对象。而且在数据迁移时,也是以PG作为基本单位进行迁移,ceph不会直接操作对象。
对象是如何映射到PG的? 还记得OID么? 首先使用静态hash函数对OID做hash取出特征码,用特征码与PG的数量取模,得到的序号则是PGID。由于这种设计方式,PG的数量多寡直接决定了数据分布的特性,所以合理设置PG数量可以很好的提升Ceph集群的性能并使数据均匀分布。
最后PG会根据管理员设置的副本数量进行复制,然后通过crush算法存储到不同的OSD节点上(其实就是把PG中的所有对象存储到节点上),第一个OSD接地那即为主节点,其余均为从节点。
ceph核心组件及概念介绍