3.5 CRUSH算法
CRUSH算法是Ceph的设计精髓,主要通过计算来确定数据的存储位置,不需要像以往要查询元数据服务器才能知道数据的位置。这也是Ceph不需要元数据服务器的原因。CRUSH是受控复制的分布式hash算法,是一种伪随机算法。CRUSH算法可以避免单点故障、性能瓶颈以及对Ceph可扩展性的物理限制。
CRUSH依赖集群的映射图,使用CRUSH Map伪随机地存储和检索OSD中的数据,并使数据在整个集群中均匀分布。CRUSH Map包含OSD列表,用于将设备聚合到物理位置的桶列表中,并告诉CRUSH如何在存储池中复制数据的规则列表。通过映射底层物理基础架构信息,CRUSH可以规避相关硬件设备故障带来的风险。典型的故障来源包括物理上临近的资源,如共享的电源和共享的网络等。此信息可以编码到Cluster Map。CRUSH利用这些信息可以指定放置策略,可以在不同故障域之间分离对象副本,同时保证所需的数据均匀分布。这样,即便某个服务器或者某个机架故障也不会影响整个集群的正常使用,还能保证数据的安全。例如,为了解决并发故障,我们可能需要确保数据副本位于使用不同机架、电源组、控制器和/或物理位置的设备上。
部署大型数据集群时,我们应充分考虑自定义的CRUSH Map,因为它将帮助你管理Ceph集群,提高性能并确保数据安全。例如,如果OSD出现故障,且你需要更换硬件时,CRUSH Map可以帮助查找OSD发生故障的主机的物理数据中心、房间和机架等资源,快速定位坏盘所在位置。同样,CRUSH可以帮助你更快地识别故障。例如,如果特定机架中的所有OSD同时下线,故障可能出在网络交换机/机架/网络交换机的电源上,而不是OSD本身。当与故障主机关联的放置组处于degraded状态时,CRUSH Map还可以帮助识别Ceph存储数据的冗余副本的物理位置。
CRUSH Map分为三个主要部分。
·Device:ceph-osd守护进程相对应的任何对象存储设备。
·Bucket:包括存储位置(例如机架、主机等)的关系和权重。
·Ruleset:选择Bucket的规则集。
1.Device
通常,Ceph集群使用多种类型的存储设备,包括HDD、SSD、NVMe及其混合。我们将这些不同类型的存储设备称为Device Class,以避免与CRUSH Bucket的type属性混淆(例如主机、机架)。由SSD支持的OSD比由传统机械磁盘支持的OSD运行快得多,因此其更适合大的工作负载。Ceph可以为不同类型的数据集或工作负载创建池,并分配不同的CRUSH规则来控制这些池中数据的放置。因此,Device是区分物理设备属性的,为将来存储具备特定属性的数据提供描述依据。
2.Bucket
简单来说,Ceph集群中有很多硬件设备,从上到下可能涉及某些逻辑单元,类似数据中心→设备所在机房→机架→行→服务器→OSD盘等的关系。那么,如何描述这些逻辑单元的关系、组织好这些关系、定义相应的故障域,以提高集群的数据安全性、可用性以及定位故障的速度等?Bucket专门用于描述以上提到的这些逻辑单元属性,以便将来对这些属性按树状结构进行组织。我们可以通过Ceph命令查看其组织结构。Bucket类型如表3-2所示。
表3-2 Bucket类型
我们可通过图3-3更加清晰地了解Bucket的作用,完成物理设备资源的相关故障域的管控。
图3-3 Bucket的成员组织关系
3.Ruleset
CRUSH Map包含CRUSH Rule的概念。CRUSH Rule是确定池中数据放置的规则。对于大型集群,你可能会创建许多池,其中每个池都有自己的CRUSH Ruleset(规则集)和Rule(规则)。默认的CRUSH Map有默认的Root规则,如果需要更多的规则,需要后续创建,或者在创建新池时指定规则让Ceph自动创建。这些规则集主要是让你知道数据存放在哪里。它包含副本方式或纠删码方式的使用规则,以及Bucket的层级组织形式等。