专栏首页Ceph对象存储方案源码解读bucket 删除中的一些细节

源码解读bucket 删除中的一些细节

问题描述

社区群里有人说删除bucket以后还有部分数据残留,用的ceph 10.2.x版本做的验证

测试用例

from boto.s3.connection import S3Connection
import boto

conn = boto.connect_s3(
            aws_access_key_id = '',
            aws_secret_access_key = '',
            host = 's3.cephbook.com',
            port = 80,
            is_secure = False,
            calling_format = boto.s3.connection.OrdinaryCallingFormat(),
            )
bucket = conn.create_bucket('foo')
#bucket.delete()

删除前

root@demohost:/home/user# rados ls -p rgw.root
foo
.bucket.meta.foo:70af9a54-20bb-480b-92f4-cbdeef0b775c.217357.1

删除后

root@demohost:/home/user# rados ls -p rgw.root
.bucket.meta.foo:70af9a54-20bb-480b-92f4-cbdeef0b775c.217357.1 #残留

原因分析

对meta file的删除操作需要根据是否开启了多集群同步来决定

# src/rgw/rgw_rados.cc
    op_ret = store->delete_bucket(s->bucket, ot);#入口
    ....

  /* if the bucket is not synced we can remove the meta file */
  if (!is_syncing_bucket_meta(bucket)) {
    RGWObjVersionTracker objv_tracker;
    string entry = bucket.get_key();
    r= rgw_bucket_instance_remove_entry(this, entry, &objv_tracker);
    if (r < 0) {
      return r;
    }
    /* remove bucket index objects*/
    map<int, string>::const_iterator biter;
    for (biter = bucket_objs.begin(); biter != bucket_objs.end(); ++biter) {
      index_ctx.remove(biter->second);
    }
  }

满足下面4种情况是不会进行meta file的删除操作 当前period不是最新版本 zonegroup为非master zonegroup 当前集群只有单个zonegroup,且只有一个zone 当前zone不是master zone

/**
  * Check to see if the bucket metadata could be synced
  * bucket: the bucket to check
  * Returns false is the bucket is not synced
  */
bool RGWRados::is_syncing_bucket_meta(rgw_bucket& bucket)
{

  /* no current period  */
  if (current_period.get_id().empty()) {
    return false;
  }

  /* zonegroup is not master zonegroup */
  if (!get_zonegroup().is_master) {
    return false;
  }

  /* single zonegroup and a single zone */
  if (current_period.is_single_zonegroup(cct, this) && get_zonegroup().zones.size() == 1) {
    return false;
  }

  /* zone is not master */
  if (get_zonegroup().master_zone.compare(zone_public_config.id) != 0) {
    return false;
  }

  return true;
}

解决方案

  1. rados命令手工删除对应的obj,但是要注意相应的bucket一定是不再需要的,最好是在多个集群上确认最终操作,确保数据一致性。
  2. 修改集群配置,满足上面4点需求之一。

最后非标准操作去删除bucket可能破坏底层数据一致性,起手无悔,一定要慎重。

本文分享自微信公众号 - Ceph对象存储方案(cephbook)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-11-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 理解并自定义HttpHandler

    前言                                      之前从网上找了几篇讲解如何自定义HttpHandler的文章,依葫芦画瓢却一直没...

    ^_^肥仔John
  • .Net 跨平台可移植类库正在进行

    [原文发表地址] Cross-Platform Portable Class Libraries with .NET are Happening [原文发表时间...

    张善友
  • [认证授权] 1.OAuth2授权

    1 OAuth2解决什么问题的? 举个栗子先。小明在QQ空间积攒了多年的照片,想挑选一些照片来打印出来。然后小明在找到一家提供在线打印并且包邮的网站(我们叫它P...

    blackheart
  • 后rtx集成时代

    基本结构:客户端向服务器发送命令(如给目标rtx号码发送提醒、短信、访问组织和用户信息等)。 ? 1.首先要把原生API做一个基础接口封装,将RTXSDK内部的...

    用户1183026
  • JS魔法堂:IE5~9的Drag&Drop API

    一、前言                                  《 HTML5魔法堂:全面理解Drag & Drop API》中提到从IE5开始...

    ^_^肥仔John
  • 游戏开发之UE4添加角色到场景中

    接着上次继续学习,现在我们已经有了一个场景并且运行了,我们需要添加一个角色到场景中。要这样做,我们必须从UE4的GameFramework类继承它。 一. 创建...

    用户1198337
  • 别再设计易碎的Web API

    原文作者Mathieu Fenniak在博文中大呼:不要再设计易碎的Web API 了,否则你的合作伙伴或第三方开发者会因此恨你,而离你远去的。他认为,想设计出...

    张善友
  • java 邮件发送

    步骤1:pom.xml添加依赖项 1 <!--mail--> 2 3 <dependency> 4 ...

    菩提树下的杨过
  • 在链接前面自动添加favicon 图标(jquery)

    相信你在一些网站上看过类似的东东,就是在一个可点击外链左侧,会有一个目标链接网站的favicon 图标。这一个小小的设置可能对提升用户体验有不少帮助,一些Wor...

    Jeff
  • 弹出式模态窗体选择文本控件

    2006年就要到来了,最近比较忙,很少更新blog,今天发一个模态窗体选择文本控件辞旧迎新.新年在发几个asp.net2.0 webPart控件同各位分享: ...

    张善友

扫码关注云+社区

领取腾讯云代金券