第18讲:Ceph集群CrushMap的核心概念、默认规则与完整定义

news2024/11/24 0:43:15

文章目录

    • 1.CrushMap核心概念
    • 2.集群默认的CrushMap规则剖析
      • 2.1.CrushMap列表显示内容剖析
      • 2.2.对默认的CrushMap规则进行深度的剖析
      • 2.3.完整的CrushMap定义信息

1.CrushMap核心概念

CrushMap官方文档:https://docs.ceph.com/en/pacific/rados/operations/crush-map/

Ceph集群数据写入流程,最终是通过Crush算法将数据落入到OSD中,使用Crush算法来存储和管理数据,相当于智能的数据分发机制。Ceph可以通过Crush算法准确的计算出数据应该存储在哪里,也可以计算出从哪里读取数据。

Crush算法就是依据配置的Crush Map规则策略,将数据路由到对应的存储点。

如下图所示,一份数据被拆成多个Object对象,这些Object对象从PG写入到OSD时,Crush算法是根据节点来选择OSD进行存储的,也就是说,Crush算法不会将同一份数据的多个副本写入在一个节点中多个OSD上,因为一旦这个节点宕机,对于数据的完整性就会产生影响,Crush算法会将一份数据的多个副本分别存储在不同的节点的OSD上,以确保数据的安全性。

在这里插入图片描述

Crush算法是根据CrushMap规则来决定数据应该如何分配和存储,由CrushMap来定义具体的规则,数据的容灾也是由CrushMap来定义。

如果对于Ceph中存储的数据安全性要求很高,那么数据容灾机制也是必不可少的环节。

数据容灾可以通过CrushMap来定义,CrushMap支持很多种容灾方案:

  • OSD容灾:多个OSD之间存放一份数据的多个副本。
  • Host容灾:多个节点上的不同OSD存放一份数据的多个副本。

如果数据安全性很高可以使用下面几种方案:

  • ROW容灾:跨机房的容灾,多个机房中的Ceph节点组成的集群。
  • Datacenter容灾:数据中心容灾,跨数据中心组网,实现数据存储的高可靠性。
  • zone容灾:区域容灾,同一地区下多个区域之间的组网。
  • region容灾:跨地区容灾,例如上海和北京组网,对数据存储实现高可靠性。
  • root:顶部

等等多种方案··············

这些容灾机制都是通过CrushMap来实现的,定义好的这些规则与Pool资源池进行关联,最终实现数据的分布式存储。

2.集群默认的CrushMap规则剖析

2.1.CrushMap列表显示内容剖析

可以通过ceph osd tree或者ceph osd crush tree两个命令来查看集群中OSD有那些CrushMap规则列表,显示的内容是一样的,后者的输出更加详细。

[root@ceph-node-1 ~]# ceph osd tree
ID CLASS WEIGHT  TYPE NAME            STATUS REWEIGHT PRI-AFF 
    -1       0.06857 root default                                 
-3       0.02939     host ceph-node-1                         
 0   hdd 0.00980         osd.0            up  1.00000 1.00000 
 3   hdd 0.00980         osd.3            up  1.00000 1.00000 
 6   hdd 0.00980         osd.6            up  1.00000 1.00000 
-5       0.02939     host ceph-node-2                         
 1   hdd 0.00980         osd.1            up  1.00000 1.00000 
 4   hdd 0.00980         osd.4            up  1.00000 1.00000 
 7   hdd 0.00980         osd.7            up  1.00000 1.00000 
-7       0.00980     host ceph-node-3                         
 2   hdd 0.00980         osd.2            up  1.00000 1.00000 

1)在NAME一列中可以看到第一行为default,这个default就是Crush Map规则的名称。

2)在TYPE一列可以看到值为root,也就是说该Crush Map使用的是root类型的容灾机制。

3)在NAME之一列中还可以看到集群中的各个节点,这说明该Crush Map是以Host节点进行划分Bucket的,每一个节点都充当刚一个Bucket,每个Bucket下都包含了很多个OSD。

4)每一个OSD还会划分一个Class类。

5)每个OSD都会对应一个权重值,OSD磁盘空间越大,权重值就越高,与节点名称同行的权重值是该节点下所有OSD权重之和,第一行的权重值是该Crush Map规则中权重的总和。

输出的内容剖析示意图:

在这里插入图片描述

2.2.对默认的CrushMap规则进行深度的剖析

通过ceph osd crush dump命令可以展开Crush Map规则的所有配置项。

一个Crush Map规则中包含五部分主要配置内容:

  • devices中包含集群中所有的OSD设备。
  • types中包含可以选择那些数据保护机制,也就是容灾机制。
  • buckets中包含数据存储的分布信息。
  • rules中定义的是具体的规则,所有的pool都会与这个规则进行关联。
  • tunables中定义的是一些具体的参数,不需要过多的关注。
[root@ceph-node-1 ~]# ceph osd crush dump
{
    "devices": [
    ],
    "types": [
    ],
    "buckets": [
    ],
    "rules": [
    ],
    "tunables": {
    },
    "choose_args": {}
}

1)devices中配置内容详解

在devices中包含的配置内容是集群中所有的OSD设备信息,包括OSD的ID号、名称、以及划分的class类。

    "devices": [
        {
            "id": 0,					#OSD的名称
            "name": "osd.0",			 #OSD的名称
            "class": "hdd"				#OSDclass类名称
        },
        {
            "id": 1,
            "name": "osd.1",
            "class": "hdd"
        },
·················
    ],

2)types中配置内容详解

在types中包含了数据容灾保护的11种类型,后面选择使用哪种类型时都需要在指定该类型的ID号以及名称。

    "types": [
        {
            "type_id": 0,				#类型的ID
            "name": "osd"				#类型的名称,osd类型
        },
        {
            "type_id": 1,
            "name": "host"				#主机类型
        },
        {
            "type_id": 2,
            "name": "chassis"
        },
        {
            "type_id": 3,
            "name": "rack"
        },
        {
            "type_id": 4,	
            "name": "row"				#机房
        },
        {
            "type_id": 5,
            "name": "pdu"
        },
        {
            "type_id": 6,
            "name": "pod"
        },
        {
            "type_id": 7,
            "name": "room"
        },
        {
            "type_id": 8,
            "name": "datacenter"				#数据中心
        },
        {
            "type_id": 9,
            "name": "zone"						#区域
        },
        {
            "type_id": 10,
            "name": "region"					#地区
        },
        {
            "type_id": 11,
            "name": "root"						#顶级
        }
    ],

3)Buckets中配置内容详解

在Buckets中包含了Crush Map的信息,从这里可以看出该Bucket属于哪一个ClusterMap。

    "buckets": [
        {
            "id": -1,						#指定Crush Map的ID号,后期自动生成的
            "name": "default",				#Crush Map的名称
            "type_id": 11,					#使用的数据保护类型,ID11对应Type中的11也就是root
            "type_name": "root",			#类型的名称
            "weight": 4494,						#权重
            "alg": "straw2",
            "hash": "rjenkins1",
            "items": [							#在items中会包含集群所有节点的信息
                {
                    "id": -3,						#节点的ID"weight": 1926,					#权重
                    "pos": 0
                },
                {
                    "id": -5,
                    "weight": 1926,
                    "pos": 1
                },
                {
                    "id": -7,
                    "weight": 642,
                    "pos": 2
                }
            ]
        },
····················

4)Rules中配置内容详解

Pool资源池需要与Rule规则进行关联,在Rule规则中主要定义了数据是如何分布存储的。

    "rules": [
        {
            "rule_id": 0,
            "rule_name": "replicated_rule",				#规则的名称,查看pool的属性的时候就可以看到pool使用的是哪个规则
            "ruleset": 0,			
            "type": 1,						#类型为1也就对应types中的host类型
            "min_size": 1,					#最小副本数量
            "max_size": 10,					#最大副本数量
            "steps": [
                {
                    "op": "take",
                    "item": -1,
                    "item_name": "default"					#关联的crush map
                },
                {
                    "op": "chooseleaf_firstn",
                    "num": 0,
                    "type": "host"
                },
                {
                    "op": "emit"
                }
            ]
        }
    ],

5)tunables中配置内容详解

tunables中定义了一些配置参数,不需要过多的关注。

    "tunables": {
        "choose_local_tries": 0,
        "choose_local_fallback_tries": 0,
        "choose_total_tries": 50,
        "chooseleaf_descend_once": 1,
        "chooseleaf_vary_r": 1,
        "chooseleaf_stable": 1,
        "straw_calc_version": 1,
        "allowed_bucket_algs": 54,
        "profile": "jewel",
        "optimal_tunables": 1,
        "legacy_tunables": 0,
        "minimum_required_version": "jewel",
        "require_feature_tunables": 1,
        "require_feature_tunables2": 1,
        "has_v2_rules": 0,
        "require_feature_tunables3": 1,
        "has_v3_rules": 0,
        "has_v4_buckets": 1,
        "require_feature_tunables5": 1,
        "has_v5_rules": 0
    },

2.3.完整的CrushMap定义信息

[root@ceph-node-1 ~]# ceph osd crush dump
{
    "devices": [
        {
            "id": 0,
            "name": "osd.0",
            "class": "hdd"
        },
        {
            "id": 1,
            "name": "osd.1",
            "class": "hdd"
        },
        {
            "id": 2,
            "name": "osd.2",
            "class": "hdd"
        },
        {
            "id": 3,
            "name": "osd.3",
            "class": "hdd"
        },
        {
            "id": 4,
            "name": "osd.4",
            "class": "hdd"
        },
        {
            "id": 5,
            "name": "device5"
        },
        {
            "id": 6,
            "name": "osd.6",
            "class": "hdd"
        },
        {
            "id": 7,
            "name": "osd.7",
            "class": "hdd"
        }
    ],
    "types": [
        {
            "type_id": 0,
            "name": "osd"
        },
        {
            "type_id": 1,
            "name": "host"
        },
        {
            "type_id": 2,
            "name": "chassis"
        },
        {
            "type_id": 3,
            "name": "rack"
        },
        {
            "type_id": 4,
            "name": "row"
        },
        {
            "type_id": 5,
            "name": "pdu"
        },
        {
            "type_id": 6,
            "name": "pod"
        },
        {
            "type_id": 7,
            "name": "room"
        },
        {
            "type_id": 8,
            "name": "datacenter"
        },
        {
            "type_id": 9,
            "name": "zone"
        },
        {
            "type_id": 10,
            "name": "region"
        },
        {
            "type_id": 11,
            "name": "root"
        }
    ],
    "buckets": [
        {
            "id": -1,
            "name": "default",
            "type_id": 11,
            "type_name": "root",
            "weight": 4494,
            "alg": "straw2",
            "hash": "rjenkins1",
            "items": [
                {
                    "id": -3,
                    "weight": 1926,
                    "pos": 0
                },
                {
                    "id": -5,
                    "weight": 1926,
                    "pos": 1
                },
                {
                    "id": -7,
                    "weight": 642,
                    "pos": 2
                }
            ]
        },
        {
            "id": -2,
            "name": "default~hdd",
            "type_id": 11,
            "type_name": "root",
            "weight": 4494,
            "alg": "straw2",
            "hash": "rjenkins1",
            "items": [
                {
                    "id": -4,
                    "weight": 1926,
                    "pos": 0
                },
                {
                    "id": -6,
                    "weight": 1926,
                    "pos": 1
                },
                {
                    "id": -8,
                    "weight": 642,
                    "pos": 2
                }
            ]
        },
        {
            "id": -3,
            "name": "ceph-node-1",
            "type_id": 1,
            "type_name": "host",
            "weight": 1926,
            "alg": "straw2",
            "hash": "rjenkins1",
            "items": [
                {
                    "id": 0,
                    "weight": 642,
                    "pos": 0
                },
                {
                    "id": 3,
                    "weight": 642,
                    "pos": 1
                },
                {
                    "id": 6,
                    "weight": 642,
                    "pos": 2
                }
            ]
        },
        {
            "id": -4,
            "name": "ceph-node-1~hdd",
            "type_id": 1,
            "type_name": "host",
            "weight": 1926,
            "alg": "straw2",
            "hash": "rjenkins1",
            "items": [
                {
                    "id": 0,
                    "weight": 642,
                    "pos": 0
                },
                {
                    "id": 3,
                    "weight": 642,
                    "pos": 1
                },
                {
                    "id": 6,
                    "weight": 642,
                    "pos": 2
                }
            ]
        },
        {
            "id": -5,
            "name": "ceph-node-2",
            "type_id": 1,
            "type_name": "host",
            "weight": 1926,
            "alg": "straw2",
            "hash": "rjenkins1",
            "items": [
                {
                    "id": 1,
                    "weight": 642,
                    "pos": 0
                },
                {
                    "id": 4,
                    "weight": 642,
                    "pos": 1
                },
                {
                    "id": 7,
                    "weight": 642,
                    "pos": 2
                }
            ]
        },
        {
            "id": -6,
            "name": "ceph-node-2~hdd",
            "type_id": 1,
            "type_name": "host",
            "weight": 1926,
            "alg": "straw2",
            "hash": "rjenkins1",
            "items": [
                {
                    "id": 1,
                    "weight": 642,
                    "pos": 0
                },
                {
                    "id": 4,
                    "weight": 642,
                    "pos": 1
                },
                {
                    "id": 7,
                    "weight": 642,
                    "pos": 2
                }
            ]
        },
        {
            "id": -7,
            "name": "ceph-node-3",
            "type_id": 1,
            "type_name": "host",
            "weight": 642,
            "alg": "straw2",
            "hash": "rjenkins1",
            "items": [
                {
                    "id": 2,
                    "weight": 642,
                    "pos": 0
                }
            ]
        },
        {
            "id": -8,
            "name": "ceph-node-3~hdd",
            "type_id": 1,
            "type_name": "host",
            "weight": 642,
            "alg": "straw2",
            "hash": "rjenkins1",
            "items": [
                {
                    "id": 2,
                    "weight": 642,
                    "pos": 0
                }
            ]
        }
    ],
    "rules": [
        {
            "rule_id": 0,
            "rule_name": "replicated_rule",
            "ruleset": 0,
            "type": 1,
            "min_size": 1,
            "max_size": 10,
            "steps": [
                {
                    "op": "take",
                    "item": -1,
                    "item_name": "default"
                },
                {
                    "op": "chooseleaf_firstn",
                    "num": 0,
                    "type": "host"
                },
                {
                    "op": "emit"
                }
            ]
        }
    ],
    "tunables": {
        "choose_local_tries": 0,
        "choose_local_fallback_tries": 0,
        "choose_total_tries": 50,
        "chooseleaf_descend_once": 1,
        "chooseleaf_vary_r": 1,
        "chooseleaf_stable": 1,
        "straw_calc_version": 1,
        "allowed_bucket_algs": 54,
        "profile": "jewel",
        "optimal_tunables": 1,
        "legacy_tunables": 0,
        "minimum_required_version": "jewel",
        "require_feature_tunables": 1,
        "require_feature_tunables2": 1,
        "has_v2_rules": 0,
        "require_feature_tunables3": 1,
        "has_v3_rules": 0,
        "has_v4_buckets": 1,
        "require_feature_tunables5": 1,
        "has_v5_rules": 0
    },
    "choose_args": {}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1653048.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Alluxio】文件系统锁模型之InodeLockList

InodeLockList接口,表示在inode tree里一个加了锁的路径。 沿着path,inodes和edges都被加锁了。path可能从edge或inode任意一个开始。 锁列表总是包含了一定数量的读锁(0个或多个),随后跟随着一些数量的写锁(0个或多个)。 举个例子: 对 /a/b/c/d 进行加锁,c->d这…

QGraphicsItem的prepareGeometryChange 和 update方法区别

prepareGeometryChange 这个函数用于为图形的几何形状变化做准备。在改变一个项目的边界矩形之前调用此函数,以保持 QGraphicsScene 的索引是最新的。如果必要的话,prepareGeometryChange() 会调用 update()。QGraphicsScene认为所有图元的boundingRect…

ReactFlow的ReactFlow实例事件传参undefined处理状态切换

1.问题 ReactFlow的ReactFlow实例有些事件我们在不同的状态下并不需要,而且有时候传参会出现其它渲染效果,比如只读状态下我们不想要拖拉拽onEdgesChange连线重连或删除的功能。 2.思路 事件名称类型默认值onEdgesChange(changes: EdgeChange[]) >…

.NET邮箱API发送邮件的步骤?怎么配置API?

.NET邮箱API发送邮件需要注意哪些?如何使用API发信? 在.NET环境中,使用邮箱API发送邮件是一个常见的需求。无论是企业级的邮件通知,还是个人项目中的邮件验证,都少不了.NET邮箱API的帮助。下面,AokSend将详…

MT3033 新的表达式

代码&#xff1a; #include <bits/stdc.h> using namespace std; bool is_op(char c) {return c & || c |; } int priority(char op) { // 运算优先级。如果有-*/等别的运算符&#xff0c;则这个函数很有必要if (op & || op |){return 1;}return -1; } voi…

内网渗透(二)

预备知识 什么是域&#xff1f; 域是若干台计算机组成的集合&#xff0c;一个电脑也是。域中的电脑是分等级的&#xff0c;分为域控和成员机。 如何安装域&#xff1f; 在服务器管理中添加服务器角色&#xff0c;添加域服务 如何加入域? 首先一定要修改DNS服务器 ip为域…

Davinci工程CAN模块讲解

CAN模块是用来配置CAN Driver的&#xff0c;里面有CanConfigSet是用来配置驱动内容的&#xff0c;CanGeneral配置参数。涉及四个文件Can_Lcfg.c/Can_Lcfg.h/Can_Cfg.c/Can_Cfg.h CanConfigSet CanControllers CAN控制器&#xff0c;我们这里的CAN控制器只有一个&#xff0c;名…

Gradle报错Cause: zip END header not found,构建问题解决

问题描述 构建报错&#xff1a;Cause: zip END header not found 解决办法 File>>setting>>Build,Execution,Deployment>>Gradle 选择你本地的Gradke路径 问题解决

探索Java的未来

探索 Java 的未来是一个非常有趣的话题。Java 是一种广泛使用的编程语言&#xff0c;自 1995 年诞生以来&#xff0c;它已经在软件开发领域占据了重要的地位。尽管有些人担心 Java 可能会因为新技术的出现而变得不再相关&#xff0c;但实际情况并非如此。让我们来看看一些关于 …

MySQL 依据扫码记录统计人员进出区域的时间

解决这样一个问题&#xff1a; 如下图人员在区域的扫码记录&#xff0c;进出区域的时候都必须扫码&#xff0c;中间扫码的不算&#xff0c;统计每个人员进入区域、出区域的时间。 有了人员在区域停留的组号&#xff0c;还差一步group by&#xff08;在最后&#xff09;&#xf…

淘宝订单详情与物流电子面单API接口:提升电商物流效率的利器

前言 在电子商务蓬勃发展的今天&#xff0c;物流作为电商交易的重要环节&#xff0c;其效率和准确性直接关系到消费者的购物体验和商家的运营效率。淘宝作为中国最大的电商平台之一&#xff0c;一直致力于提升物流效率和服务质量。其中&#xff0c;淘宝订单详情与物流电子面单A…

Flutter-Statewidget 创建State过程State<XXXX> createState() => _XXXXState()的解释

文章目录 创建widget 的状态对象示例代码解析 完整的代码示例总结 创建widget 的状态对象 今天有个同学问了我下State createState() > _XXXXState()时什么意思。这个代码在flutter开发中一直看到&#xff0c;很多人都不关心这个&#xff0c;直接当模板使用。今天来介绍下这…

运维自动化工具:Ansible 概念与模块详解

目录 前言 一、运维自动化工具有哪些 二、Ansible 概述 1、Ansible 概念 2、Ansible 特点 3、Ansible 工作流程 4、Ansible 架构 4.1 Ansible 组成 4.2 Ansible 命令执行来源 5、Ansible 的优缺点 三、Ansible 安装部署 1、环境部署 2、管理节点安装 Ansible 3、…

智能商品计划系统:引领未来零售业的革新之路

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;和大数据技术已成为推动各行业革新的关键动力。在零售行业中&#xff0c;智能商品计划系统的出现&#xff0c;正逐步改变着传统的商品规划与管理方式&#xff0c;为品牌注入新的活力与竞争力。本文将对智能商…

源码部署与SaaS账号:企业软件选择的自建房与租赁公寓之辩

在数字化运营的时代&#xff0c;企业选择软件解决方案就如同在选择住所&#xff1a;源码部署类似于“自建房屋”&#xff0c;而SaaS账号则更像是“租赁公寓”。 自建房屋&#xff08;源码部署&#xff09; 当你选择自建房屋时&#xff0c;你需要投入大量的时间和资金来购买土地…

什么是香草看涨期权?香草看涨期权有哪些特点?

什么是香草看涨期权&#xff1f;香草看涨期权有哪些特点&#xff1f; 香草看涨期权&#xff0c;通常也称为香草期权&#xff0c;是金融市场上的一种金融衍生品&#xff0c;由券商或金融机构推出。它允许投资者以较小的费用获取相应股票市值的收益权&#xff0c;主要用于风险管…

如何添加、编辑、调整WordPress菜单

我们最近在使用WordPress建站建设公司网站。我们是使用的hostease的主机产品建设的WordPress网站。在建设网站使用遇到了一些WordPress菜单使用方面的问题。好在hostease提供了不少帮助。 下面把WordPress菜单使用心得分享一下。 本文将详细介绍WordPress菜单的各种功能&#x…

hive日常使用时忘记部分补充(不定时)

1、date_formate、unix_timestamp、from_unixtime用法&#xff1a; 2、lag&#xff08;&#xff09;、lead()用法&#xff1a; lag&#xff08;)窗口函数返回分区中当前行之前行&#xff08;可以指定第几行&#xff09;的值。 如果没有行&#xff0c;则返回null。 lead()窗口…

组件通信-props详解

目录 一、什么是prop 二、props校验 三、组件中prop和data的区别 一、什么是prop Prop定义&#xff1a;组件上注册的一些自定义属性。 Prop作用&#xff1a;向子组件传递数据。 特点&#xff1a; 可以传递任意数量的prop可以传递任意类型的prop 二、props校验 组件的pr…

【Linux】-Linux基础命令[2]

目录 一、目录切换相关命令 1、cd 2、pwd 二、相对路径、绝对路径和特殊路径符 1、相对路径和绝对路径 2、特殊路径符 三、创建目录命令&#xff08;mkdir&#xff09; 四、文件操作命令 1、touch 创建文件 2、cat查看文件内容 3、more查看文件内容 4、cp命令复制文…