Ceph CRUSH算法说明 CRUSH算法的全称为:Controlled Scalable Decentralized Placement of Replicated Data,可控的、可扩展的、分布式的副本数据放置算法 pg到OSD的映射的过程算法叫做CRUSH 算法。(一个Object需要保存三个副本,也就是需要保存在三个osd上)。 Ceph CRUSH算法原理 CRUSH算法因子: 层次化的Cluster Map 反映了存储系统层级的物理拓扑结构。定义了OSD集群具有层级关系的 静态拓扑结构。 CRUSH Map是一个树形结构,OSDMap更多记录的是OSDMap的属性(epoch/fsid/pool信息以及osd的ip等等)。 从CRUSH Map中的哪个节点开始查找 b. 使用那个节点作为故障隔离域 c.
CRUSH 算法通过计算数据存储位置来确定如何存储和检索。CRUSH 授权 Ceph 客户端直接连接 OSD ,而非通过一个中央服务器或经纪人。 CRUSH 需要一张集群的地图,且使用 CRUSH 把数据伪随机地存储、检索于整个集群的 OSD 里。CRUSH 的讨论详情参见 CRUSH - 可控、可伸缩、分布式地归置多副本数据 。 CRUSH 图包含 OSD 列表、把设备汇聚为物理位置的“桶”列表、和指示 CRUSH 如何复制存储池里的数据的规则列表。 由于对所安装底层物理组织的表达, CRUSH 能模型化、并因此定位到潜在的相关失败设备源头,典型的源头有物理距离、共享电源、和共享网络,把这些信息编码到集群运行图里, CRUSH 归置策略可把对象副本分离到不同的失败域 例如,如果一个 OSD 挂了, CRUSH 图可帮你定位此事件中 OSD 所在主机的物理数据中心、房间、行和机架,据此你可以请求在线支持或替换硬件。 类似地, CRUSH 可帮你更快地找出问题。
v4(straw2)属性 root@lab8107:~/ceph/crush# ceph osd crush tunables hammer adjusted tunables profile to to 1 设置完了检查这两个个属性,如果是straw_calc_version 0的时候profile会显示unknow root@lab8107:~/ceph/crush# ceph osd crush 发生变动的时候会自动触发 ceph osd crush reweight-all 二、先来测试straw 开始第一步测试,将osd.7从集群中crush改为0,那么变动的就是host4的crush,那么我们来看下数据的变化 # ceph osd crush reweight osd.7 0 reweighted item id 7 name 'osd.7' to 0 in crush map root@lab8107:~ceph :~/ceph/crush# ceph osd crush dump|grep alg "alg": "straw2", "alg": "straw2",
CRUSH map是ceph集群物理拓扑的抽象,CRUSH算法通过CRUSH map中的ceph集群拓扑结构、副本策略以及故障域等信息,将数据伪随机地分布到集群的各个OSD上。 因此,读懂CRUSH map也有助于我们理解CRUSH算法。CRUSH map含义结合实际的ceph环境,讲解CRUSH map中配置项的含义和作用。 }例:crushtool -d crush.bin -o crush.txt打开crush.txt内容如下:# begin crush maptunable choose_local_tries 0tunable };最优crush map默认参数设置:void set_optimal_crush_map(struct crush_map *map) { map->choose_local_tries = 0; 创建存储池更新完CRUSH map之后,根据业务需求,创建对应的pool并关联CRUSH rule即可。
image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png
代替CRUSH? 引入CRUSH算法 千呼万唤始出来,终于开始讲CRUSH算法了,如果直接讲Sage的博士论文或者crush.c的代码的话,可能会十分苦涩难懂,所以我决定尝试大话一把CRUSH,希望能让没有接触过CRUSH 仿照CRUSH选OSD的方法: CRUSH从root下的所有的row中选出一个row。 在刚刚的一个row下面的所有cabinet中,CRUSH选出三个cabinet。 Ceph中的CRUSH 现在再正式介绍CRUSH算法在Ceph中的存在形式,首先导出一个集群的CRUSH Map: [root@ceph-1 ~]# ceph osd getcrushmap -o /tmp /crush-map/)。
Candy Crush 传送门:723. Candy Crush Problem: This question is about implementing a basic elimination algorithm for Candy Crush following rules: If three or more candies of the same type are adjacent vertically or horizontally, “crush
CRUSH 需要一张集群的 Map,且使用 CRUSH Map 把数据伪随机地、尽量平均地分布到整个集群的 OSD 里。 操作 CRUSH Map 2.1 提取CRUSH Map #提取最新crush图#ceph osd getcrushmap -o {compiled-crushmap-filename} $ ceph } $ crushtool -d /tmp/crush -o /tmp/decompiled_crush 2.2 注入CRUSH Map #编译crush图#crushtool -c {decompiled-crush-map-filename } -o {compiled-crush-map-filename} $ crushtool -c /tmp/decompiled_crush -o /tmp/crush_new #注入crush 3.4 CRUSH Map 之规则 CRUSH Map 支持“ CRUSH 规则”的概念,用以确定一个存储池里数据的分布。
前几天看到了一个挺好玩的Github项目-Crush,这个项目是一款Terminal运行的AI工具,Go开发,可以在终端运行~Crush是支持MacOS,Linux和Windows,不过感觉MacOS和 Key展开代码语言:ShellAI代码解释$HOME/.local/share/crush/crush.json打开文件,如下图所示当配置好模型以及对应的APIKey后,就可以直接尝试了,比如我直接说帮我创建一个 c的项目,crush创建好文件夹后会列出步骤(crush会操作你的文件已经调用shell命令)创建main.c写代码gcc编译当然,创建文件或者删除文件毕竟是敏感操作,crush会弹出窗口让确认,这个建议是保留 ,虽然可以通过配置将这个提醒取消~创建成功后,crush会继续执行编译,如果出错,它会分析bash打印的错误信息并进行纠正继续任务,直到完成当实际编译成功后,crush界面也会打印程序运行的结果,并且看本地目录 ,实际创建了一个c_project的文件夹,里面写了mian.c的程序并编译出来可以正确运行的可执行程序,当然这个crush可以做更多的东西,以上只是一个简单的例子,大家觉的好玩的话可以自行尝试
1、ceph架构 image.png 2、CRUSH基于哈希的数据分布算法 image.png 3、straw算法straw2算法 image.png straw2在新osd加入时不会引起其他osd 的迁移 4、CRUSH计算的输入为X, cluster map ,placement rule 5、cluster map: device 磁盘 /主机 bucket /数据中心 root image.png image.png image.png 6、placement rule: take/select :firstn indep /emit 7、选择Jewel版本之后 8、针对CRUSH 算法的可调整配置,不建议更改 image.png 9、CRUSH配置的模板,JEWEL版本? image.png 10、crush map 获取:ceph osd getcrushmap -o file 手动生成crush map:27个osd,3个host,rack 3,root 0
上篇文章我们还挖了一个坑,我们提到了CRUSH。 这里应用的就是CRUSH算法了,通过CRUSH算法可以通过pgid得到多个osd(跟配置有关)。 因为我们不会过多的讨论CRUSH是如何实现的,我们可以换个思考的角度认识一下CRUSH都做了哪些工作。 假如我们不用CRUSH用HASH是否可以?我们也套用上面的公式hash(pgid) & mask = osdid是否可以实现呢? 所以这里就需要CRUSH了,CRUSH可以根据集群的OSD状态和存储策略配置动态得到osdid,从而自动化的实现高可靠性和数据均匀分布。 关于CRUSH的详细实现还需参考Sage Weil的论文。 是时候看看Sage Weil的论文了 参考: Ceph官方文档 ceph存储数据的详细流程(CRUSH)
1、硬件 image.png 2、架构 image.png 3、执行 image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png
image.png image.png image.png image.png image.png image.png image.png image.png image.png ---- ceph crush
小游戏,即小程序游戏,是小程序的一个子类目,其最大的特点就是“即点即玩”,具备出色的用户体验。如今大家的生活逐渐向快节奏发展,在各种压力下,人们更倾向于方便快捷的娱乐方式,而这正推动了小游戏赛道的发展。 就微信小游戏来说,其开发者数量在今年已经超过10万人;而产品方面除了《跳一跳》《羊了个羊》这种现象级爆款之外,也出现了不少标杆产品——今年百万级别用户量的小游戏,以及千万级别月流水的小游戏,都在持续新增并创历史新高。 2022年,一些游戏厂商回顾小游戏的发展历程,总结了一句话:往前看全是坑,往后看全是红利。的确,一路走来,小游戏的发展几乎都环绕着大型社交平台给予的流量扶持。 本篇文章就带着大家盘点一下这几年来爆火的微信小游戏以及其背后产生的商业价值。
前几天看到了一个挺好玩的Github项目-Crush[1],这个项目是一款Terminal运行的AI工具,Go开发,可以在终端运行~ Crush是支持MacOS,Linux和Windows,不过感觉MacOS 也可以直接去下面路径的配置文件填写模型以及Key $HOME/.local/share/crush/crush.json 打开文件,如下图所示 当配置好模型以及对应的API Key后,就可以直接尝试了 ,比如我直接说帮我创建一个c的项目,crush创建好文件夹后会列出步骤(crush会操作你的文件已经调用shell命令) 1.创建main.c2.写代码3.gcc编译 当然,创建文件或者删除文件毕竟是敏感操作 ,crush会弹出窗口让确认,这个建议是保留,虽然可以通过配置将这个提醒取消~ 创建成功后,crush会继续执行编译,如果出错,它会分析bash打印的错误信息并进行纠正继续任务,直到完成 当实际编译成功后 ,大家觉的好玩的话可以自行尝试 References [1] Crush: https://github.com/charmbracelet/crush
CRUSH算法在Ceph中的作用CRUSH(Controlled Replication Under Scalable Hashing)算法在Ceph中用于数据分布和数据位置计算。 CRUSH算法的工作原理和用途CRUSH算法基于一致性哈希算法,通过将对象、存储设备和设备部署信息映射到一个大的哈希空间中,来计算数据的位置和选择适合的存储设备。 映射CRUSH规则:定义一个CRUSH规则,规定了数据放置的策略。CRUSH规则由一系列bucket定义,每个bucket可以包含存储设备或其他的bucket。 CRUSH算法的用途包括:数据分布:CRUSH算法根据对象的哈希值将数据均匀地和分散地分布在存储集群中的不同存储设备上,避免了数据热点和负载不均衡的问题。 总而言之,CRUSH算法在Ceph中起到决策和计算的作用,使得数据的存储和访问具备高可用性、高性能和可扩展性。
深入Ceph原理 一、Crush算法与作用 CRUSH 算法,全称 Controlled Replication Under Scalable Hashing (可扩展哈希下的受控复制),它是一个可控的 、可扩展的、分布式的副本数据放置算法, 通过CRUSH 算法来计算数据存储位置来确定如何存储和检索数据。 保障数据分布的均衡性 集群的灵活伸缩性 支持更大规模的集群 二、Crush算法说明 PG 到 OSD 的映射的过程算法称为 CRUSH 算法,它是一个伪随机的过程,可以从所有的 OSD 中,随机性选择一个 ( PG _ ID )==> OSD (对象存储设备位置) 4、为什么需要采用Crush算法 如果把 CRUSH ( PG _ ID )改成 HASH ( PG_ID ) % OSD_NUM Crush 所计算出的随机数,是通过 HASH 得出来,可以保障相同的输入会得出同样的输出结果。 所以Crush 并不是真正的随机算法, 而是一个伪随机算法。
CRUSH(可伸缩哈希下的受控复制)的放置算法来计算哪些osd应该持有哪些对象,对象被分配到放置组(pg), CRUSH 决定这些 放置组 应该使用哪个 osd来存储它们的对象,即 crush 决定了 不同的池可能会使用不同的CRUSH规则 CRUSH 桶类型 CRUSH 层次结构将 osd 组织成一个由不同容器组成的树,称为桶。 自定义故障和性能域 CRUSH 映射是 CRUSH算法 的 中心配置机制,可以编辑此 map 以影响数据放置并自定义CRUSH算法 配置 CRUSH 映射和创建单独的 故障域 允许 osd 和集群节点发生故障 CRUSH Map 管理 集群保持一个编译后的CRUSH map的二进制表示。 crush命令更新CRUSH Map会更容易。
ceph osd crush add-bucket host1-a host ceph osd crush add-bucket host2-a host ceph osd crush add-bucket crush add-bucket host3-b host ceph osd crush add-bucket host1-c host ceph osd crush add-bucket host2 -c host ceph osd crush add-bucket host3-c host ceph osd crush add-bucket host1-d host ceph osd crush osd crush move host1-b root=default-b ceph osd crush move host2-b root=default-b ceph osd crush move ceph osd crush move host3-c root=default-c ceph osd crush move host1-d root=default-dceph osd crush
; crushtool -d crush.map | grep straw; rm -f crush.map 19 tunable straw_calc_version 1 alg straw2 version 19 # mode crush-compat ceph osd crush weight-set create-compat ceph osd crush weight-set reweight-compat 0 0.953864 ceph osd crush weight-set reweight-compat 1 1.015576 ceph osd crush weight-set reweight-compat 2 0.979331 ceph osd crush weight-set reweight-compat 3 1.027135 ceph osd crush weight-set reweight-compat 4 1.019382 ceph osd crush weight-set reweight-compat 5 0.997575 ceph osd crush weight-set reweight-compat