前言

在很久以前在研究一套文件系统的时候,当时发现一个比较奇怪的现象,没有文件存在,磁盘容量还在增加,在研究了一段时间后,发现这里面有一种比较奇特的处理逻辑

这套文件系统在处理一个文件的时候放入的是一个临时目录,最开始在发送第一个写请求后,在操作系统层面马上进行了一个delete操作,而写还在继续,并且需要处理这个数据的进程一直占着的,一旦使用完这个文件,不需要做处理,这个文件就会自动释放掉,而无需担心临时文件占用空间的问题

在Ceph集群当中,有人碰到了去后台的OSD直接rm一个对象后,在前端通过rados还能get到这个删除的对象,而不能rados ls到,我猜测就是这个原因,我们来看下怎么验证这个问题

验证步骤

准备测试数据,并且put进去集群

[root@lab8106 ~]# cat zp1
sdasdasd
[root@lab8106 ~]# rados -p rbd put zp1 zp1
[root@lab8106 ~]# rados -p rbd ls
zp1

找到测试数据并且直接 rm 删除

[root@lab8106 ~]# ceph osd map rbd zp1
osdmap e90 pool 'rbd' (3) object 'zp1' -> pg 3.43eb7bdb (3.1b) -> up ([0], p0) acting ([0], p0)
[root@lab8106 ~]# ll /var/lib/ceph/osd/ceph-0/current/3.1b_head/DIR_B/DIR_D/zp1__head_43EB7BDB__3
-rw-r--r-- 1 ceph ceph 9 Apr 19 14:46 /var/lib/ceph/osd/ceph-0/current/3.1b_head/DIR_B/DIR_D/zp1__head_43EB7BDB__3
[root@lab8106 ~]# rm -rf /var/lib/ceph/osd/ceph-0/current/3.1b_head/DIR_B/DIR_D/zp1__head_43EB7BDB__3

尝试查询数据,get数据

[root@lab8106 tmp]# rados  -p rbd ls
[root@lab8106 tmp]# rados -p rbd get zp1 zp1
[root@lab8106 tmp]# cat zp1
sdasdasd

可以看到数据确实可以查询不到,但是能get下来,并且数据是完整的

验证我的猜测

[root@lab8106 tmp]# lsof |grep zp1
ms_pipe_w 4737 5620 ceph 86u REG 8,33 9 201496748 /var/lib/ceph/osd/ceph-0/current/3.1b_head/DIR_B/DIR_D/zp1__head_43EB7BDB__3 (deleted)
···

可以看到这个标记为delete的对象就是我们删除的zp1,这个输出的意思是,进程4737上面删除了一个文件,文件描述符为86的

我们直接去拷贝下这个数据看下

[root@lab8106 tmp]# cp  /proc/4737/fd/86 /tmp/zp_save
[root@lab8106 tmp]# cat /tmp/zp_save
sdasdasd

可以看到这个数据确实是存在的,还没有释放,所有可以get的到

我们试下重启下这个进程,看下delete的文件是不是会释放

[root@lab8106 tmp]# systemctl restart ceph-osd@0
[root@lab8106 tmp]# lsof |grep zp1

可以看到已经没有这个delete了,现在我们尝试下get

[root@lab8106 tmp]# rados  -p rbd get zp1 zp1
error getting rbd/zp1: (2) No such file or directory

可以看到文件释放掉了,问题确实跟我猜测的是一致的,当然这并不是什么问题

总结

本篇是对删除了的对象还能get的现象进行了解释

变更记录

Why Who When
创建 武汉-运维-磨渣 2017-04-19

为什么删除的Ceph对象还能get的更多相关文章

  1. 腾讯云存储专家深度解读基于Ceph对象存储的混合云机制

    背景 毫无疑问,乘着云计算发展的东风,Ceph已经是当今最火热的软件定义存储开源项目.如下图所示,它在同一底层平台之上可以对外提供三种存储接口,分别是文件存储.对象存储以及块存储,本文主要关注的是对象 ...

  2. CEPH 对象存储的系统池介绍

    RGW抽象来看就是基于rados集群之上的一个rados-client实例. Object和pool简述 Rados集群网上介绍的文章很多,这里就不一一叙述,主要要说明的是object和pool.在r ...

  3. ceph对象存储RADOSGW安装与使用

    本文章ceph版本为luminous,操作系统为centos7.7,ceph安装部署方法可以参考本人其他文章. [root@ceph1 ceph-install]# ceph -v ceph vers ...

  4. Ceph对象存储 S3

    ceph对象存储 作为文件系统的磁盘,操作系统不能直接访问对象存储.相反,它只能通过应用程序级别的API访问.ceph是一种分布式对象存储系统,通过ceph对象网关提供对象存储接口,也称为RADOS网 ...

  5. php删除多重数组对象属性,重新赋值的方法

    php删除多重数组对象属性,重新赋值的方法 实例:sphinx搜索出来的结果,要去掉某个属性值:$cl = new SphinxClient ();$query = $cl->Query ( $ ...

  6. Ceph对象存储网关中的索引工作原理<转>

    Ceph 对象存储网关允许你通过 Swift 及 S3 API 访问 Ceph .它将这些 API 请求转化为 librados 请求.Librados 是一个非常出色的对象存储(库)但是它无法高效的 ...

  7. 006.Ceph对象存储基础使用

    一 Ceph文件系统 1.1 概述 Ceph 对象网关是一个构建在 librados 之上的对象存储接口,它为应用程序访问Ceph 存储集群提供了一个 RESTful 风格的网关 . Ceph 对象存 ...

  8. json 删除、添加对象

    1. 定义json对象    var entryJson = []; 2. 删除.添加对象 entryJson.pop();     //删除最后一个对象   entryJson.push({ //往 ...

  9. Context对象还提供了相应的属性来调整线条及填充风格

    创建一个Canvas画布的方法如下: 复制代码 代码如下: <canvas id=”canvas” width=”600” height=”400”></canvas> 可以在 ...

随机推荐

  1. 适合刚刚学习编程的萌新:C语言编程学习制作超简单又好玩的报数游戏!

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  2. 35岁的程序员正在消失?No,我认识了一个50岁的程序员!

    35岁的话题真是无穷无尽.一开始的时候,以为只有社交媒体上会有这种问题的讨论,没想到,公司内部的论坛上也有不少这类的文章.大家各有各的说法,但终究也没有找到银弹似的解决方案. 这段时间,倒是接触了一个 ...

  3. 《Kafka笔记》1、Kafka初识

    目录 一.初识Kafka 1 apache kafka简介 2 消息中间件kafka的使用场景 2.1 订阅与发布队列 2.2 流处理 3 kafka对数据的管理形式 4 kafka基础架构 5 Ka ...

  4. Hive LLAP

    body { margin: 0 auto; font: 13px / 1 Helvetica, Arial, sans-serif; color: rgba(68, 68, 68, 1); padd ...

  5. 前端在开发过程中怎么提高网站的seo?

    前端开发过程中怎么提高网站的seo? 到写这篇博客为止,我还没有做过需要做seo的项目,也不知道怎么前后端合作(我才毕业工作一年左右,往后会多去学习这方面知识的),通过一些配置来提高网站的seo性能. ...

  6. 【应用服务 App Service】App Service证书导入,使用Key Vault中的证书

    问题描述 正常情况下,如果需要为应用服务安装SSL证书,可以在证书准备好的情况,通过门户上传即可,详细步骤可以参考微软官方文档(在 Azure 应用服务中添加 TLS/SSL 证书:https://d ...

  7. Python+Post请求中涉及到多个参数data方法的应用

    进行post请求,Python提供了httplib.urllib2,同时也可以引用requests模块的一些方法.前几天做持续集成,运用requests写了一个post请求.代码如下: import ...

  8. python基础三:函数

    def name(参数1,参数2,参数3,...) 可以自定义一些自己需要的函数来简化自己的工作. 如:自定义一个计算函数 def  mycount(a,b,c): y=a+b-c return y ...

  9. mysql报错10061和10038

    用navicat连接报错10038,用sqlyog报错10061,又去查看服务,发现服务丢失 经过一系列的查阅资料,用下面的方式解决了问题 1.用管理员的方式打开命令行窗口 2.进入mysql的bin ...

  10. java中常见的六种线程池详解

    之前我们介绍了线程池的四种拒绝策略,了解了线程池参数的含义,那么今天我们来聊聊Java 中常见的几种线程池,以及在jdk7 加入的 ForkJoin 新型线程池 首先我们列出Java 中的六种线程池如 ...