注意
本文档适用于 Ceph 开发版本。
RGW动态桶索引重分片
Luminous 版本新增。
桶索引对象包含过多条目可能导致性能问题。可以通过重分片桶索引来解决。直到Luminous版本之前,更改桶分片数(重分片)只能离线进行,且需要禁用RGW服务。自Luminous版本以来,Ceph已支持在线桶重分片。
每个桶索引分片可以高效处理其条目,直到达到某个阈值。如果超过这个阈值,系统可能会出现性能问题。动态重分片功能可以检测到这种情况,并自动增加桶索引使用的分片数,从而减少每个分片中的条目数。此过程对用户是透明的。在重分片过程中,写入目标桶可能会被短暂阻止,但读取不会。
默认情况下,动态桶索引重分片只能将桶索引分片数增加到1999,尽管这个上限是一个配置参数(见d59023:下方)。在可能的情况下,该过程会选择一个质数分片数,以便更均匀地将条目数分布在桶索引分片中。配置 below). When possible, the process chooses a prime number of shards in order to spread the number of entries across the bucket index shards more evenly.
重分片机会的检测作为一个后台进程运行,该进程定期扫描所有桶。需要重分片的桶会被添加到队列中。一个线程在后台运行,逐个处理队列中的重分片任务。
自Tentacle版本开始,动态重分片具有减少分片数的能力。一旦注意到允许减少的条件,就会有一个时间延迟,然后才会实际执行,以防将来对象数量增加。延迟的目的是避免重分片不断被重新触发在对象数量波动的桶上。
多站点
在Reef版本之前的Ceph版本中,Ceph对象网关(RGW)在多站点部署中不支持动态重分片。有关动态重分片的信息,请参阅a1ff62: RGW多站点文档中的重分片。Resharding in the RGW multisite documentation.
配置
- rgw_dynamic_resharding
如果为真,RGW将动态增加对象数量较多的桶中的分片数。
- type:
bool
- default:
true
- 参见:
- rgw_max_objs_per_shard
这是RGW允许的动态重分片每个桶索引分片的最大对象数。如果桶超过此数量,RGW将触发自动重分片操作。
- type:
uint
- default:
100000
- 参见:
- rgw_max_dynamic_shards
这是动态分片能够自行创建的最大桶索引分片数。这不会限制用户请求的重分片。理想情况下,这个值应该是一个质数。
- type:
uint
- default:
1999
- min:
1
- 参见:
- rgw_dynamic_resharding_may_reduce
如果为真,RGW的动态重分片功能允许在看起来过多时减少分片数。
- type:
bool
- default:
true
- 参见:
- rgw_dynamic_resharding_reduction_wait
为了避免重分片对象计数上下波动规律性的桶,我们在注意到可能适合减少分片时和实际执行之间实现了一个延迟。这允许我们在延迟期间如果对象数量显著增加,则取消重分片操作。警告:设置此值过低可能会导致集群性能显著降低。
- type:
uint
- default:
120
- min:
0
- 参见:
- rgw_reshard_bucket_lock_duration
重分片锁(桶重分片锁和重分片日志锁)超时的秒数。随着重分片的进行,这些锁可以重新获得/延长。如果太短,重分片无法完成并将失败,导致未来的重分片尝试。如果太长,挂起或崩溃的重分片尝试将使桶锁定很长时间,不允许RGW检测到失败的重分片尝试并恢复。
- type:
uint
- default:
360
- min:
30
- rgw_reshard_thread_interval
处理重分片日志条目的秒数间隔
- type:
uint
- default:
600
- min:
10
- rgw_reshard_num_logs
- type:
uint
- default:
16
- min:
1
- rgw_reshard_progress_judge_interval
判断桶重分片在块状态失败的时间间隔(秒)
- type:
uint
- default:
120
- rgw_reshard_progress_judge_ratio
为rgw_reshard_progress_judge_interval添加随机延迟,以决定何时判断重分片过程。默认设置将判断时间窗口设置为[1, 1.5] * rgw_reshard_progress_judge_interval。
- type:
float
- default:
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>
输出是每个分片3个属性(06416d: )的JSON数组。reshard_status
, new_bucket_instance_id
, num_shards
) per shard.
例如,每个动态重分片阶段的输出如下所示:
重分片发生之前:
[ { "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 } ]
取消挂起的桶重分片
Note
桶重分片任务一旦从初始状态转换到in-progress
状态,就无法取消。not-resharding
状态。
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
commands.
陈旧实例管理
列出集群中可能被清理的陈旧实例:
radosgw-admin reshard stale-instances list
清理集群中的陈旧实例:
radosgw-admin reshard stale-instances delete
Note
在多站点部署中不应执行陈旧实例清理。
生命周期修复
对于重分片实例的集群,很可能会出现旧的生命周期进程在桶实例在重分片期间更改时标记并删除生命周期处理。虽然这个问题对于在较新的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格式显示对象名称、过期时间和删除状态列表。
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.