Ceph 学习——CRUSH算法及源码分析(一)

本文深入探讨Ceph的CRUSH算法,阐述其基本原理、数据结构,包括Hierarchical Cluster Map、Bucket类型和Placement Rules,旨在理解如何在集群中均衡地分布和定位数据对象。
摘要由CSDN通过智能技术生成

CRUSH 算法解决了PG副本如何分布在集群OSD上的问题,本文先介绍CRUSH算法基本原理和相关的数据结构,主要是CRUSH map 中的内容 如 bucket 、placement rule等,以及他们的源码初探,在下一节中将介绍CRUSH的算法实现。
ps: 代码目前都没加注释,也没有删除冗余的东西哎。。。。整理文章是真的累,难怪大家都喜欢说转载请注明出处 :XD 限于篇幅有些重要的函数没有列出来,在下一章中再说好了—-小白学习Ceph之路

数据分布算法

存储系统的数据分布算法要解决数据如何分布到各个节点的问题,随着大规模分布式存储系统(PB级的数据和成百上千台存储设备)的出现,数据分布算法面临了几个挑战:

  • 数据分布和负载的均衡。数据分布的均衡是指算法要能够将数据均匀的存储到各个节点和磁盘上。负载均衡指的是数据的访问的等操作的负载在各个节点之间负载均衡。
  • 扩展性和高可用性。系统方便的增加或者删除存储设备。当增删设备之后,数据恢复和数据迁移,将会使得数据重新均衡,算法需要是这样的移动、迁移的数据量尽可能的少。
  • 支持大规模集群。为了支持大规模的存储集群,要求数据分布算法维护的元数据要相对较小,且计算量不能太大。

传统的存储使用数据中心式的元数据/索引表来保存有关客户端的数据如何存放的问题。而Ceph使用CRUSH按需计算出元数据,因此它消除了对中心式的服务器/网关的需求(去中心化)。

Ceph设计了CRUSH(一个可扩展的伪随机数据分布算法),用在分布式对象存储系统上,可以有效映射数据对象到存储设备上(不需要中心设备)。因为大型系统的结构式动态变化的,CRUSH能够处理存储设备的添加和移除,并最小化由于存储设备的的添加和移动而导致的数据迁移。

CRUSH有两个关键优点:

  • 任何组件都可以独立计算出每个object所在的位置(去中心化)。
  • 只需要很少的元数据(cluster map),只要当删除添加设备时,这些元数据才需要改变。

CRUSH 算法的基本原理

CRUSH算法全称为可控的、可扩展的、分布式的副本数据放置算法,它在Sage A. Weil的论文
CRUSH: Controlled, Scalable, Decentralized Placement of Replicated Data
提出,相关详细的介绍也可以查阅作者发布相关的论文。

CRUSH算法解决的是PG如何映射到OSD列表中的问题,也就是 给定一个输入x,CRUSH 算法将输出一个确定的有序的储存目标向量 ⃗R 。其中x为要计算的PG的pg _id,存储向量列表就是OSD列表,即选择的OSD,这些OSD通常都会在不同的故障域。

CRUSH(x)-> (OSD1,OSD2,...,OSDn)

当输入x,CRUSH利用强大的多重整数hash函数根据Hierachical Cluster Map(集群的拓扑结构)、Placement Rules(定位规则、选择策略)、以及x计算出独立的完全确定可靠的映射关系。下面就介绍下层级的Cluster Map 和 Placement Rules。

Hierachical Cluster Map

层级化的Cluster Map 定义了OSD集群剧透层级的静态拓扑结结构。OSD的层级让CRUSH算法在选择OSD时实现了机架感知的能力,通过规则定义,使得副本分布在不同机架、不同机房中,提高的安全性。CRUSH Map文件里面到底有什么呢?主要包含四个部分。

struct crush_map {
        /*! An array of crush_bucket pointers of size __max_buckets__.
         * An element of the array may be NULL if the bucket was removed with
         * crush_remove_bucket(). The buckets must be added with crush_add_bucket().
         * The bucket found at __buckets[i]__ must have a crush_bucket.id == -1-i.
         */
    struct crush_bucket **buckets;
        /*! An array of crush_rule pointers of size __max_rules__.
         * An element of the array may be NULL if the rule was removed (there is
         * no API to do so but there may be one in the future). The rules must be added
         * with crush_add_rule().
         */
    struct crush_rule **rules;
        __s32 max_buckets; /*!< the size of __buckets__ */
    __u32 max_rules; /*!< the size of __rules__ */
        /*! The value of the highest item stored in the crush_map + 1
         */
    __s32 max_devices;

    /*! Backward compatibility tunable. It implements a bad solution
         * and must always be set to 0 except for backward compatibility
         * purposes
         */
    __u32 choose_local_tries;
    /*! Backward compatibility tunable. It implements a bad solution
         * and must always be set to 0 except for backward compatibility
         * purposes
         */
    __u32 choose_local_fallback_tries;
    /*! Tunable. The default value when the CHOOSE_TRIES or
         * CHOOSELEAF_TRIES steps are omitted in a rule. See the
         * documentation for crush_rule_set_step() for more
         * information
         */
    __u32 choose_total_tries;
    /*! Backward compatibility tunable. It should always be set
         *  to 1 except for backward compatibility. Implemented in 2012
         *  it was generalized late 2013 and is mostly unused except
         *  in one border case, reason why it must be set to 1.
         *
         *  Attempt chooseleaf inner descent once for firstn mode; on
         *  reject retry outer descent.  Note that this does *not*
         *  apply to a collision: in that case we will retry as we
         *  used to.
         */
    __u32 chooseleaf_descend_once;
    /*! Backward compatibility tunable. It is a fix for bad
         *  mappings implemented 
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值