CRUSH Maps
ceph通过CRUSH算法计算数据存储位置来确定如何存储和检索数据。 CRUSH使Ceph客户端可以直接与OSD通信,而无需通过集中式服务器或代理进行通信。 通过算法确定的存储和检索数据的方法,Ceph避免了单点故障,性能瓶颈以及对其可扩展性的物理限制。
对于ceph集群的一次读写操作,客户端首先与mon通信获取一个集群的map副本。集群map帮助客户端获取ceph集群的状态和配置信息。使用对象和池名/ID将数据转换为对象,然后将对象和PG经过散列来生成其在ceph池中最终存放的哪一个PG,再通过存放的PG进行CRUSH查找来确定存储或获取数据所需的主OSD的位置。得到OSD ID后,客户端直接与OSD通信进行数据读写。所有的计算操作由客户端来完成,因此不会影响集群的性能。一旦数据被写入主OSD,主OSD所在的节点将执行CRUSH查找操作并计算副本PG和OSD的位置进行数据复制,进而实现高可用性。
CRUSH 层级结构
CRUSH维护了所有基础设施组件的一个嵌套层次结构。CRUSH设备列表通常包括主机、机架、行等。这些组件称为故障域或CRUSH bucket。CRUSH map包含一系列可以bucket,这些bucket表明了设备的具体物理位置。它还包含了一系列的规则告诉CRUSH如何为不同的ceph池复制数据。
CRUSH map 定义了一系列用于描述节点的类型:
osd (or device)
host
chassis
rack
row
pdu
pod
room
datacenter
zone
region
root
层次结构中的每个节点(设备或bucket)都有与之关联的权重,权重设置在叶子上,指示设备的大小,默认节点的权重将是它下面包含的所有设备的总和。 通常,权重以TB为单位。
可以通过ceph osd crush tree
查看层次结构
[root@ceph-admin ~]# ceph osd crush tree
INFO:cephadm:Inferring fsid 23db6d22-b1ce-11ea-b263-1e00940000dc
INFO:cephadm:Using recent ceph image ceph/ceph:v15
ID CLASS WEIGHT TYPE NAME
-1 0.29306 root default
-