注意
本文档适用于 Ceph 的开发版本。
RGW 动态存储桶索引分片重组
New in version Luminous.
条目过多的存储桶索引对象可能导致性能问题。这可以通过分片重组存储桶索引来解决。直到 Luminous 版本,更改存储桶分片数(分片重组)只能在 RGW 服务禁用时离线完成。自 Luminous 版本以来,Ceph 支持在线存储桶分片重组。
每个存储桶索引分片都可以高效地处理其条目,直到达到某个阈值。如果超过此阈值,系统可能会出现性能问题。动态分片重组功能会检测到这种情况,并自动增加存储桶索引使用的分片数量,从而减少每个分片中的条目数。此过程对用户透明。在分片重组过程中,对目标存储桶的写入可能会短暂阻塞,但读取不会。
默认情况下,动态存储桶索引分片重组只能将存储桶索引分片数量增加到 1999,尽管此上限是一个配置参数(请参阅下面的配置)。如果可能,该过程会选择一个质数的分片数,以便更均匀地将条目分布到存储桶索引分片中。
检测分片重组机会作为后台进程运行,它会定期扫描所有存储桶。需要分片重组的存储桶将添加到队列中。一个后台线程运行并一次处理一个排队的分片重组任务。
从 Tentacle 版本开始,动态分片重组具有减少分片数量的能力。一旦注意到允许减少的条件,在实际执行之前会有一段时间延迟,以防对象数量在不久的将来增加。延迟的目的是避免在对象数量波动频繁的存储桶上反复触发分片重组。
多站点
在早于 Reef 的 Ceph 版本中,Ceph 对象网关 (RGW) 不支持多站点部署中的动态分片重组。有关动态分片重组的信息,请参阅 RGW 多站点文档中的分片重组。
配置
- rgw_dynamic_resharding
如果为 true,RGW 将动态增加每个分片对象数量高的存储桶中的分片数量。
- 类型:
bool- 默认值:
true- 另请参阅:
- rgw_max_objs_per_shard
这是 RGW 在动态分片重组下允许的每个存储桶索引分片的最大对象数。如果存储桶超过此数量,RGW 将触发自动分片重组操作。
- 类型:
uint- 默认值:
100000- 另请参阅:
- rgw_max_dynamic_shards
这是动态分片重组能够自行创建的最大存储桶索引分片数量。这不限制用户请求的分片重组。理想情况下,此值是一个质数。
- 类型:
uint- 默认值:
1999- min:
1- 另请参阅:
- rgw_dynamic_resharding_may_reduce
如果为 true,如果 RGW 的动态分片重组能力发现分片过多,则允许减少分片数量。
- 类型:
bool- 默认值:
true- 另请参阅:
- rgw_dynamic_resharding_reduction_wait
为了避免对对象计数上下波动的存储桶进行分片重组,我们在注意到可能适合减少分片与实际执行之间设置了延迟。这使我们能够在延迟期间对象数量显著增加时取消分片重组操作。警告:将此值设置得太低可能会导致群集性能显著下降。
- 类型:
uint- 默认值:
120- min:
0- 另请参阅:
- rgw_reshard_bucket_lock_duration
分片重组锁(存储桶分片重组锁和分片重组日志锁)的超时时间(以秒为单位)。随着分片重组的进行,这些锁可以被续订/延长。如果时间太短,分片重组无法完成并将失败,导致未来的分片重组尝试。如果时间太长,挂起或崩溃的分片重组尝试将使存储桶长时间保持锁定状态,导致 RGW 无法检测到失败的分片重组尝试并恢复。
- 类型:
uint- 默认值:
360- min:
30
- rgw_reshard_thread_interval
处理分片重组日志条目之间的时间间隔(以秒为单位)
- 类型:
uint- 默认值:
600- min:
10
- rgw_reshard_num_logs
- 类型:
uint- 默认值:
16- min:
1
- rgw_reshard_progress_judge_interval
判断存储桶分片重组是否处于阻塞状态的间隔(以秒为单位)
- 类型:
uint- 默认值:
120
- rgw_reshard_progress_judge_ratio
向 rgw_reshard_progress_judge_interval 添加随机延迟,用于决定何时判断分片重组过程。默认设置将判断时间窗口分散到 [1, 1.5] * rgw_reshard_progress_judge_interval。
- 类型:
float- 默认值:
0.5- 另请参阅:
管理命令
将存储桶添加到分片重组队列
radosgw-admin reshard add --bucket <bucket_name> --num-shards <new number of shards>
列出分片重组队列
radosgw-admin reshard list
处理分片重组队列中的任务
radosgw-admin reshard process
存储桶分片重组状态
radosgw-admin reshard status --bucket <bucket_name>
输出是一个 JSON 数组,其中包含每个分片的 3 个属性(reshard_status、new_bucket_instance_id、num_shards)。
例如,动态分片重组各个阶段的输出如下所示:
分片重组发生之前
[ { "reshard_status": "not-resharding", "new_bucket_instance_id": "", "num_shards": -1 } ]
分片重组期间
[ { "reshard_status": "in-progress", "new_bucket_instance_id": "1179f470-2ebf-4630-8ec3-c9922da887fd.8652.1", "num_shards": 2 }, { "reshard_status": "in-progress", "new_bucket_instance_id": "1179f470-2ebf-4630-8ec3-c9922da887fd.8652.1", "num_shards": 2 } ]
分片重组完成后
[ { "reshard_status": "not-resharding", "new_bucket_instance_id": "", "num_shards": -1 }, { "reshard_status": "not-resharding", "new_bucket_instance_id": "", "num_shards": -1 } ]
取消待处理的存储桶分片重组
注意
存储桶分片重组任务一旦从初始 not-resharding 状态转换为 in-progress 状态,就无法取消。
radosgw-admin reshard cancel --bucket <bucket_name>
手动立即存储桶分片重组
radosgw-admin bucket reshard --bucket <bucket_name> --num-shards <new number of shards>
在选择分片数量时,管理员必须预测每个存储桶的峰值对象数量。理想情况下,目标是任何给定时间每个分片不超过 100000 个条目。
此外,质数分片数量的存储桶索引分片在均匀分布存储桶索引条目方面更有效。例如,7001 个存储桶索引分片优于 7000 个,因为前者是质数。各种网站都有质数列表;使用您喜欢的搜索引擎搜索“质数列表”即可找到一些网站。
设置存储桶的最小分片数
radosgw-admin bucket set-min-shards --bucket <bucket_name> --num-shards <min number of shards>
由于动态分片重组现在可以减少分片数量,管理员可能希望防止分片数量变得过低,例如,如果他们预计未来的对象数量会增加。此命令允许管理员设置每个存储桶的最小值。但是,这并不妨碍管理员手动将分片重组为较低的分片数量。
故障排除
早于 Luminous 12.2.11 和 Mimic 13.2.5 的群集留下了陈旧的存储桶实例条目,这些条目没有自动清理。这个问题也影响了生命周期策略,这些策略不再适用于分片重组的存储桶。通过运行 radosgw-admin 命令可以修复这两个问题。
陈旧实例管理
列出群集中可能被清理的陈旧实例
radosgw-admin reshard stale-instances list
清理群集中的陈旧实例
radosgw-admin reshard stale-instances delete
注意
不应在多站点部署中清理陈旧实例。
生命周期修复
对于具有分片重组实例的群集,旧的生命周期进程很可能在分片重组期间存储桶实例更改时标记并删除了生命周期处理。虽然这对于部署在较新 Ceph 版本(从 Mimic 13.2.6 和 Luminous 12.2.12 开始)上的存储桶已修复,但具有生命周期策略且已进行分片重组的旧存储桶必须手动修复。
执行此操作的命令是
radosgw-admin lc reshard fix --bucket {bucketname}
如果未提供 --bucket 参数,此命令将尝试修复群集中所有存储桶的生命周期策略。
对象过期修复
在较旧的群集上,受 Swift 对象过期约束的对象在存储桶分片重组后可能已从日志池中删除且从未被删除。如果它们的过期时间在群集升级之前,就会发生这种情况,但如果它们的过期时间在升级之后,则会正确处理这些对象。为了管理这些过期陈旧对象,radosgw-admin 提供了两个子命令。
列出
radosgw-admin objects expire-stale list --bucket {bucketname}
以 JSON 格式显示对象名称和过期时间列表。
删除
radosgw-admin objects expire-stale rm --bucket {bucketname}
启动此类对象的删除,以 JSON 格式显示对象名称、过期时间和删除状态列表。