Ceph蹚坑笔记 - (3)

Ceph对象存储的Amazon S3接口的使用(重点介绍分片上传接口)(基于nautilus版本) 本文介绍了Ceph对象存储的Amazon S3接口的使用,特别是分片上传接口。希望对大家有所帮助。 阅读详情

Ceph蹚坑笔记 - (3)

分片上传中的数据丢失问题

该问题的发生过程如下
1. InitMultipart发起一次分片上传,获得相应的Upload ID
2. 逐片上传数据
3. 发出CompleteMultipart请求,但请求超时(客户端设置30秒超时)
4. 再次用相同Upload ID重试CompleteMultipart请求,返回成功
5. 下载对象以确认上传成功
6. 两小时后再次下载该对象,收到HTTP 404错误
该问题的原因是:步骤3和步骤4的操作由于线程调度的原因几乎同时被RGW执行,结果步骤4把步骤2上传的分片进行逻辑删除,即放入GC列表(发生在RGWRados::Object::complete_atomic_modification()),两个小时后GC线程对这些分片进行物理删除。
一个RGW对象所对应的分片存放在其head对象的manifest的结构中。为了处理数据覆盖的情况,RGWRados::Object::complete_atomic_modification()会把旧的manifest取出来,把里面列出的分片全部逻辑删掉,然后在把manifest指向新的分片。当步骤3调用完RGWRados::Object::complete_atomic_modification()之后,步骤4立即调用RGWRados::Object::complete_atomic_modification()。所以,在步骤4看来老的manifest和新的manifest都指向相同的分片。但按照固有的逻辑,步骤4的RGWRados::Object::complete_atomic_modification()却把老的manifest中所记录的分片逻辑删除了,实际上就是把自己的分片逻辑删除了。
当然步骤4不是每次都能重现的,因为如果步骤4执行得太晚的话,Upload ID已经被步骤3标记为失效,那么RGW会直接拒绝掉步骤4的请求,从而不会触发竞争条件。
从客户端角度,最好能为CompleteMultipart设置较长的超时时间,以免短促的重试会破坏数据。
从RGW这一侧,可做的改进是在RGWRados::Object::complete_atomic_modification()检查新旧manifest是否指向相同的分片。如果发现这种情况,就应当跳过删除分片的步骤。

分片上传中的存储空间泄漏问题

在使用某Upload ID上传了某个对象的若干分片之后,但在执行CompleteMultipart之前,用户可以使用同一Upload ID再次上传已经上传过的的任何一个分片。这样的操作会有可能导致存储空间的泄漏。

这里,以8MB为一个分片大小,上传10MB文件的第一个分片。RGW将其切成两个4MB的对象,存入RGW所配置的Pool里。2~4KTKIzu7uYPV2xapDruHK8t_mXf0Kh0是Upload ID,紧跟其后的.1表示第一个分片

[root@ceph-dev ~]# rados -p .za.rgw.buckets ls 2>/dev/null
za.196717.1__shadow_10MB.bin.a.2~4KTKIzu7uYPV2xapDruHK8t_mXf0Kh0.1_1
za.196717.1__multipart_10MB.bin.a.2~4KTKIzu7uYPV2xapDruHK8t_mXf0Kh0.1

再次上传第一个分片。此时,可以看到za.196717.1__multipart_10MB.bin.a.2~4KTKIzu7uYPV2xapDruHK8t_mXf0Kh0.1消失,出现了包含jcnZC7Qg-Bb1j-xQpB_gviDe63x7uay的对象名。这是因为RGWPutObj::execute()会判断put_data_and_throttle()的返回值,如果是-EEXIST,就会做出上述动作。就是说,如果一个分片被第二次上传时,put_data_and_throttle()会发现第一次上传的za.196717.1__multipart_10MB.bin.a.2~4KTKIzu7uYPV2xapDruHK8t_mXf0Kh0.1已经存在,返回-EEXIST错误。这时,RGWPutObj::execute()会把za.196717.1__multipart_10MB.bin.a.2~4KTKIzu7uYPV2xapDruHK8t_mXf0Kh0.1删掉,再生成一个随机字符串jcnZC7Qg-Bb1j-xQpB_gviDe63x7uay,然后用这个字符串代替Upload ID,以za.196717.1__multipart_10MB.bin.a.jcnZC7Qg-Bb1j-xQpB_gviDe63x7uay.1和za.196717.1__shadow_10MB.bin.a.jcnZC7Qg-Bb1j-xQpB_gviDe63x7uay.1_1为对象名向Pool里写入数据。但显然,这里忘记删除za.196717.1__shadow_10MB.bin.a.2~4KTKIzu7uYPV2xapDruHK8t_mXf0Kh0.1_1了。

[root@ceph-dev ~]# rados -p .za.rgw.buckets ls 2>/dev/null
za.196717.1__shadow_10MB.bin.a.2~4KTKIzu7uYPV2xapDruHK8t_mXf0Kh0.1_1
za.196717.1__shadow_10MB.bin.a.jcnZC7Qg-Bb1j-xQpB_gviDe63x7uay.1_1
za.196717.1__multipart_10MB.bin.a.jcnZC7Qg-Bb1j-xQpB_gviDe63x7uay.1

第3次上传第一个分片。此时,由于za.196717.1__multipart_10MB.bin.a.2~4KTKIzu7uYPV2xapDruHK8t_mXf0Kh0.1不存在了,所以put_data_and_throttle()成功写入,那么它的行为和第1次上传时是一样的。但是,第二次上传的za.196717.1__shadow_10MB.bin.a.jcnZC7Qg-Bb1j-xQpB_gviDe63x7uay.1_1和za.196717.1__multipart_10MB.bin.a.jcnZC7Qg-Bb1j-xQpB_gviDe63x7uay.1残留下来了。

[root@ceph-dev ~]# rados -p .za.rgw.buckets ls 2>/dev/null
za.196717.1__shadow_10MB.bin.a.2~4KTKIzu7uYPV2xapDruHK8t_mXf0Kh0.1_1
za.196717.1__shadow_10MB.bin.a.jcnZC7Qg-Bb1j-xQpB_gviDe63x7uay.1_1
za.196717.1__multipart_10MB.bin.a.2~4KTKIzu7uYPV2xapDruHK8t_mXf0Kh0.1
za.196717.1__multipart_10MB.bin.a.jcnZC7Qg-Bb1j-xQpB_gviDe63x7uay.1

第4次上传第一个分片。这时,行为与第二次上传一样,za.196717.1__multipart_10MB.bin.a.2~4KTKIzu7uYPV2xapDruHK8t_mXf0Kh0.1被清理掉,但za.196717.1__shadow_10MB.bin.a.2~4KTKIzu7uYPV2xapDruHK8t_mXf0Kh0.1_1残留下来。

[root@ceph-dev ~]# rados -p .za.rgw.buckets ls 2>/dev/null
za.196717.1__multipart_10MB.bin.a.LMfvR4p8TF1JNdiNOkvUwFprauLadFG.1
za.196717.1__shadow_10MB.bin.a.2~4KTKIzu7uYPV2xapDruHK8t_mXf0Kh0.1_1
za.196717.1__shadow_10MB.bin.a.LMfvR4p8TF1JNdiNOkvUwFprauLadFG.1_1
za.196717.1__shadow_10MB.bin.a.jcnZC7Qg-Bb1j-xQpB_gviDe63x7uay.1_1
za.196717.1__multipart_10MB.bin.a.jcnZC7Qg-Bb1j-xQpB_gviDe63x7uay.1

最后,把2~4KTKIzu7uYPV2xapDruHK8t_mXf0Kh0这个Upload ID对应的分片上传Abort掉,但以下文件并没有被清理掉,因而造成了存储泄漏。

[root@ceph-dev ~]# rados -p .za.rgw.buckets ls 2>/dev/null
za.196717.1__shadow_10MB.bin.a.2~4KTKIzu7uYPV2xapDruHK8t_mXf0Kh0.1_1
za.196717.1__shadow_10MB.bin.a.jcnZC7Qg-Bb1j-xQpB_gviDe63x7uay.1_1
za.196717.1__multipart_10MB.bin.a.jcnZC7Qg-Bb1j-xQpB_gviDe63x7uay.1

在新的radosgw-admin中提供了新命令orphans find可以找到这些泄漏的对象。但 orphans find的必须扫描所有的Bucket Index对象里的记录,并列出.za.rgw.buckets中的所有对象,通过两个列表的比较找到没有被Bucket Index中记录的对象,这些对象就是orphans。当存量数据很大时,其时间复杂度和空间复杂度可想而知。
RGW-EEXIST这种情况做这样的特殊处理,可能是为了确保多客户端使用同一Upload ID上传同一分片时,不至于在分片的内部出现数据交叉(比如同一分片的前100字节来自客户端1,接下来的100字节来自客户端2)。但感觉这种功能的用途不太大,有点多余。

Bucket删除操作的存储空间泄漏问题

RGW会拒绝对非空Bucket的删除。但这里的“空”仅是说,对Bucket做List操作时,里面没有对象,并不考虑还未完成的分片上传(还没执行CompleteMultipart)。
创建一个Bucket时,会有一个RGWBucketInfo(对象名是.bucket.meta.前缀拼上Bucket名和ID)和一个RGWBucketEntryPoint(对象名就是Bucket名)创建在domain_root Pool中,一个(不分shard)或多个(分shard)Bucket Index对象创建在index_pool Pool中(对象名是前缀是dir拼上Bucket ID再拼上shard编号)。当删除一个Bucket时,RGW仅是删除那个Bucket的RGWBucketEntryPoint对象(这是0.94的行为,新的版本中也删除RGWBucketInfo对象),至于Bucket Index以及未完成的分片上传的分片数据是不做处理的。这些孤儿分片所占用的存储空间就泄漏掉了。
如上节所述,orphans find可以用很高的时间复杂度和空间复杂度吧这些泄漏的孤儿分片清理掉。
鉴于Bucket Index并未被删除,一种更高效的方法就是把已经被删除的Bucket的Bucket Index对象读取出来(至少目前的RGW实现没有删除Bucket Index对象),从中获取未完成的分片上传的Upload ID列表,然后模拟AbortMultipart功能,将这些孤儿分片清理掉,最后在把这些无用的Bucket Index对象也删除掉。

CEPH radosgw-admin命令大全 user create create a new user user modify modify user user info get user info user rm remove user user suspend s... 阅读详情

相关推荐

【ceph】Ceph之PG状态详解--研读笔记

原文:分布式存储Ceph之PG状态详解 - 简书 1. PG介绍 继上次分享的《Ceph介绍及原理架构分享》,这次主要来分享Ceph中的PG各种状态详解,PG是最复杂和难于理解的概念之一,PG的复杂如下: 在架构层次上,PG位于RADOS层的中间。 a. 往上负责接收和处理来自客户端的请求。 b. 往下负责将这些数据请求翻译为能够被本地对象存储所能理解的事务。 是组成存储池的基本单位,存储池中的很多特性,都是直接依托于PG实现的。 面向容灾域的备份策略使得一般而言的PG需要执行跨节点的分布式写

我的笔记本 1万+

说一下我安装ceph中遇到Error的解决办法

注意:仅供参考,这里是我解决成功的错误,下面的ceph2是我的用户名,官网上说不能用ceph当用户名。 1、Error:软件包与预期下载的不符。建议:运行 yum --enablerepo=centos-ceph-hammer clean metadata。当这种错误出现时,解决办法有两个:       重启机器,reboot。       换一个下载源,目标文件/etc/yum.repos...

m0_37907130的博客 2万+

基于 ceph-deploy 部署 Ceph 集群 超详细

ceph概述和ceph集群部署

这是博客的简介的简介 5847

对象网关的用户使用情况

Ceph 对象网关会记录每个用户的使用情况。 也可以在日期范围内跟踪用户使用情况。 选项包括: 开始日期:–start-date 选项允许从特定开始日期过滤使用统计信息(格式:yyyy-mm-dd[HH:MM:SS])。 结束日期:–end-date 选项允许过滤特定日期之前的使用情况(格式:yyyy-mm-dd[HH:MM:SS])。 日志条目:–show-log-entries 选项允许指定是否在使用统计信息中包含日志条目(选项:true | false)。 可以用分钟和秒指定时间,但它以 1 小时

HHFQ的博客 426

基于ceph-deploy部署Ceph 集群

基于ceph-deploy部署Ceph 集群

m0_71593537的博客 1911

用ceph-deploy安装ceph并部署集群

部署安装关于安装ceph整个过程中遇到的问题,以及靠谱的解决办法,个人亲测有效,不代表广大同行的观点。 我用的是服务器,所以没搞什么用户的问题。机器是centOS7.3。我安装的ceph版本是jewel,目前只用了3个节点。 节点IP 命名 角色 10.0.1.92 e1092 mon 10.0.1.93 e1093 mon,osd 10.0.1.94

Erdong_up的博客 1万+

Ceph蹚坑笔记 - (2)

Ceph RGW里的一些坑

JeegnChen的博客 4121

Ceph-deploy搭建ceph集群

Ceph可用于为云平台提供Ceph对象存储、块存储、文件系统存储。所有Ceph存储集群部署都从设置每个Ceph节点开始,然后设置网络块存储RedismasterslavezookeeperMysqlmasterslavecephFS对象存储Ceph存储集群需要以下内容:至少一个和至少一个,以及至少与Ceph集群中存储的给定对象的副本一样多的Ceph对象存储守护进程(OSD)(例如,如果给定对象的三个副本存储在Ceph集群中,则该Ceph集群中必须至少存在三个OSD)

qq_31055683的博客 1925

Ceph蹚坑笔记 - (1)

关于ceph osd rm的行为初探

JeegnChen的博客 2750

【Ceph】基于ceph-deploy部署Ceph集群详解

我们相恋的季节,从夏天到冬天,记忆一页页翻阅,你却留下了思念。

陌上花开,静待绽放! 1413

Ceph入门到精通-S3分片上传

按chunksize分割。

隔壁老瓦的专栏 965

Ceph蹚坑笔记 - (4)

使用radosgw-agent过程中见到的一些问题

JeegnChen的博客 1345

Ceph:关于Ceph 集群如何访问的一些笔记(3)

对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》

山河已无恙 1703

【Ceph】Ceph介绍、原理、架构

Ceph技术栈/学习图谱

我的笔记本 1万+

ceph搭建及使用详解

第1章 ceph介绍 1.1 Ceph的主要特点 统一存储 无任何单点故障 数据多份冗余 存储容量可扩展 自动容错及故障自愈 1.2 Ceph三大角色组件及其作用 在Ceph存储集群中,包含了三大角色组件,他们在Ceph存储集群中表现为3个守护进程,分别是Ceph OSD、Monitor、MDS。当然还有其他的功能组件,但是最主要的是这三个。 Ceph OSD Ceph的OSD(Object Storage Device)守护进程。主要功能包括:存储数据、副本数据处理、数据恢复、数据回补、平衡数据分布,并将

weixin_40548182的博客 1万+

深入SVT SPI VIP配置:如何灵活控制CS间隔、数据帧大小与时钟频率(含代码片段)

本文深入探讨了SVT SPI VIP的高级配置技巧,包括精确控制CS信号间隔、突破数据帧大小限制以及动态时钟频率切换。通过实战代码片段和详细配置步骤,帮助验证工程师灵活应对复杂SPI协议验证场景,提升验证效率和覆盖率。特别适合需要处理非标准SPI时序和特殊数据帧的芯片验证项目。

weixin_27014595的博客 280

Ceph学习

Ceph学习

行走的皮卡丘 5672

Windows 10错误代码解析与系统故障排除指南

操作系统错误代码是系统运行状态的直接反馈,Windows系统通过特定编码机制将故障信息转化为可识别的错误代码。从技术原理看,这些代码通常对应特定的异常处理流程,包括内存管理、驱动兼容性、文件系统等核心模块。理解错误代码对于系统维护具有重要价值,能快速定位问题根源,提高故障排除效率。在实际应用场景中,蓝屏错误(如0x0000007B)、系统升级失败(如0x80070002)和启动故障是最常见的三类问题。通过分析dump文件、使用WinDbg工具和系统内置诊断功能,可以有效解决大部分系统异常。特别是对于蓝屏错误

weixin_30516429的博客 298

Ceph集群部署(基于ceph-deploy)

一个集群自动化部署工具,使用较久,成熟稳定,被很多自动化工具所集成,可用于生产部署。3.admin管理节点配置ssh免密登录node节点。部署Ceph实验(基于ceph-deploy)2.安装ceph-deploy部署工具。10.解决HEALTH_WARN问题。7.使其它节点可以管理Ceph群集。1.创建一个Ceph工作目录。6.配置Ceph yum源。3.手动安装Ceph软件包。部署Ceph集群的方法。部署Ceph集群的方法。8.部署osd存储节点。Ceph生产环境推荐。三、部署Ceph集群。

2401_83784772的博客 4579

新手必看:如何用T265和ROS实现无人机室内精准定位(附PX4参数配置)

本文详细介绍了如何使用Intel Realsense T265和ROS实现无人机室内精准定位,包括硬件准备、ROS数据流架构设计、PX4参数配置及系统验证。特别针对视觉SLAM技术在室内环境中的应用,提供了从零搭建到进阶优化的全流程解析,适合无人机开发新手快速上手。

weixin_30642561的博客 404

WPS和Excel通用!省市区四级联动下拉菜单保姆级教程(附最新行政区划数据包)

本文详细介绍了在WPS和Excel中实现省市区四级联动下拉菜单的完整教程,包含2024年最新行政区划数据的获取与整理方法。通过名称管理器和INDIRECT函数的组合,以及WPS的特色功能,帮助用户高效准确地录入四级行政区划信息,提升数据录入效率并减少错误。

s1t2u3的博客 611

ceph+s3安装手记

参考资料: https://www.cnblogs.com/ytc6/p/7388654.html http://docs.ceph.com/docs/kraken/start/ https://blog.youkuaiyun.com/changtao381/article/details/48015623 https://blog.youkuaiyun.com/litianze99/article/detail...

白乔专栏 4775

当几何失效时:3D激光SLAM退化场景的本质与应对策略

本文探讨了3D激光SLAM在退化场景(如长廊、隧道等)中的挑战与解决方案。文章从数学角度分析了退化原因,指出信息矩阵秩亏导致某些方向约束缺失。主流算法采用不同策略应对:LeGO-LOAM利用地面约束与解耦优化;LIO-SAM/LVI-SAM通过多传感器融合补偿;FAST-LIO系列依赖IMU短期积分。新兴的RID-LIO方案创新性地利用激光强度信息增强约束,实验显示精度提升63.59%。研究表明,针对不同退化方向需要采用特异性补偿策略,而挖掘现有传感器的潜在信息维度是提升鲁棒性的有效途径。

Studying…… 617
上一篇: Ceph蹚坑笔记 - (2)
下一篇: Ceph蹚坑笔记 - (4)
静夜恒辰
博客等级 码龄12年 8粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值