RGW 动态存储桶索引重新分片
大桶索引可能会导致性能问题。为了解决这个问题,官方引入了桶索引分片。在 Luminous 之前,需要离线更改存储桶分片的数量(重新分片)。从 Luminous 开始,官方支持在线存储桶重新分片。
每个桶索引分片可以有效地处理其条目,直到达到某个阈值数量的条目。如果超过此阈值,系统可能会遇到性能问题。动态重新分片功能检测到这种情况并自动增加桶索引使用的分片数量,从而减少每个桶索引分片中的条目数。这个过程对用户是透明的。
检测过程运行:
-
当新对象添加到存储桶中时
-
在定期扫描所有存储桶的后台进程中。
需要后台进程来处理系统中未更新的现有存储桶。需要重新分片的存储桶被添加到重新分片队列中,并将被安排在以后重新分片。重新分片线程在后台运行并执行计划的重新分片任务,一次一个。
多站点
多站点环境不支持动态重新分片。
配置参数
启用/禁用动态存储桶索引重新分片:
-
rgw_dynamic_resharding
:true/false,默认:true
控制重新分片过程的配置选项:
-
rgw_reshard_num_logs
:重新分片队列的分片数,默认值:16 -
rgw_reshard_bucket_lock_duration
: 在重新分片期间锁定桶 obj 的持续时间,以秒为单位,默认值:120 秒 -
rgw_max_objs_per_shard
:触发重新分片前每个桶索引分片的最大对象数,默认:100000 个对象 -
rgw_reshard_thread_interval
: 重分片队列处理轮次之间的最大时间,以秒为单位,默认值:600 秒
管理命令
将存储桶添加到重新分片队列
# 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 个对象(reshard_status、new_bucket_instance_id、num_shards)的 json 数组。
取消挂起的桶重新分片
注意:正在进行的桶重新分片操作无法取消。
# radosgw-admin reshard cancel --bucket <bucket_name>
手动立即重新分片
# radosgw-admin bucket reshard --bucket <bucket_name> --num-shards <new number of shards>
故障排除
Luminous 12.2.11 和 Mimic 13.2.5 之前的集群会留下陈旧的存储桶实例条目,这些条目不会自动清理。该问题还影响了生命周期策略,这些策略不再应用于重新分片的存储桶。这两个问题都可以使用几个 radosgw-admin 命令解决。
陈旧的实例管理
列出集群中准备好清理的陈旧实例。
# radosgw-admin reshard stale-instances list
清理集群中的陈旧实例。注意:这些实例的清理只能在单个站点集群上完成。
# radosgw-admin reshard stale-instances rm
生命周期修复
对于已重新分片实例的集群,旧生命周期进程很可能会在重新分片期间更改存储桶实例时标记并删除生命周期处理。虽然这对于较新的集群(来自 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 格式显示对象名称、过期时间和删除状态的列表。