Ceph对象网关将桶索引数据存储在索引池(index_pool)中,该索引池默认为 .rgw.bucket.index 。当客户端将许多对象(数十万到数百万个对象)放入一个桶中而没有为每个桶的最大对象数设置配额时,索引池可能会出现显著的性能下降。
当每个桶允许大量对象时,桶索引分片(bucket index sharding)有助于防止性能瓶颈。
可以为新桶配置桶索引分片或更改现有桶的桶索引。
要配置桶索引分片:
- 对于简单配置中的新桶,请参阅“在简单配置中配置桶索引分片”
- 对于多站点配置中的新桶,请参阅“在多站点配置中配置桶索引分片”
要重新分片桶:
- 动态,请参阅“动态桶索引重新分片”
- 手动,请参阅“手动存储桶索引重新分片”
- 在多站点配置中,请参见“使用多站点手动重新分片桶”
桶分片限制
重点
请谨慎使用以下限制。 有与硬件选择相关的影响,因此应该始终与Red Hat 客户团队讨论这些要求。
- 在一个桶需要分片前,存储的最大对象数:Red Hat建议每个桶 index shard最多有102400个对象。为了充分利用分片,需在对象网关桶索引池中提供足够数量的osd,以获得最大的并行性。
- 使用分片时的最大对象数:根据之前的测试,当前支持的桶 index分片数为65521。Red Hat quality assurance尚未对桶分片进行完全可扩展性测试。
在简单配置中配置桶索引分片
要在所有新建的桶上启用和配置桶索引分片,请使用 rgw_override_bucket_index_max_shards 参数。 将参数设置为:
- 0 禁用桶索引分片。 这是默认值。
- 大于 0 的值以启用桶分片并设置最大分片数。
先决条件
- 参见“桶分片限制”。
过程
-
计算推荐的分片数。 为此,请使用以下公式:
桶中预期的对象数/100,000
请注意,最大分片数为 65521。
-
将 rgw_override_bucket_index_max_shards 添加到 Ceph 配置文件:
rgw_override_bucket_index_max_shards = value
将 value 替换为上一步计算的推荐分片数,例如:
rgw_override_bucket_index_max_shards = 10
- 要为对象网关的所有实例配置桶索引分片,请在 [global] 部分下添加 rgw_override_bucket_index_max_shards。
- 要仅为对象网关的特定实例配置桶索引分片,请在该实例下添加 rgw_override_bucket_index_max_shards。
-
重启对象网关:
# systemctl restart ceph-radosgw.target
在多站点配置中配置桶索引分片
在多站点配置中,每个zone可以有不同的 index_pool 设置来管理故障转移。 要为一个zone group中的zones配置一致的分片计数,请在zone group的配置中设置 rgw_override_bucket_index_max_shards 设置。 将参数设置为:
- 0 禁用桶索引分片。 这是默认值。
- 大于 0 的值以启用桶分片并设置最大分片数。
注意
将索引池(对于每个zone,如果适用)映射到基于SSD的osd的CRUSH 规则集也可能有助于提高桶索引性能。
先决条件
- 参见“桶分片限制”。
过程
-
计算推荐的分片数。 为此,请使用以下公式:
桶中预期的对象数/100,000
请注意,最大分片数为 65521。
-
将zonegroup配置提取到zonegroup.json文件:
# radosgw-admin zonegroup get > zonegroup.json
-
在zonegroup.json 文件中,为每个命名zone设置 rgw_override_bucket_index_max_shards 设置。
rgw_override_bucket_index_max_shards = value
将 value 替换为上一步计算的推荐分片数,例如:
rgw_override_bucket_index_max_shards = 10
-
重置zonegroup:
# radosgw-admin zonegroup set < zonegroup.json
-
更新period:
# radosgw-admin period update --commit
动态桶索引重新分片
动态存储==桶重新分片的过程会定期检查所有对象网关桶并检测需要重新分片的存储桶。 如果存桶增长得大于 rgw_max_objs_per_shard 参数中指定的值,对象网关会在后台动态重新分片桶。 rgw_max_objs_per_shard 的默认值为每个分片 100k 个对象。
重点
目前,Red Hat 不支持多站点配置中的动态桶重新分片。 要在此类配置中重新分片桶索引,请参阅多站点配置下手动重新分片桶。
先决条件
- 参见“桶分片限制”。
过程
-
启用动态桶索引重新分片:
- 将 Ceph 配置文件中的 rgw_dynamic_resharding 设置为 true,这是默认值。
- 可选。 如果需要,更改 Ceph 配置文件中的以下参数:
- rgw_reshard_num_logs: 重新分片日志的分片数。 默认值为 16。
- rgw_reshard_bucket_lock_duration: 重新分片期间桶锁定的持续时间。 默认值为 120 秒。
- rgw_dynamic_resharding:启用或禁用动态重新分片。 默认值是true。
- rgw_max_objs_per_shard: 每个分片的最大对象数。 默认值为每个分片 100000 个对象。
- rgw_reshard_thread_interval: 两次重新分片线程处理之间的最长时间。 默认值为 600 秒。
-
将桶添加到重新分片队列:
# radosgw-admin reshard add --bucket bucket --num-shards number
替换:
- 使用要重新分片的桶名称代替bucket
- 使用新分片数代替number
例如:
# radosgw-admin reshard add --bucket data --num-shards 10
-
列出重新分片队列:
# radosgw-admin reshard list
-
检查桶重新分片状态:
# radosgw-admin reshard status --bucket bucket
替换:
- 使用要重新分片的桶名称代替bucket
例如:
# radosgw-admin reshard status --bucket data
-
要立即处理重新分片队列中的条目:
# radosgw-admin reshard process
-
要取消挂起的桶重新分片:
# radosgw-admin reshard cancel --bucket bucket
替换:
-
使用要重新分片的桶名称代替bucket
例如:
# radosgw-admin reshard cancel --bucket data
重点
只能取消挂起(pending)的重新分片操作。 不要取消正在进行(ongoing)的重新分片操作。
-
-
如果使用 Red Hat Ceph Storage 3.1 和以前的版本,请按照“重新分片后清理过时实例”部分中的说明删除过时的桶条目。
简单配置下手动重新分片桶
如果某桶的大小超过了优化的初始配置,请使用radosgw-admin bucket reshard命令对桶索引池进行重新分片。此命令:
- 为指定的桶创建一组新的桶索引对象。
- 跨这些桶索引对象分布对象条目。
- 创建一个新的桶实例。
- 将新的桶实例与桶链接起来,以便所有新索引操作都通过新的桶索引。
- 将旧的和新的bucket ID打印到命令输出。
先决条件
- 参见“桶分片限制”。
过程
-
备份原始桶索引:
# radosgw-admin bi list --bucket=bucket > bucket.list.backup
替换:
- 使用要重新分片的桶名称代替bucket
例如,对于名为 data 的桶,请输入:
# radosgw-admin bi list --bucket=data > data.list.backup
-
重新分片桶索引:
# radosgw-admin bucket reshard --bucket=bucket --num-shards=number
替换:
- 使用要重新分片的桶名称代替bucket
- 使用新分片数代替number
例如,对于名为 data 且所需分片数为 100 的桶,请输入:
# radosgw-admin reshard --bucket=data --num-shards=100
-
如果使用 Red Hat Ceph Storage 3.1 和以前的版本,请按照“重新分片后清理过时实例”部分中的说明删除过时的桶条目。
重新分片后清理过时实例
在 Red Hat Ceph Storage 3.1 和以前的版本中,重新分片过程不会自动清除桶条目的过时实例。 如果不手动清理这些过时的实例,它们会影响集群的性能。
重点
仅在简单配置中使用此过程,而不在多站点集群中使用。
先决条件
- 安装对象网关。
过程
-
列出过时实例:
# radosgw-admin reshard stale-instances list
-
清除过时实例:
# radosgw-admin reshard stale-instances rm
多站点配置下手动重新分片桶
Red Hat Ceph Storage 3.1 及更早版本不支持多站点集群的动态桶重新分片。 要在多站点集群中手动重新分片桶,请使用以下过程。
手动重新分片是一个非常昂贵的过程,尤其是对于需要手动重新分片的巨大桶。 每个secondary zone都会删除所有对象,然后从master zone重新同步它们。
先决条件
- 停止所有对象网关实例。
过程
-
在 master zone group的 master zone 中的一个节点上,执行以下命令:
# radosgw-admin bucket sync disable --bucket=<bucket-name>
等待所有zone的sync status报告数据同步是最新的。
-
停止所有zone中的所有ceph-radosgw 守护进程。
-
在master zone group的 master zone 内的节点上,对桶进行重新分片。 例如:
# radosgw-admin bucket reshard --bucket=<bucket_name> --num-shards=<new_shards_number>
-
在每个secondary zone上,执行以下操作:
# radosgw-admin bucket rm --purge-objects --bucket=<bucket-name>
-
在master zone上,执行:
# radosgw-admin bi purge --bucket-id=<old-bucket-id>
-
最后,重启所有zone中的所有 ceph-radosgw 守护进程。
元数据同步过程将获取更新的桶入口点和桶实例元数据。数据同步过程将执行完全同步。