Ceph Peering以及数据均衡的改进思路

article/2025/9/17 8:26:34

前言

从15年3月接触Ceph分布式存储系统,至今已经5年了;因为工作的需要,对Ceph的主要模块进行了较深入的学习,也在Ceph代码层面做了些许改进,以满足业务需要(我们主要使用M版本)。最近得闲,将过往的一些改进以及优化思路记录下了,希望能对后来者有所帮助。

之前有分享过RBD持久化缓存以及卷QoS,感兴趣的读者可以翻阅前文

这是第一篇:Ceph Peering以及数据均衡的改进

背景知识

在Ceph集群的Crushmap发生变化后(比如:扩容,缩容等操作),Ceph为保证各OSD数据的均衡以及
满足数据副本要求会在各OSD间执行数据均衡:

  1. Peering阶段:在数据均衡前,主OSD发起Peering(可以理解为主备副本OSD握手协商),选出权威OSD(拥有最新PG Log的OSD)以及计算出各OSD之间的差异数据,准备好Missing列表,为后续的数据复制做准备。为了保证,获取的差异数据的一致性,该阶段不允许写, Ceph以PG为粒度执行Peering
  2. Recovery/Backfill阶段:根据第一阶段中的Missing列表,各OSD通过Push(主OSD发送数据给备OSD)/Pull(主OSD从备OSD拉取数据)数据完成本地数据的修复。 该阶段允许读写,进行以对象为单位的跨网络数据复制,虽然提供了一些控制参数,但还是会消耗大量的磁盘和网络资源

优化思路

  1. 针对Peering阶段:
    1.1 分批同步,延迟非主OSD的同步.
    默认情况下,PG的主OSD只要确认副本OSD无法连通,就会发起Peering,而各个OSD独立发起Peeering请求,并不会有任何的协商。所以,在出现故障后,会发现大量的PG进入Peering状态。比如:三副本的集群,一个OSD中有300个PG,如果OSD发生离线或者上线,那么这300PG会同时发起Peering,根据CrushMap的(基本)均衡分配策略,实际上需要立即进行Peering的PG只有1/3,剩余的2/3可以延迟进行,那么我们可以通过分批同步,减少同时进行Peering的PG数量来缓解IO被Block的问题。

我们知道与数据恢复相关的PG主要状态为:Init->Reset->Started(包含Start子状态),在Start状态下,如果是主OSD,则进入Primary状态并发起Peering;如果是副本OSD,则进入Stray状态。下面是默认情况下,PG状态转换的一个简图:
在这里插入图片描述
我们在原状态图中添加子状态DeferPeering和RepDeferPeering,将部分Peering请求添加到延迟队列中,分批或者有IO落到相应的PG上,再发起Peering。下面是修改后的PG状态图:
在这里插入图片描述
2. 针对Recovery/Backfill阶段:
2.1 利用PG Log中的dirty extent进行增量恢复
默认情况下,Recovery/Backfill以对象为单位进行读取->传输->写入的恢复过程。在RBD场景下,通常一个对象为4MB,也就是说:不管对象中的脏数据是多大,都需要复制整个对象,在随机io场景下,数据的放大是很严重的,比如:一个对象只有4k的数据发生了更改,却要复制4MB的对象,放大了1024倍。

我们知道Recovery是借助PG Log来识别各副本之间数据的差异的,如果我们能够在PG Log中记录写IO的操作区间<offset, len>,那么就可以实现增量复制,PG Log Entry修改前后示例:
Old:

opobjeverison
M“abc”5.13

New:

opobjeversiondirty_extents
M“abc”5.13<off, len>

有了dirty_extents, 我们就可以通过打包dirty_extents指向的内容进行数据恢复,而不需要复制整个对象。

Tips:对于Truncate(可能扩大也可能缩小卷),快照的COW操作(由于故障情况下,数据恢复次序的原因)操作应该采用默认的方式恢复。

2.2 通过限流来控制数据复制流量
默认情况下,Ceph定义了一些参数来控制Recovery/Backfill的并发度,但实际测试下来,效果并不理想。为此,我们可以通过限流来控制数据复制的速度,比如:基于Leeky Bucket的QoS,更精细些,还可以根据OSD当前繁忙度来动态调节QoS的值,实现动态适配。

Tips: M版本中,Ceph将所有类型的IO请求都放入到了相同的shardedwq队列中,添加流量控制机制,最好将Recovery/Backfill相关的请求,如:PUSH/PULL请求抽取出来放到独立的队列,由独立的线程(池)来处理,会有更好的性能表现。

通过上述改进,数据平衡对业务的影响可以控制在30%以内。

本文只提供可行的实现思路,不提供实现细节,如有不清楚的地方,可以给我留言。


http://chatgpt.dhexx.cn/article/8FEoDOvr.shtml

相关文章

AWS VPC Peering Azure VNET Peering

前提条件&#xff1a; IP 地址不能有冲突 Global 不能和 中国区VNET Peering Azure VNET Peering 首先创建两个VNET: vnet01 vnet02 创建Peering Connection b. c. 选择VNET Peering 配置项 add 即可 AWS VPC Peering 创建两个VPC 创建Peering Connection a. b. c. 创建即可…

VPC对等连接(VPC Peering)

VPC对等连接&#xff08;VPC Peering&#xff09;是两个VPC之间的连接&#xff0c;通过VPC Peering&#xff0c;你可以使用私有地址让两个VPC之间相互通信&#xff0c;就像它们在同一个VPC内一样。 你可以在自己的两个VPC之间建立对等连接&#xff0c;也可以在自己的VPC与其他…

ceph peering流程分析

数据结构 pg_interval_t{vector<int32_t> up, acting;//当前pg_interval的up和acting的osd列表 epoch_t first, last;//该interval的起始和结束epoch bool maybe_went_rw;//在这个阶段是否可能有数据读写 int32_t primary;//主osd int32_t up_primary;//up状态的…

ceph存储 PG的状态机和peering过程

&#xfeff;&#xfeff; PG 的状态机和peering过程 首先来解释下什么是pg peering过程&#xff1f; 当最初建立PG之后&#xff0c;那么需要同步这个pg上所有osd中的pg状态。在这个同步状态的过程叫做peering过程。同样当启动osd的时候&#xff0c;这个osd上所有的pg都要进行…

你所不知道的BGP知识,Peering 和IP-Transit.

了解网络的同行都知道BGP又称“边界网关协议”&#xff0c;他的英文全称是“border gateway protocol”&#xff0c;业内简称“BGP”&#xff0c;他是应用在TCP上的一种路由协议&#xff0c;它的主要功能是为了实现自治系统间的路由选择功能&#xff0c;通俗来讲就是通过控制路…

AWS攻略——Peering连接VPC

文章目录 创建IP/CIDR不覆盖的VPC创建VPC创建子网创建密钥对创建EC2 创建Peering接受Peering邀请修改各个VPC的路由表修改美东us-east-1 pulic subnet的路由修改悉尼ap-southeast-2路由 测试知识点 我们回顾下《AWS攻略——VPC初识》中的知识&#xff1a; 一个VPC只能设置在一…

蒙特卡洛法(Monte Carlo)电动汽车负荷预测matlab程序设计

电动汽车充电负荷的时间分布预测 规模化电动汽车充电负荷在未来某一天随时间特性的分布规律是研究电动汽车发展对配 电网影响以及充电站选址定容问题的前提与基础。电动汽车充电负荷的分布情况与车主的行 为特征有关&#xff0c;不同类型的电动汽车车主出行规律以及充电习惯不…

蒙特卡洛法(三)马尔科夫链蒙特卡洛法

马尔科夫链蒙特卡洛法适合于随机变量是多元的、密度函数是非标准形式的随机变量各分量不独立的情况。如何构建具体的马尔科夫链是这个方法的关键&#xff0c;离散变量的时候&#xff0c;需要定义转移矩阵&#xff0c;构建可逆马尔科夫链&#xff0c;保证遍历定理成立。常用的马…

蒙特卡洛法简述

蒙特卡洛法简述 一.简介&#xff1a; 1.蒙特卡洛方法又称随机模拟法&#xff0c;随机抽样技术&#xff0c;是一种随机模拟方法。 蒙特卡洛法使用随机数&#xff08;伪随机数&#xff09;以概率和统计理论方法为基础&#xff0c;将所要求解的问题同一定的概率模型相互联系&am…

蒙特卡洛法模拟计算圆周率π

一、蒙特卡洛法介绍 蒙特卡罗方法&#xff08;Monte Carlo method&#xff09;&#xff0c;也称统计模拟方法&#xff0c;是一种以概率统计理论为基础的数值计算方法&#xff0c;常用于特定条件下的概率计算问题。蒙特卡罗是摩纳哥的著名赌城&#xff0c;该法为表明其随机抽样的…

蒙特卡洛法之MATLAB实现

by WC 1.7.2016蒙特卡洛法&#xff08;随机取样法&#xff09;也称为计算机随机模拟方法&#xff0c;它源于世界著名的赌城——Monte Carlo。它是基于对大量事件的统计结果来实现一些确定性问题的计算。使用蒙特卡洛法必须使用计算机生成相关分布的随机数。 eg&#xff1a; y…

C语言文件打开关闭和读写

文件在进行读写操作之前要先打开&#xff0c;使用完毕要关闭。在C语言中&#xff0c;文件操作都是由库函数来完成的。在本节内将介绍主要的文件操作函数。 文件的打开(fopen函数) fopen函数用来打开一个文件&#xff0c;其调用的一般形式为&#xff1a; 文件指针名 fopen( 文…

C语言文件详解(一)文件介绍,文件打开和关闭

文章目录 一、文件介绍1.1为什么使用文件1.2什么是文件1.3文件名 二、文件的打开和关闭2.1文件指针2.2文件的打开和关闭 一、文件介绍 1.1为什么使用文件 文件属于文件的一种&#xff0c;与普通文件载体不同&#xff0c;文件是以硬盘为载体存储在计算机上的信息集合。那么为什…

C语言fopen打开文件失败了,原来是这个原因~~~~

大家好&#xff0c;我是疯狂的比特&#xff0c;一个每天在互联网上种菜和砍柴的程序员 今天给大家分享一个C语言初学者常见的一个问题。 问题 经常有人问我&#xff0c;我的C语言代码好好的&#xff0c;怎么就打开文件失败了呢&#xff1f; 我们先来看看代码吧 #include <s…

【C】C语言打开,读取文件

文章目录 C语言打开&#xff0c;读取文件一、明明白白我的心二、代码飞起来三、过程不重要&#xff0c;重点看结果 C语言打开&#xff0c;读取文件 一、明明白白我的心 1、gcc编译C语言代码 2、winds10操作系统 3、VS Code编辑器(强推&#xff0c;最近博主用这个…

C语言<文件的打开与关闭>

目录 一.为什么使用文件 二.什么是文件 1.程序文件 2.数据文件 3.文件名 三.文件的打开与关闭 1.文件指针 2.文件的打开与关闭 结语 一.为什么使用文件 我们前面学习结构体时&#xff0c;写了通讯录的程序&#xff0c;当通讯录运行起来的时候&#xff0c;可以给通讯录…

C语言文件打开方式

使用文件的方式共有12种&#xff0c;下面给出了它们的符号和意义。 文件打开方式 意义 rt 只读打开一个文本文件&#xff0c;只允许读数据 wt 只写打开或建立一个文本文件&#xff0c;只允许写数据 at 追加打开一个文本文件&#xff0c;并在文件末尾写数据 rb 只…

C语言————文件的打开(知识点总结+举例)

fopen函数用来打开一个文件&#xff0c;其调用的一般形式为&#xff1a; 文件指针名fopen(文件名,使用文件方式); 其中&#xff1a; “文件指针名”必须是被说明为FILE 类型的指针变量&#xff1b; “文件名”是被打开文件的文件名&#xff1b; “使用文件方式”是指文件的类型…

【C语言】文件的打开和关闭,文件的顺序读写

文章目录 1、为什么使用文件 2、什么是文件 3、文件的打开和关闭 文件的打开 文件的关闭 4、文件的顺序读写 4.1文件读写的特点 4.2fputc、fgetc函数 4.3fgets、fputs函数 4.4fscanf、fprintf函数 5、标准输入输出流stdin、stdout 1、为什么使用文件 在编写例如通讯…

C语言-文件操作

当程序的生命周期结束&#xff0c;在内存中存放的数据就会随着内存的释放而清除&#xff0c;这并不满足我们日常生活中的记录需求&#xff0c;所以C语言开发了文件操作模式&#xff0c;通过将数据存放在硬盘&#xff0c;数据库等方式&#xff0c;实现数据的持久化。 文件存在于…