深入Ceph原理包含核心算法Crush说明和通信机制原理(五)(上)

简介: 深入Ceph原理包含核心算法Crush说明和通信机制原理(五)(上)

深入Ceph原理


一、Crush算法与作用



CRUSH 算法,全称 Controlled Replication Under Scalable Hashing (可扩展哈希下的受控复制),它是一个可控的、可扩展的、分布式的副本数据放置算法, 通过CRUSH 算法来计算数据存储位置来确定如何存储和检索数据。


  • 保障数据分布的均衡性
  • 集群的灵活伸缩性
  • 支持更大规模的集群


二、Crush算法说明



PG 到 OSD 的映射的过程算法称为 CRUSH 算法,它是一个伪随机的过程,可以从所有的 OSD 中,随机性选择一个OSD 集合。


Crush Map 将系统的所有硬件资源描述成一个树状结构,然后再基于这个结构按照一定的容错规则生成一个逻辑上的树形结构,树的末级叶子节点device 也就是 OSD ,其他节点称为 bucket 节点,根据物理结构抽象的虚拟节点,包含数据中心抽象、机房抽象、机架抽象、主机抽象。



1b878792ede148b5a416b5a6202eb90c.png


三、Crush算法原理



1、Ceph的存储结构


Ceph 为了保存对象,会先构建一个池( pool ),把 pool 可以比喻成一个仓库,一个新对象的保存就类似于把一个包裹放到仓库里面。


2、PG的分配存储


对象是如何保存至哪个 PG 上?假设 Pool 名称为 rbd ,共有 256 个 PG ,每个 PG 编个号分别叫做 0x0, 0x1, 0x2 ,... 0xFF 。 具体该如何分配?这里可以采用 Hash 方式计算。假设有两个对象名, 分别为bar 和 foo 的,根据对象名做 Hash 计算:


HASH ( ‘bar’ ) = 0x3E0A4162
HASH ( ‘foo’ ) = 0x7FE391A0


通过 Hash 得到一串随机的十六进制的值, 对于同样的对象名,计算出的结果能够永远保持一致,但我们预分配的是256 个 PG ,这就需要再进行取模处理, 所得的结果会落在【 0x0 , 0xFF 】区间:


0x3E0A4162 % 0xFF ===> 0x62
0x7FE391A0 % 0xFF ===> 0xA0


实际在Ceph中, 存在很多个Pool,每个Pool里面存在若干个PG,如果两个Pool里面的PG编号相同,该如何标识区分?Ceph会对每个pool再进行编号,一个PG的实际编号是由pool_id + . + pg_id组成。


3、OSD的分配存储


Ceph 的物理层,对应的是服务器上的磁盘, Ceph 将一个磁盘或分区作为 OSD ,在逻辑层面,对象是保存至PG 内,现在需要打通 PG 与 OSD 之间的联系, Ceph 当中会存在较多的 PG 数量,如何将 PG平均分布各个OSD 上面,这就是 Crush 算法主要做的事情: 计算 PG -> OSD 的映射关系。

上述所知, 主要两个计算步骤:


POOL_ID (对象池) + HASH (‘对象名称 ’ ) % pg _ num (归置组)==> PG _ ID (完整的归置组编号)
CRUSH ( PG _ ID )==> OSD (对象存储设备位置)


4、为什么需要采用Crush算法


如果把 CRUSH ( PG _ ID )改成 HASH ( PG_ID ) % OSD_NUM 能否适用? 是会存在一些问题。


1 )如果挂掉一个 OSD ,所有的 OSD_NUM 余数就会发生变化,之前的数据就可能需要重新打乱整理, 一个优秀的存储架构应当在出现故障时, 能够将数据迁移成本降到最低,


CRUSH 则可以做到。


2 )如果增加一个 OSD, OSD_NUM 数量增大, 同样会导致数据重新打乱整理,但是通过CRUSH可以保障数据向新增机器均匀的扩散, 且不需要重新打乱整理。


3 )如果保存多个副本,就需要能够获取多个 OSD 结果的输出, 但是 HASH 方式只能获取一个, 但是通过CEPH 的 CRUSH 算法可以做到获取多个结果。


5、Crush算法如何实现


每个 OSD 有不同的容量,比如是 4T 还是 800G 的容量,可以根据每个 OSD 的容量定义它的权重,以 T为单位, 比如4T 权重设为 4 , 800G 则设为 0.8 。

那么如何将 PG 映射到不同权重的 OSD 上面?这里可以直接采用 CRUSH 里面的 Straw 抽签算法,这里面的抽签是指挑取一个最长的签,而这个签值就是OSD 的权重。


image.png


主要步骤:


  • 计算HASH: CRUSH_HASH( PG_ID, OSD_ID, r ) ==> draw把r当做一个常数,将PG_ID, OSD_ID一起作为输入,得到一个HASH值。
  • 增加OSD权重: ( draw &0xffff ) * osd_weight ==> osd_straw 将计算出的HASH值与OSD的权重放置一起,这样就能够得到每个OSD的签长, 权重越大的,数值越大。
  • 遍历选取最高的权重:high_draw


Crush 目的是随机跳出一个 OSD ,并且要满足权重越大的 OSD ,挑中的概率越大。如果样本容量足够大, 随机数对选中的结果影响逐渐变小, 起决定性的是OSD 的权重, OSD 的权重越大, 被挑选的概率也就越大。


Crush 所计算出的随机数,是通过 HASH 得出来,可以保障相同的输入会得出同样的输出结果。 所以Crush 并不是真正的随机算法, 而是一个伪随机算法。


这里只是计算得出了一个 OSD ,在 Ceph 集群中是会存在多个副本,如何解决一个 PG 映射到多个OSD的问题?


将之前的常量 r 加 1 , 再去计算一遍,如果和之前的 OSD 编号不一样, 那么就选取它;如果一样的话,那么再把r+2 ,再重新计算,直到选出三个不一样的 OSD 编号。


image.png


假设常数 r=0 ,根据算法 (CRUSH_HASH & 0xFFFF) * weight 计算最大的一个 OSD ,结果为 osd.1 的0x39A00,也就是选出的第一个 OSD ,然后再让 r=1 , 生成新的 CRUSH_HASH 随机值,取得第二个OSD,依次得到第三个 OSD 。


目录
打赏
0
0
0
0
19
分享
相关文章
zk基础—1.一致性原理和算法
本文详细介绍了分布式系统的特点、理论及一致性算法。首先分析了分布式系统的五大特点:分布性、对等性、并发性、缺乏全局时钟和故障随时发生。接着探讨了分布式系统理论,包括CAP理论(一致性、可用性、分区容错性)和BASE理论(基本可用、软状态、最终一致性)。文中还深入讲解了两阶段提交(2PC)与三阶段提交(3PC)协议,以及Paxos算法的推导过程和核心思想,强调了其在ZooKeeper中的应用。最后简述了ZAB算法,指出其通过改编的两阶段提交协议确保节点间数据一致性,并在Leader故障时快速恢复服务。这些内容为理解分布式系统的设计与实现提供了全面的基础。
分布式锁—1.原理算法和使用建议
本文主要探讨了Redis分布式锁的八大问题,包括非原子操作、忘记释放锁、释放其他线程的锁、加锁失败处理、锁重入问题、锁竞争问题、锁超时失效及主从复制问题,并提供了相应的优化措施。接着分析了Redis的RedLock算法,讨论其优缺点以及分布式专家Martin对其的质疑。此外,文章对比了基于Redis和Zookeeper(zk)的分布式锁实现原理,包括获取与释放锁的具体流程。最后总结了两种分布式锁的适用场景及使用建议,指出Redis分布式锁虽有性能优势但模型不够健壮,而zk分布式锁更稳定但部署成本较高。实际应用中需根据业务需求权衡选择。
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
73 0
短视频到底如何推荐的?深度剖析视频算法推送原理详细且专业的解读-优雅草卓伊凡-【01】短视频算法推荐之数据收集
短视频到底如何推荐的?深度剖析视频算法推送原理详细且专业的解读-优雅草卓伊凡-【01】短视频算法推荐之数据收集
277 12
短视频到底如何推荐的?深度剖析视频算法推送原理详细且专业的解读-优雅草卓伊凡-【01】短视频算法推荐之数据收集
|
5月前
|
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
本文深入探讨了基于Redis实现分布式锁时遇到的细节问题及解决方案。首先,针对锁续期问题,提出了通过独立服务、获取锁进程自己续期和异步线程三种方式,并详细介绍了如何利用Lua脚本和守护线程实现自动续期。接着,解决了锁阻塞问题,引入了带超时时间的`tryLock`机制,确保在高并发场景下不会无限等待锁。最后,作为知识扩展,讲解了RedLock算法原理及其在实际业务中的局限性。文章强调,在并发量不高的场景中手写分布式锁可行,但推荐使用更成熟的Redisson框架来实现分布式锁,以保证系统的稳定性和可靠性。
200 0
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
软演员-评论家算法(Soft Actor-Critic, SAC)是深度强化学习领域的重要进展,基于最大熵框架优化策略,在探索与利用之间实现动态平衡。SAC通过双Q网络设计和自适应温度参数,提升了训练稳定性和样本效率。本文详细解析了SAC的数学原理、网络架构及PyTorch实现,涵盖演员网络的动作采样与对数概率计算、评论家网络的Q值估计及其损失函数,并介绍了完整的SAC智能体实现流程。SAC在连续动作空间中表现出色,具有高样本效率和稳定的训练过程,适合实际应用场景。
1436 7
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
理解CAS算法原理
CAS(Compare and Swap,比较并交换)是一种无锁算法,用于实现多线程环境下的原子操作。它通过比较内存中的值与预期值是否相同来决定是否进行更新。JDK 5引入了基于CAS的乐观锁机制,替代了传统的synchronized独占锁,提升了并发性能。然而,CAS存在ABA问题、循环时间长开销大和只能保证单个共享变量原子性等缺点。为解决这些问题,可以使用版本号机制、合并多个变量或引入pause指令优化CPU执行效率。CAS广泛应用于JDK的原子类中,如AtomicInteger.incrementAndGet(),利用底层Unsafe库实现高效的无锁自增操作。
296 0
理解CAS算法原理
【AI系统】布局转换原理与算法
数据布局转换技术通过优化内存中数据的排布,提升程序执行效率,特别是对于缓存性能的影响显著。本文介绍了数据在内存中的排布方式,包括内存对齐、大小端存储等概念,并详细探讨了张量数据在内存中的排布,如行优先与列优先排布,以及在深度学习中常见的NCHW与NHWC两种数据布局方式。这些布局方式的选择直接影响到程序的性能,尤其是在GPU和CPU上的表现。此外,还讨论了连续与非连续张量的概念及其对性能的影响。
230 3

热门文章

最新文章

AI助理
登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问

你好,我是AI助理

可以解答问题、推荐解决方案等