注意
本文档适用于 Ceph 的开发版本。
RGW 对象完整去重
添加 radosgw-admin 命令以删除重复的 RGW 尾部对象,并收集和报告去重统计信息。
管理命令
radosgw-admin dedup estimate:启动一个新的去重估算会话(如果存在第一个现有会话,则中止)。它不会对现有系统进行任何更改,只会收集统计信息并报告它们。
radosgw-admin dedup exec --yes-i-really-mean-it:启动一个新的去重会话(如果存在第一个现有会话,则中止)。它将执行完整的去重,查找重复的尾部对象并将其删除。
此命令可能导致数据丢失,不应在生产数据上使用!!
radosgw-admin dedup pause:暂停活动的去重会话(去重资源不会被释放)。
radosgw-admin dedup resume:恢复已暂停的去重会话。
radosgw-admin dedup abort:中止活动的去重会话并释放其使用的所有资源。
radosgw-admin dedup stats:收集并显示上次去重统计信息。
radosgw-admin dedup estimate:启动一个新的去重估算会话(如果存在第一个现有会话,则中止)。
radosgw-admin dedup throttle --max-bucket-index-ops=<count>:指定去重期间单个 RGW 服务器允许的最大存储桶索引请求数/秒,0 表示无限制。
radosgw-admin dedup throttle --stat:显示去重限制设置。
跳过的对象
去重估算过程跳过以下对象
小于 4 MB 的对象(除非它们是多部分上传)。
具有不同放置规则的对象。
具有不同池的对象。
具有不同存储类别的对象。
完整的去重过程会跳过以上所有对象,还会跳过压缩和用户加密的对象。
估算处理
去重估算过程通过一次读取一个包含数千个条目的完整存储桶索引对象,直接从存储桶索引中收集所有必要的信息。
存储桶索引对象在参与成员之间分片,因此每个存储桶索引对象只读取一次。分片允许处理几乎线性扩展,将负载均匀地分配给参与成员。
去重估算过程不会访问对象本身(数据/元数据),这意味着其处理时间不会受到存储对象的底层介质(SSD/HDD)的影响,因为存储桶索引实际上总是存储在快速介质上(具有大量内存缓存的 SSD)。
管理员可以通过设置每个 RGW 服务器每秒存储桶索引读取次数的限制来限制估算过程(每次读取带来 1000 个对象条目),使用
$ radosgw-admin dedup throttle --max-bucket-index-ops=<count>
典型的 RGW 服务器每秒执行大约 100 次存储桶索引读取(即 100,000 个对象条目)。将计数设置为 50 通常会将访问速度减慢一半,依此类推……
完整去重处理
完整去重过程从存储桶索引构建去重表开始,类似于上面的估算过程。
然后对该表进行线性扫描以清除没有重复项的对象,只留下可去重的候选对象。
接下来,我们遍历这些去重候选对象,从对象元数据中读取它们的完整信息(每个对象的 RADOS 操作)。在此步骤中,我们过滤掉压缩和用户加密的对象。
在此之后,我们计算对象数据的强哈希,这涉及完整的对象读取,并且是资源密集型操作。此强哈希确保去重候选对象确实是完美匹配。如果匹配,我们继续执行去重
逐个增加源尾部对象的引用计数。
将清单从源复制到目标。
删除目标上的所有尾部对象。
内存使用情况
RGW 对象计数
内存
1M
8 MB
4M
16 MB
16M
32 MB
64M
64 MB
256M
128 MB
1024M (1G)
256 MB
4096M (4G)
512 MB
16384M (16G)
1024 MB