1 对象
一个对象包含绑定在一起的数据和元数据,并有唯一标识的表示符(ID)。另外对象的大小是可以随着大小可变的元数据而变得更大的。元数据是数据的数据。在一个对象中,数据存储为丰富的元数据,它们存储上下文和数据的实际内容等信息。
一个对象的元数据并不受限于类型或者数量,可以在元数据中添加自定义的类型。对象不是不使用层次结构或者树状结构,而是使用没有任何复杂度的线性地址空间中。对象可以存储在本地,也可以是地理上分开的线性地址空间。这种机制可以帮助对象唯一的标识自己。对象以复制的方式存储在基于对象存储的设备中(OSD)。
Ceph中的所有数据单元都是以对象的形式存储在一个池中。Ceph的池是一个用来存储对象的逻辑分区。
2 CRUSH
元数据是数据的数据,存储的信息是数据存储在存储节点和磁盘阵列的位置信息。添加数据时,元数据最新更新,然后才是实际的数据存储。如果失去元数据,将会失去所有的数据。因此为了防止元数据丢失,所做出的处理,如在单节点上保持多个副本或者复制整个数据和元数据来保证容错度,将会造成伸缩、可用性、性能上的瓶颈。
Ceph使用可扩展散列下的受控复制(Controlled Replication Under Scalable Hashing,CRUSH)算法,它是Ceph的智能数据分发机制。与传统的依赖于存储和管理一个核心元数据/索引不同的是,Ceph使用CRUSH算法来准确计算数据写入或者读取的位置。CRUSH按需计算元数据,而不是存储元数据。
2.1 CRUSH 查找
CRUSH 机制的运行方式:元数据计算的负载是分布式的、按需的。元数据计算的过程也叫 CRUSH查找,CRUSH不依赖于系统。Ceph给客户端提供了足够的灵活性来按需执行元数据计算,客户端可以使用自己的系统资源来执行CRUSH查找,从而取消中心查找。
对于一次读写操作,客户端先从monitor获取集群的map。从map中获取集群的状态和信息配置,使用对象和池名/ID 将数据转化为对象。然后将对象和PG(placement groups,归置组)数经过散列来生成应当存放的PG。针对这个PG ID经过CRUSH查找来确定存储或者获取数据所需的OSD的位置。得到OSD ID之后,客户端直接联系OSD存取数据。计算都有客户端来执行,不会影响集群的性能,数据写入OSD后,主OSD所在节点将执行CRUSH查找操作来计算辅助归置组和OSD的位置来实现数据复制。
2.2 CRUSH 层级结构
CRUSH 了解所有的基础设施并支持自定义配置,它维护一个所有基础设施组件的一个嵌套层次结构。CRUSH层次列表通常包含数据中心、房间、组、机架等,这些组件称为故障域或者CRUSH bucket。CRUSH包含可用的bucket,这些bucket表明了设备的具体物理位置。还包含一些规则,告诉CRUSH如何为不同的Ceph池复制数据。
根据基础设施,CRUSH扩故障域来传播数据及其副本,解决了单点故障问题,同事保证高可用性。CRUSH均匀地在整个集群磁盘上写数据,确保所有磁盘都同等的利用,而不考虑他们的能力。CRUSH为每个OSD分配权重,OSD权重越高,表示物理存储容量越大,CRUSH会写入更多的数据到这个OSD上。
2.3 恢复和再平衡
故障域内任何组件发生故障以后,默认下Ceph会等待300s ,而后Ceph将该OSD标记为down和out并初始化恢复操作。CRUSH会复制数据到多个磁盘,这些复制的数据在恢复的时候使用。
CRUSH会复制数据到多个磁盘,这些复制的数据在恢复的时候使用。恢复期间CRUSH试图移动尽量少的数据来构建一个新的集群布局。
当一个新的主机或者磁盘添加到Ceph集群中时,CRUSH开始执行再平衡,从现有的主机/磁盘 移动数据到新的主机磁盘。再平衡保证所有磁盘能够均匀的使用,在再平衡期间要注意集群的性能,不能因为再平衡而下降。可以在新加入的OSD设置权重为0,然后依次提升到容量对应水平的权重。
2.4 编辑 CRUSH map
使用ceph-deploy 部署Ceph后,它会为配置文件生成一个默认的CRUSH map。Ceph提供定制CRUSH map的功能。
1) 提取现有的CRUSH map