源码解读bucket 删除中的一些细节
时间:2022-04-25
本文章向大家介绍源码解读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;
}
解决方案
- rados命令手工删除对应的obj,但是要注意相应的bucket一定是不再需要的,最好是在多个集群上确认最终操作,确保数据一致性。
- 修改集群配置,满足上面4点需求之一。
最后非标准操作去删除bucket可能破坏底层数据一致性,起手无悔,一定要慎重。
- .NET跨平台之旅:将示例站点从 ASP.NET 5 RC1 升级至 ASP.NET Core 1.0
- .NET跨平台之旅:在Linux上以本地机器码(native)运行ASP.NET Core站点
- 【干货】基于pytorch的CNN、LSTM神经网络模型调参小结
- jenkins配置.net mvc网站
- 简述【聚类算法】
- word2vec理论与实践
- GMP大法教你重新做人(从入门到实战)
- Highway Networks
- CTF---编程入门第一题 循环
- Z.ExtensionMethods 一个强大的开源扩展库
- 【干货】神经网络SRU
- AutoMapper 使用实践
- CTF---安全杂项入门第二题 A记录
- PyTorch(总)---PyTorch遇到令人迷人的BUG与记录
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法