Ceph的crush算法与一致性hash对比介绍

这篇具有很好参考价值的文章主要介绍了Ceph的crush算法与一致性hash对比介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文分享自天翼云开发者社区《Ceph的crush算法与一致性hash对比介绍》,作者:l****n

首先,我们先回顾下一致性hash以及其在经典存储系统中的应用。

一致性hash的基本原理

一致性hash的基本思想是,有一个hash函数,这个hash函数的值域形成了一个环(收尾相接:the largest hash value wraps around to the smallest hash value),然后存储的节点也通过这个hash函数随机的分配到这个环上,然后某个key具体存储到哪个节点上,是由这个key取hash函数对应到环的一个位置,然后沿着这个位置顺时针找到的第一个节点负责这个key的存储。这样环上的每个节点负责和它前面节点之间的这个区间的数据的存储。

Ceph的crush算法与一致性hash对比介绍

如上图所示,hash函数的总区间是[A, Z],有3个存储节点分别对应到F、M和S的位置上,那么hash值为A或者Z的key将会顺时针查找它遇到的第一个节点,因此会存储到节点1上,同理hash值为K的key存储到第二个节点上。咱们再观察下一致性hash在增删节点的时候,数据迁移的情况,在上图的场景中,如果删除节点2的话,节点1上面的不会发生变化,原来存储在节点2上的(F,M]区间会迁移存储到节点3上;在上图的场景中,如果在U位置增加一个节点的话,原来存储到节点1上的(S, F]区间会分割成两个区间其中(S, U]会存储到新的节点上,而(U, F]不发生变化还是存储到节点1上。从上面的例子中可以看到,一致性hash在增删节点的时候,只影响与其相邻的节点,并且需要迁移的数据最少。

上面这种朴素的一致性hash有两个问题,第一个问题是如果节点较少,节点在环上的分布可能不均匀,导致每个节点的负载不均衡,比如上图中场景,如果节点3故障被剔除的话,节点1和节点2的负载会非常的不均衡;第二个问题是不支持异构的机型,比如如果有的存储节点是4TB的,有的存储节点是8TB的,每个节点对应环上的一个位置,无法感知到节点的权重。为了解决这两个问题,一般都是把每个节点对应到环上的多个位置,称为vnode,vnode足够多的话,可以认为是均衡打散的,如果有节点故障下线的话,这个节点在环上对应的vnode存储的数据就可以均匀分给其他的vnode,最终存储到对应的node上,因此在增删节点的时候,负载都是在所有的节点中均匀分摊。另外针对异构的机型,比如说4TB和8TB的节点,8TB的节点的vnode是4TB节点的2倍就可以了。

如果vnode节点和环上的点一一对应的话,可以认为是一致性hash的一个特殊的场景,比如说上图中的例子,这个hash环一个有A到Z 25个点(A、Z重合了),如果有25个vnode和其对应的话,这样一致性hash只需要记录每个物理node节点到vnode的映射关系就可以了,会非常的简单。开源swift对象存储使用的是这种一致性hash,参考:https://docs.openstack.org/swift/latest/ring_background.html

在分布式系统中为了保障可靠性一般都是多副本存储的,在dynamo存储系统中,用一致性hash算法查找到第一个vnode节点后,会顺序的向下找更多vnode节点,用来存储多副本(中间会跳过同台机器上的vnode,以达到隔离故障域的要求),并且第一个vnode是协调节点。在开源swift对象存储系统中,节点会先分组,比如3个一组,形成一个副本对,然后vnode会分配到某组机器上,一组机器上会有很多的vnode,并且这组机器上的vnode的leader节点在3台机器上会打散,分摊压力。

crush算法的核心思想

crush算法是一个伪随机的路由选择算法,输入pg的id,osdmap等元信息,通过crush根据这个pool配置的crush rule规则的伪随机计算,最终输出存储这个pd的副本的osd列表。由于是伪随机的,只要osdmap、crush rule规则相同,在任意的机器上,针对某个pg id,计算的最终的osd列表都是相同的。

crush算法支持在crush rule上配置故障域,crush会根据故障域的配置,沿着osdmap,搜索出符合条件的osd,然后由这些osd抽签来决定由哪个osd来存储这个pg,crush算法内部核心是这个称为straw2的osd的抽签算法。straw2的名字来源于draw straw(抽签:https://en.wikipedia.org/wiki/Drawing_straws)这个短语,针对每个pg,符合故障域配置条件的osd来抽检决定谁来存储这个pg,osd抽签也是一个伪随机的过程,谁抽到的签最长,谁赢。并且每个osd的签的长度,都是osd独立伪随机计算的,不依赖于其他osd,这样当增删osd节点时,需要迁移的数据最少。

Ceph的crush算法与一致性hash对比介绍 

如上图的一个示例,这是针对某个pg的一次抽签结果,从图中可以看到osd.1的签最长,所以osd.1赢了,最终osd.1会存储这个pg,在这个时候,如果osd.4由于故障下线,osd.4的故障下线并不会影响其他osd的抽签过程,针对这个pg,最终的结果还是osd.1赢,因此这个pg不会发生数据的迁移;当然,在上图从场景中,如果osd.1下线的话,osd.1上的pg会迁移到其他的osd上。增加osd节点的情况类似,比如在上图的场景中,如果新增加一个osd.5节点的话,每个osd都是独立抽签,只有osd.5赢的那些pg才会迁移到osd.5上,对其他的pg不会产生影响。因此,理论上,crush算法也和一致性hash一样,在增加删除osd节点的时候,需要迁移的数据最少。

另外straw2抽签算法也是支持异构的机型的,比如有的osd是4TB,有的osd是8TB,straw2的抽签算法会保证,8TB的osd抽签赢的概率是4TB的osd的两倍。背后的原理是,每个osd有个crush weight,crush weight正比于osd的磁盘大小,比如8TB的osd的crush weight是8左右,4TB的osd的crush weight是4左右。然后每个osd抽签的过程是,以osd的crush weight为指数分布的λ,产生一个指数分布的随机数,最后再比大小。

另外在ceph中,每个osd除了crush weight,还有个osd weight,osd weight的范围是0到1,表示的含义是这个osd故障的概率,crush算法在伪随机选择pg放置的osd的时候,如果遇到故障的osd,会进行重试。比如说某个osd weight是0的话,说明这个osd彻底故障了,通过上面straw2步骤计算出来的pg会retry重新分配到其他的osd上,如果某个osd的osd weight是0.8的话,这个osd上20%的pg会被重新放置到其他的osd上。通过把osd weight置为0,可以把某个osd节点从集群中临时剔除,通过调整osd weight也可以微调osd上的pg的分布。

总结

ceph分布式存储系统数据分布的基石crush算法,是一个伪随机的路由分布算法,对比一致性hash,它的核心的优点是元数据少,集群增删osd节点时,要迁移的数据少,并且crush算法支持异构的机型,支持各种级别的故障域的配置,它的缺点是在实际应用中发现,由于pg会占用一定的资源,一般每个osd最多200个pg左右,导致整个集群中pg数并不会特别的多,pg在osd上分布并不是非常的均衡,经常需要微调。

参考:

https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf

https://github.com/ceph/ceph/pull/20196

https://docs.openstack.org/swif文章来源地址https://www.toymoban.com/news/detail-856533.html

到了这里,关于Ceph的crush算法与一致性hash对比介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一致性hash负载均衡

    今天看下一致性hash,常见的负载均衡可能使用过hash,比如nginx中,如果使用session最简单就是通过hash,比如根据用户的请求ip进行hash,让不同用户的请求打到同一台服务器,这样状态处理起来最简单,对于session来说,如果现在重新上线了一台服务器,导致了所有请求hash之后

    2024年02月08日
    浏览(41)
  • Redis 原理缓存过期、一致性hash、雪崩、穿透、并发、布隆、缓存更新策略、缓存数据库一致性

    redis的过期策略可以通过配置文件进行配置 redis会把设置了过期时间的key放在单独的字典中,定时遍历来删除到期的key。 1).每100ms从过期字典中 随机挑选20个,把其中过期的key删除; 2).如果过期的key占比超过1/4,重复步骤1 为了保证不会循环过度,导致卡顿,扫描时间上限

    2024年02月08日
    浏览(58)
  • Sharding JDBC 分库分表(一致性Hash + 虚拟节点)

    一、背景 传统的将数据集中存储至单一数据节点的解决方案,在性能、可用性和运维成本这三方面已经难于满足互联网的海量数据场景。 从 性能 方面来说,由于关系型数据库大多采用B+树类型的索引,在数据量超过阈值的情况下,索引深度的增加也将使得磁盘访问的IO次数

    2024年02月10日
    浏览(47)
  • 【征服redis14】认真理解一致性Hash与Redis的三种集群

    前面我们介绍了主从复制的方式和sentinel方式,这里我们看第三种模式-Cluster方式。 目录 1.前两种集群模式的特征与不足 2.Cluster模式 2.1 Cluster模式原理  2.2 数据分片与槽位 2.3 Cluster模式配置和实现 3.一致性Hash 3.1 哈希后取模 3.2 一致性Hash算法 4 Redis Cluster集群 主从复制是Red

    2024年01月22日
    浏览(52)
  • 使用MATLAB对比两张图片的一致性

    可以使用 MATLAB 的图像处理工具箱进行两张图片的比较。具体地,可以使用函数 corr2 计算两张图像的相关系数,从而评估它们的一致性。如果相关系数较高,说明图像的相似度较高;如果相关系数较低,说明图像的差异较大。 可以这样实现: 在上述代码中, img1 和 img2 分别

    2024年02月12日
    浏览(35)
  • 【色彩一致性损失:场景亮度解纠缠网络:纹理-对比度增强网络:IVIF】

    (DIVFusion:无暗区红外与可见光图像融合) 红外与可见光图像融合是一种重要的图像增强技术,其目的是在极端环境下生成目标显著、纹理丰富的高质量融合图像。然而,现有的图像融合方法都是针对正常光照条件下的红外和可见光图像而设计的。在夜景场景中,由于可见光

    2024年02月08日
    浏览(47)
  • 谈谈一致性哈希算法

    一致性哈希算法是1997年由麻省理工的几位学者提出的用于解决分布式缓存中的热点问题。大家有没有发现,我们之前介绍的例如快排之类的算法是更早的六七十年代,此时分布式还没有发展起来, 大家往往还在提高单机性能。但是九十年代开始,逐渐需要用分布式集群来解

    2024年02月07日
    浏览(56)
  • 【负载均衡——一致性哈希算法】

    一致性哈希算法就很好地解决了分布式系统在扩容或者缩容时,发生过多的数据迁移的问题。 一致哈希算法也用了取模运算,但与哈希算法不同的是,哈希算法是对节点的数量进行取模运算,而一致 哈希算法 是对 2^32 进行取模运算,是一个固定的值。 一致性哈希要进行两步

    2024年04月10日
    浏览(55)
  • 主题模型LDA教程:一致性得分coherence score方法对比(umass、c_v、uci)

    主题建模 主题建模是一种机器学习和自然语言处理技术,用于确定文档中存在的主题。它能够确定单词或短语属于某个主题的概率,并根据它们的相似度或接近度对文档进行聚类。它通过分析文档中单词和短语的频率来实现这一目的。 主题建模的一些应用还包括文本摘要、

    2024年02月04日
    浏览(369)
  • 区块链:哈希算法与一致性哈希算法

    本篇主要介绍区块链中常用到的哈希算法。 1 哈希算法 1.1 定义及特性   哈希算法是指通过哈希函数(Hash Function)对任意长度的输入数据(比如文件、消息、数字等)进行转换,生成一个固定长度的哈希值(Hash Value)的过程。   在区块链中,哈希算法常用于区块验证及安全性保

    2024年02月17日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包