千家信息网

bucket删除中的细节有哪些

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,bucket删除中的细节有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。问题描述社区群里有人说删除bucket以后还有部分数据残留,
千家信息网最后更新 2025年01月23日bucket删除中的细节有哪些

bucket删除中的细节有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

问题描述

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

测试用例

from boto.s3.connection import S3Connectionimport botoconn = 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.rootfoo.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::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删除中的细节有哪些的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

0