「CEPH」- CRUSH Map

概述介绍

CRUSH Map 包含 OSD 列表,用于将设备聚合到物理位置的桶列表中,并告诉 CRUSH 如何在存储池中复制数据的规则列表。通过映射底层物理基础架构信息,CRUSH 可以规避相关硬件设备故障带来的风险。典型的故障来源包括物理上临近的资源,如共享的电源和共享的网络等。此信息可以编码到 Cluster Map;

CRUSH Algorithm 利用这些信息可以指定放置策略,可以在不同故障域之间分离对象副本,同时保证所需的数据均匀分布。这样,即便某个服务器或者某个机架故障也不会影响整个集群的正常使用,还能保证数据的安全。例如,为了解决并发故障,我们可能需要确保数据副本位于使用不同机架、电源组、控制器和 / 或物理位置的设备上;

部署大型数据集群时,我们应充分考虑自定义的 CRUSH Map,因为它将帮助你管理 Ceph 集群,提高性能并确保数据安全。例如,如果 OSD 出现故障,且你需要更换硬件时,CRUSH Map 可以帮助查找 OSD 发生故障的主机的物理数据中心、房间和机架等资源,快速定位坏盘所在位置。同样,CRUSH 可以帮助你更快地识别故障。例如,如果特定机架中的所有 OSD 同时下线,故障可能出在网络交换机 / 机架 / 网络交换机的电源上,而不是 OSD 本身。当与故障主机关联的放置组处于 degraded 状态时,CRUSH Map 还可以帮助识别 Ceph 存储数据的冗余副本的物理位置;

查看 CRUSH Map 的内容结构

它保存的信息包括:集群设备列表、bucket 列表、故障域(failure domain)分层结构、保存数据时用到的为故障域定义的规则(rules)等;

# ceph osd crush dump

其包含很多内容,主要为如下四部分:Device、Bucket Type、Bucket、Rule;

Device(设备)

ceph-osd 守护进程相对应的任何对象存储设备;

通常,Ceph 集群使用多种类型的存储设备,包括 HDD、SSD、NVMe 及其混合。我们将这些不同类型的存储设备称为 Device Class,以避免与 CRUSH Bucket 的 type 属性混淆(例如主机、机架)。由 SSD 支持的 OSD 比由传统机械磁盘支持的 OSD 运行快得多,因此其更适合大的工作负载。Ceph 可以为不同类型的数据集或工作负载创建池,并分配不同的 CRUSH 规则来控制这些池中数据的放置。因此,Device 是区分物理设备属性的,为将来存储具备特定属性的数据提供描述依据;

集群的所有设备列表,其位于 CRUSH Map 的开头部分:

# devices
device 0 osd.0 class ssd
device 1 osd.1 class ssd
device 2 osd.2 class ssd
device 3 osd.3 class ssd
...

要将 PG 映射到 OSD,CRUSH 需要 OSD 设备列表;

Bucket

Ceph 集群中有很多硬件设备,从上到下可能涉及某些逻辑单元,类似数据中心→设备所在机房→机架→行→服务器→OSD 盘等的关系,Bucket 专门用于描述以上提到的这些逻辑单元属性,以便将来对这些属性按树状结构进行组织;

Bucket:包括存储位置(例如机架、主机等)的关系和权重;

Bucket 类型:type 0 osd,硬盘;type 1 host,主机;type 2 chassis,机框;type 3 rack,机架;type 4 row,系列机架中的行;type 5 pdu,电源分布单元;type 6 pod,一组 PDU 或 一组 Row;type 7 room,机房;type 8 datacenter,数据中心;type 9 zone,区域;type 10 region,地区;type 11 root,根;

host laptop-asus-k53sd {
	id -7		# do not change unnecessarily
	id -8 class ssd		# do not change unnecessarily
	# weight 1.819
	alg straw2
	hash 0	# rjenkins1
	item osd.3 weight 1.819
}
host pc-amd64-100249 {
    ...
}
host pc-amd64-100254 {
    ...
}
root default {
	id -1		# do not change unnecessarily
	id -4 class ssd		# do not change unnecessarily
	# weight 2.529
	alg straw2
	hash 0	# rjenkins1
	item pc-amd64-100254 weight 0.300
	item pc-amd64-100249 weight 0.409
	item laptop-asus-k53sd weight 1.819
}
...

Ruleset

选择 Bucket 的规则集;

CRUSH Map包含CRUSH Rule的概念。CRUSH Rule是确定池中数据放置的规则。对于大型集群,你可能会创建许多池,其中每个池都有自己的CRUSHRuleset(规则集)和Rule(规则)。默认的CRUSHMap有默认的Root规则,如果需要更多的规则,需要后续创建,或者在创建新池时指定规则让Ceph自动创建。这些规则集主要是让你知道数据存放在哪里。它包含副本方式或纠删码方式的使用规则,以及Bucket的层级组织形式等。

...
rule replicated_rule {
	id 0
	type replicated
	min_size 1
	max_size 10
	step take default
	step chooseleaf firstn 0 type host
	step emit
}
...

各部分间的关系

Device、Bucket Type、Bucket,这三者用以描述存储设备的结构。其为树形结构,使用节点与叶子两种层次;
Rule,通过引用 Device、Bucket Type、Bucket 来控制存储池内数据的存放方式:复制、放置、属性;