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

文章目录

    • 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.hqwc.cn/news/679187.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nlp课设 - 基于BERT 的情感分类

基于BERT 的情感分类 主要论文: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding(双向Transformer 的预训练) 核心技术: Embedding 、Attention --> Transformer 任务简介、拟解决问题…

led显示屏用什么胶水封装比较好?

led显示屏用什么胶水封装比较好? LED显示屏通常使用特定的胶水进行封装,以确保其稳定性和耐用性。常见的用于LED显示屏封装的胶水类型包括有机硅灌封胶、环氧树脂灌封胶等。 有机硅灌封胶具有优异的耐高温、防水、绝缘和密封性能,非常适合用…

vue3+vite+js 安装

首先需要node版本高于V16.14.1,我用的node版本 V20.12.0 目前使用的是vue3vitejs,没有使用ts 安装 执行 npm create vitelatest 具体选择按照自己实际需要的来 Project name:项目名称 Select a framework:选择用哪种框架 (我选择vue&#…

俄罗斯国际消费类电子电器展ICEE:人潮如织,盛况空前

近日,备受全球瞩目的俄罗斯国际消费类电子电器展ICEE在莫斯科盛大落幕。本次展会为期四天,真的攒足了眼球,不仅俄罗斯这边的很多媒体和自媒体有报道,展会第一天,很多参展商通过短视频平台将展会的盛况传到了国内&#…

JavaScript快速入门系列-1(JavaScript简介)

第一章:JavaScript简介 1. JavaScript简介1.1 什么是JavaScript1.2 JavaScript的历史与应用1.3 环境搭建:浏览器与Node.js2. JavaScript语言基础2.1 变量声明:let, const, var2.2 数据类型:字符串、数字、布尔值、对象、数组、null与undefined2.3 运算符:算术、比较、逻辑…

JS-拖拽元素放大缩小

效果左右布局&#xff0c;拖拽后&#xff0c;宽度放大缩小 其实自己写也可以&#xff0c;不过还是发现了两个好用的js库&#xff0c;既然不需要自己写&#xff0c;当然是能偷懒就偷懒 1、resizerjs 官网地址&#xff1a;https://github.com/eknowles/resizerjs <!doctype …

难定取舍,静观其变

今&#xff08;2024年5月8日&#xff09;天&#xff0c;本“人民体验官”在推广人民日报官方微博文化产品《带着笑意的眼睛&#xff0c;能看见最美的风景》的同时&#xff0c;还要联系4月初至今期间&#xff0c;与隐藏在《麻辣论坛》幕后的那位昵称“800727”者所爆发的一连串&…

Flutter笔记:手动配置VSCode中Dart代码自动格式化

Flutter笔记 手动配置VSCode中Dart代码自动格式化 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csd…

缓存雪崩、击穿、击穿

缓存雪崩&#xff1a; 就是大量数据在同一时间过期或者redis宕机时&#xff0c;这时候有大量的用户请求无法在redis中进行处理&#xff0c;而去直接访问数据库&#xff0c;从而导致数据库压力剧增&#xff0c;甚至有可能导致数据库宕机&#xff0c;从而引发的一些列连锁反应&a…

顺序栈的操作

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd;既然选择了远方&#xff0c;当不负青春…

Jmeter用jdbc实现对数据库的操作

我们在用Jmeter进行数据库的操作时需要用到配置组件“JDBC Connection Configuration”&#xff0c;通过配置相应的驱动能够让我们通过Jmeter实现对数据库的增删改查&#xff0c;这里我用的mysql数据库一起来看下是怎么实现的吧。 1.驱动包安装 在安装驱动之前我们要先查看当前…

程序员的实用神器——高效软件开发的秘诀

目录 前言 一、自动化测试工具 &#xff08;一&#xff09;常用的自动化测试工具 &#xff08;二&#xff09;编写有效的测试用例的建议 &#xff08;三&#xff09;提高代码覆盖率的方法 二、持续集成/持续部署 &#xff08;一&#xff09;持续集成&#xff08;CI&#…