bucket删除中的细节有哪些

发布时间:2021-12-23 18:33:59 作者:柒染
来源:亿速云 阅读:150

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可能破坏底层数据一致性,起手无悔,一定要慎重。

看完上述内容,你们掌握bucket删除中的细节有哪些的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

推荐阅读:
  1. Javascript中需要注意的细节有哪些
  2. Dedecms中的安全细节有哪些

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

bucket

上一篇:zookeeper的web图形界面是怎样的

下一篇:linux中如何删除用户组

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》