开源存储详解-分布式存储与ceph
ceph体系结构
rados:reliable, autonomous, distributed object storage, rados
rados采用c++开发
对象存储
ceph严格意义讲只提供对象存储能力,ceph的块存储能力实际是基于对象存储库librados的rbd
对象存储特点
对象存储采用put/get/delete,不支持修改
对象存储结构是扁平结构,不支持多层容器嵌套结构
rados
rados集群主要由两种节点组成,osd和monitor。osd节点负责数据维护和存储,monitor节点负责检测和维护系统状态。osd和monitor节点之间相互传递节点状态信息,共同得出系统总体运行状态,并将其保存在一个全局数据结构中(集群运行图)
使用rados系统时,客户端向monitor索取最新集群运行图,然后直接在本地运算,得到存储的位置,便直接与osd通信,完成数据操作
osd,monitor,ceph客户端均可直接通信,意味osd也可以分担monitor等重要节点的部分业务,缓解节点压力
osd
osd可被抽象为系统进程和守护进程
osd节点实质是一个安装了os和fs的节点,同时还应当 保证osd拥有一定的计算能力,内存能力,网络带宽
osd的守护进程可完成osd的所有逻辑功能,包括monitor和其他osd的通信,维护系统及更新状态等
rados接收来自ceph客户端发送的数据,然后存储为对象,对象在节点是fs中的一个文件。对象存储中,是扁平结构,没有目录层次。文件只有文件id,对象内容的二进制格式和文件的元数据。文件元数据取决于客户端请求发送的一些信息,如文件创建者,创建日期,最后修改日期等
osd状态
osd状态直接影响数据重新分配
osd状态用两个维度表示:up或down(daemon和monitor连接是否正常)和in或out(osd是否有pg),两种状态叠加起来,osd总共有四种状态
up && in:osd正常工作状态
up && out:一般是osd刚启动,osd还没有pg
down && in:可能网络中断或daemon意外退出
down && out:osd无法恢复,
PG:Placement Group,用来映射osd节点和存储的对象
osd状态检测
ceph是基于通用计算机硬件构建的分布式系统,故障概率远高于专用硬件构建的分布式系统。如何检测节点故障和网络故障是ceph高可用的一个重点,ceph采用了心跳检测机制,但增加了监控维度
osd之间心跳包:如果osd之间都相互发送心跳,则时间复杂度是pow(n,2),ceph选择仅peerOSD之间发送心跳包,这样时间复杂度是pow(n,1)。peerOSD是osd存储对象和其PG副本所在的osd。ceph同时提供公共网络(osd和客户端通信)和集群网络(osd之间通信网络),peerOSD心跳包也可按网络进行分类。
osd和monitor之间心跳包:osd之间心跳检测结果通过osd和monitor心跳包传送
数据寻址
分布式系统有两个最基本的问题:数据放在哪,数据写在哪。ceph寻址过程如图
file:面向客户的文件对象
object:面向rados的文件对象。object和file的区别是,object单元最大大小存在上限(如2MB或4MB),大于单个object单元大小的file会被切分为一系列统一大小的object进行存储
PG:一个PG负责组织多个object,一个object只能被映射在一个PG,一个PG会被映射在n多个OSD中,实际工作中,n可能大于等于2
file->object映射
将file切分为object进行存储,每个object有唯一的oid,oid可分为两部分,分别是切分的object的元数据和object在切分列表里的序号,比如某个id为filename的文件被切分为序号为0,1,2的三个object,则三个object的oid分别为filename0 filename1 filename2
此处存在一个隐含问题,及文件的id(元数据)必须不重复,否则无法映射
object->PG映射
映射公式:hash(oid) && mask -> pgid
先对oid哈希,再和mask按位与。按rados设计,PG总数应为2的整数次幂,mask的值为PG总数-1所以此映射公式含义是从总数为m的PG中随机均匀地选取一个PG,这样的话,rados保证了object和pg尽量均匀的映射
PG->OSD映射
rados使用一个名为CRUSH的算法,输入pgid,输出n个osd id,n需配置为大于等于2。CRUSH算法和pgid的映射不同,它不是固定输出结果的,而是会受到其他因素影响:系统状态和存储策略配置。
系统状态:即集群运行图。其他osd状态变化时,可能导致集群运行图变化
存储策略配置:和安全有关,即管理员指定PG分配在OSD的规则,比如亲和规则
当系统状态和存储策略配置不变时,PG和OSD的映射才是固定不变的
使用CRUSH算法的原因,一个是算法结果收到配置osd亲和的影响,还有一个是CRUSH算法稳定性的特点,即系统中加入大量osd时,大部分PG和OSD之间的映射不会改变,只有少部分映射会发生改变,并引发数据迁移
小结
三个映射没有任何全局查表的操作,唯一的全局数据结构:集群运行图,其操作与维护是轻量级的,不会对系统造成太大影响
为什么在object和osd之间引入PG
如果没有PG,(1) 则osd损坏时,或新增osd时,原有的object和osd之间的映射无法被更新 (2)有PG时,osd间心跳检测是以PG为粒度,而PG数量在每个osd是基本固定的,当文件增多,PG不会增加。如果不用PG,则osd间心跳则以文件为粒度,当object变多,心跳花的时间也会变多
存储池
一个存储池包含若干PG
存储池创建命令
ceph osd pool create {POOL_NAME} {PG_NUM} [{PGP_NUM}] [REPLICATED] [CRUSH_RULESET_NAME]
ceph osd pool create {POOL_NAME} {PG_NUM} {PGP_NUM} erasure [erasure_code_profile] [crush_ruleset_name]
pgp数目通常和pg数目一致,增加pg数量通常不会发生迁移,增加pgp数量时用户数据才会发生迁移
PGP含义:
注意到,当PG增加时,原PG分为两半,所以新PG和原PG在同一个OSD上
monitor
客户端处理数据前必须通过monitor获取集群状态图。ceph也支持只有一个monitor节点
monitor不会主动查询osd状态,而是osd给monitor主动上报osd状态
集群运行图实际是多个map统称,如monitor map, osdmap, pg map, crush map, mds map等,各运行图维护各自的运行状态。CRUSH MAP用于定义如何选择OSD,CRUSH MAP是树形结构
default下是主机,主机下是主机自己的osd。CRUSH MAP中,所有非叶节点称为桶(Bucket),所有Bucket的ID都是负数,OSD ID是正数,这样可以区分OSD的ID。选择OSD时,需要先从一个指定的bucket开始,往树底下寻找,直到到达叶节点。目前有五种算法来实现子节点的寻找,包括Uniform,List,Tree,Straw,Straw2,不同算法性能如下
monitor与客户端通信
客户端包括rbd客户端,rados客户端,ceph fs客户端等。根据通信内容分为获取OSDMAP和命令行操作
命令行操作:主要由monitor执行或monitor转发到osd执行
获取OSDMAP:因为有了集群状态图,客户端可不经过monitor直接与osd通信,所以仅需要获取OSDMAP时,客户端才需要与monitor通信。再就是客户端初始化。再就是某些特殊情况会主动获取OSDMAP,如找不到PG(PG删除或创建),存储池等空间占满,或者OSDMAP设置了暂停所有读/写,每次读写都会获取OSDMAP
monitor与osd通信
相比monitor与客户端通信,monitor与osd通信更复杂
osd定期将其PG信息发给monitor。PG信息包含PG状态,Object信息等
osd操作命令通过monitor转发给osd
数据操作流程
ceph读写仅对object的主osd进行读写,保证了数据的强一致性。primary收到写请求后,负责把数据发给副本,只有副本都成功写,primary才接收object的写请求,保证了副本一致性,写入流程可参考下图
相关文章:

开源存储详解-分布式存储与ceph
ceph体系结构 rados:reliable, autonomous, distributed object storage, rados rados采用c开发 对象存储 ceph严格意义讲只提供对象存储能力,ceph的块存储能力实际是基于对象存储库librados的rbd 对象存储特点 对象存储采用put/get/delete…...

[算法] [leetcode-509] 斐波那契数
509 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),其中 n…...

运维人员的Go语言学习路线
以下是一份更为详细的适合运维人员的Go语言学习路线图: 一、基础环境搭建与入门(第 1 - 2 周) 第 1 周 环境搭建 在本地开发机和常用的运维服务器环境(如 Linux 系统)中安装 Go 语言。从官方网站(https://…...

[创业之路-222]:波士顿矩阵与GE矩阵在业务组合选中作用、优缺点比较
目录 一、波士顿矩阵 1、基本原理 2、各象限产品的定义及战略对策 3、应用 4、优点与局限性 二、技术成熟度模型与产品生命周期模型的配对 1、技术成熟度模型 2、产品生命周期模型 3、技术成熟度模型与产品生命周期模型的配对 三、产品生命周期与产品类型的对应关系 …...

安卓入门十一 常用网络协议四
MQTT(Message Queuing Telemetry Transport) MQTT是一种轻量级的、发布/订阅模式的消息传输协议。它被设计用于在低带宽或不稳定网络环境下,实现物联网设备之间的可靠通信。 4.1 MQTT详细介绍 发布/订阅模式:MQTT 使用发布/订…...

《机器学习》——利用OpenCV库中的KNN算法进行图像识别
文章目录 KNN算法介绍下载OpenCV库实验内容实验结果完整代码手写数字传入模型训练 KNN算法介绍 一、KNN算法的基本要素 K值的选择:K值代表选择与新测试样本距离最近的前K个训练样本数,通常K是不大于20的整数。K值的选择对算法结果有重要影响,…...

StarRocks 存算分离在得物的降本增效实践
编者荐语: 得物优化数据引擎布局,近期将 4000 核 ClickHouse 迁移至自建 StarRocks,成本降低 40%,查询耗时减半,集群稳定性显著提升。本文详解迁移实践与成果,文末附丁凯剑老师 StarRocks Summit Asia 2024…...

Tube Qualify弯管测量系统在汽车管路三维检测中的应用
从使用量上来说,汽车行业是使用弯管零件数量最大的单一行业。在汽车的燃油,空调,排气,转向,制动等系统中都少不了管路。汽车管件形状复杂,且由于安装空间限制,汽车管件拥有不同弯曲半径…...

udp分片报文发送和接收
读文件通过udp分片发送的目的端:(包含错误的分片包) #!/usr/bin/python # -*- coding: utf-8 -*-#python send_100frag_file.py -p 55432 -f snatdownloadimport argparse import loggingfrom scapy.all import *# Define the maximum size …...

【从零开始入门unity游戏开发之——C#篇39】C#反射使用——Type 类、Assembly 类、Activator 类操作程序集
文章目录 前言一、前置知识1、编译器2、程序集(Assembly)3、元数据(Metadata) 二、反射1、反射的概念2、反射的作用3、反射的核心Type 类3.1 Type 类介绍3.2 不同方法获取 Type3.3 获取type类型所在的程序集的相关信息 4、反射的常…...

安卓触摸事件的传递
setOnTouchListener()返回值的副作用(触摸事件是否继续往下或往后传递)如下: 返回值效果是否往下层view传递是否往当前view的后续监听传递true该pointer离开屏幕前的后续所有触摸事件都会传递给该TouchListener否否false该pointer离开屏幕前…...

idea项目导入gitee 码云
1、安装gitee插件 IDEA 码云插件已由 gitosc 更名为 gitee。 1 在码云平台帮助文档http://git.mydoc.io/?t153739上介绍的很清楚,推荐前两种方法, 搜索码云插件的时候记得名字是gitee,gitosc已经搜不到了。 2、使用码云托管项目 如果之…...

典型常见的基于知识蒸馏的目标检测方法总结三
来源:Google学术2023-2024的顶会顶刊论文 NeurIPS 2022:Towards Efficient 3D Object Detection with Knowledge Distillation 为3D目标检测提出了一种知识蒸馏的Benchmark范式,包含feature的KD,Logit的cls和reg的KD,…...

端口被占用
端口8080被占用 哈哈哈,我是因为后端项目跑错了,两个项目后端名称太像了; (1)netstat -aon | findstr 8080,找到占用8080端口的进程号,获取对应的进程号pid; (2&#…...

Javascript知识框架图(待完善)
以下是一个清晰且详细的 JavaScript 知识框架,涵盖基础知识到高级概念,适合学习和参考: JavaScript 知识框架 1. 基础知识 数据类型 原始类型:Number,String,Boolean,Null,Undefin…...

清华大学Python包镜像站点
清华大学提供了一个Python包镜像站点,其中包括了许多常用的Python包。使用这个镜像站点可以提高下载Python包时的速度,因为包已经存储在国内的服务器上,从而减少了网络延迟。 要使用清华的pip镜像,你可以在pip命令中指定-i参数来…...

逆境清醒文章总目录表
逆境清醒文章总目录表 零、时光宝盒🌻 (https://blog.csdn.net/weixin_69553582 逆境清醒) 《你的答案》歌曲原唱:阿冗,填 词:林晨阳、刘涛,谱曲:刘涛 也许世界就这样,…...

LeetCode算法题——移除元素
题目描述 给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作࿱…...

常见的中间件漏洞
1.Tomcat Tomcat介绍 tomcat是⼀个开源而且免费的jsp服务器,默认端口 : 8080,属于轻量级应⽤服务器。它可以实现 JavaWeb程序的装载,是配置JSP(Java Server Page)和JAVA系统必备的⼀款环境。 在历史上也披露出来了很…...

IPv6的过度技术
如何界定手动与自动? 主要是隧道目标地址能否自动获取 👯1. 双栈 必须支持IPv4和IPv6协议 链接双栈网络的接口必须同时配置v4和v6地址 路由器能够根据二层标记识别协议,type:0x0800代表IPV4,type:0x…...

Python用K-Means均值聚类、LRFMC模型对航空公司客户数据价值可视化分析指标应用|数据分享...
全文链接:https://tecdat.cn/?p38708 分析师:Yuling Fang 信息时代的来临使得企业营销焦点从产品中心转向客户中心,客户关系管理成为企业的核心问题(点击文末“阅读原文”获取完整代码数据)。 客户关系管理的关键是客…...

WebRTC的三大线程
WebRTC中的三个主要线程: signaling_thread,信号线程:用于与应用层交互worker_thread,工作线程(最核心):负责内部逻辑处理network_thread,网络线程:负责网络数据包的收发…...

Spring SpEL表达式由浅入深
标题 前言概述功能使用字面值对象属性和方法变量引用#this 和 #root变量获取类的类型调用对象(类)的方法调用类构造器类型转换运算符赋值运算符条件(关系)表达式三元表达式Elvis 操作符逻辑运算instanceof 和 正则表达式的匹配操作符 安全导航操作员数组集合(Array 、List、Map…...

数据设计规范
目录 一、数据库设计的原则 二、表设计原则 三、其他设计规范 四、最佳实践 数据库设计(Database Design)是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据&#…...

基于SpringBoot的宠物寄养系统的设计与实现(源码+SQL+LW+部署讲解)
文章目录 摘 要1. 第1章 选题背景及研究意义1.1 选题背景1.2 研究意义1.3 论文结构安排 2. 第2章 相关开发技术2.1 前端技术2.2 后端技术2.3 数据库技术 3. 第3章 可行性及需求分析3.1 可行性分析3.2 系统需求分析 4. 第4章 系统概要设计4.1 系统功能模块设计4.2 数据库设计 5.…...

深度学习中的HTTP:从请求到响应的计算机网络交互
在现代深度学习应用中,HTTP(超文本传输协议)不仅仅是网页浏览的基础协议,它也在机器学习和人工智能的服务架构中扮演着至关重要的角色。本文将深入探讨HTTP在深度学习中的应用,并阐明它如何支持模型的训练、推理及API服…...

Agent系列:AppAgent v2-屏幕智能Agent(详解版)
引言 简介 方法 Agent 框架 Agent 交互 探索阶段 部署阶段 文档生成 高级功能 实验结果 总结 局限性 未来工作 1. 引言 大语言模型(LLM)如 ChatGPT 和 GPT-4 显著提升了自然语言处理能力,并且推动了智能体在自主决策中的应用。…...

艾体宝方案丨全面提升API安全:AccuKnox 接口漏洞预防与修复
一、API 安全:现代企业的必修课 在现代技术生态中,应用程序编程接口(API)扮演着不可或缺的角色。从数据共享到跨平台集成,API 成为连接企业系统与外部服务的桥梁。然而,伴随云计算的普及与微服务架构的流行…...

开源的Vue低代码表单设计器 form-create-designer v3.2.9 版本发布,新增10多种功能
form-create-designer 是一款开源的低代码表单设计器,通过数据驱动表单渲染。可以通过拖拽的方式快速创建表单,提高开发者对表单的开发效率,节省开发者的时间。并广泛应用于在政务系统、OA系统、ERP系统、电商系统、流程管理等领域。 项目采…...

Android Killer 无法调用jd-gui.exe
在Android Killer 时,点击图标转换为java代码时,调用jd-gui.exe 弹窗无法验证发布者,点击运行没反应 第一种方案:开启组策略(网上找的,没有效果) 键盘WinR ,在弹出窗口中输入gped…...