9.3. 配置存储桶索引重新划分
作为存储管理员,您可以在单一站点和多站点部署中配置存储桶索引重新划分,以提高性能。
您可以手动离线或动态在线对存储桶进行重新分片。
9.3.1. 存储桶索引重新分片
Ceph 对象网关将 bucket 索引数据存储在索引池中,默认为 .rgw.buckets.index
参数。当客户端将多个对象放在单个存储桶中,而不为每个存储桶的最大对象数量设置配额时,索引池可能会导致性能下降。
- 当您为每个存储桶添加大量对象时,存储桶索引重新划分可防止性能瓶颈。
- 您可以为新存储桶配置存储桶索引重新划分,或更改现有存储桶上的存储桶索引。
- 您需要将分片计数设置为计算的分片计数最接近的主数。作为主要数字的存储桶索引分片在分片之间的平均分布式存储桶索引条目中表现更好。
bucket 索引可以手动重新划分或动态重新划分。
在动态重新划分 bucket 索引的过程中,会定期检查所有 Ceph 对象网关存储桶,它会检测需要重新划分的存储桶。如果 bucket 增长大于
rgw_max_objs_per_shard
参数中指定的值,Ceph 对象网关会在后台动态重新定义存储桶。rgw_max_objs_per_shard
的默认值是每个分片 100k 对象。在升级的单站点配置上动态重新划分 bucket 索引,无需对 zone 或 zone group 进行任何修改。单个站点配置可以是以下任意一个:- 没有 realm 的默认区配置。
- 至少一个 realm 的非默认配置。
- 多域单站点配置。
版本化的存储桶可能会表现为 imbalanced 索引,特别是当编写了一个小对象子集和重新编写时。当发生大量对象上传时,可能会出现版本化存储桶上的大型 omaps (大约一百万个对象)。
9.3.2. 恢复存储桶索引
重新划分使用 bucket_index_max_shards = 0
创建的存储桶,移除存储桶的元数据。但是,您可以通过恢复受影响的存储桶来恢复存储桶。
/usr/bin/rgw-restore-bucket-index
工具在 /tmp
目录中创建临时文件。这些临时文件根据前面存储桶中的 bucket 对象计数来消耗空间。以前的带有超过 10M 对象的存储桶在 /tmp
目录中需要超过 4GB 的可用空间。如果 /tmp
中的存储空间耗尽,工具会失败并显示以下错误:
ln: failed to access '/tmp/rgwrbi-object-list.4053207': No such file or directory
临时对象被删除。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- Ceph 对象网关至少安装两个站点。
-
已安装
jq
软件包。
流程
执行以下两个步骤之一来执行存储桶索引的恢复:
-
运行
radosgw-admin object reindex --bucket BUCKET_NAME --object OBJECT_NAME
命令。 运行脚本 -
/usr/bin/rgw-restore-bucket-index -b BUCKET_NAME -p DATA_POOL_NAME
。示例
[root@host01 ceph]# /usr/bin/rgw-restore-bucket-index -b bucket-large-1 -p local-zone.rgw.buckets.data marker is d8a347a4-99b6-4312-a5c1-75b83904b3d4.41610.2 bucket_id is d8a347a4-99b6-4312-a5c1-75b83904b3d4.41610.2 number of bucket index shards is 5 data pool is local-zone.rgw.buckets.data NOTICE: This tool is currently considered EXPERIMENTAL. The list of objects that we will attempt to restore can be found in "/tmp/rgwrbi-object-list.49946". Please review the object names in that file (either below or in another window/terminal) before proceeding. Type "proceed!" to proceed, "view" to view object list, or "q" to quit: view Viewing... Type "proceed!" to proceed, "view" to view object list, or "q" to quit: proceed! Proceeding... NOTICE: Bucket stats are currently incorrect. They can be restored with the following command after 2 minutes: radosgw-admin bucket list --bucket=bucket-large-1 --allow-unordered --max-entries=1073741824 Would you like to take the time to recalculate bucket stats now? [yes/no] yes Done real 2m16.530s user 0m1.082s sys 0m0.870s
-
运行
该工具不适用于版本控制存储桶。
[root@host01 ~]# time rgw-restore-bucket-index --proceed serp-bu-ver-1 default.rgw.buckets.data NOTICE: This tool is currently considered EXPERIMENTAL. marker is e871fb65-b87f-4c16-a7c3-064b66feb1c4.25076.5 bucket_id is e871fb65-b87f-4c16-a7c3-064b66feb1c4.25076.5 Error: this bucket appears to be versioned, and this tool cannot work with versioned buckets.
-
工具的范围仅限于单一站点,而不是多站点,即如果我们在 site-1 上运行
rgw-restore-bucket-index
工具,它不会在 site-2 中恢复对象,反之亦然。在多站点上,应在存储桶的两个站点上执行恢复工具和对象 re-index 命令。
9.3.3. 存储桶索引重新划分的限制
请谨慎使用以下限制:您的硬件选择会有影响,因此您应该始终与您的红帽客户团队讨论这些要求。
- 一个存储桶中的最大对象数量需要重新划分: 每个存储桶索引分片使用最多 102,400 个对象。要充分利用重新划分和最大化并行性,请在 Ceph 对象网关 bucket 索引池中提供足够数量的 OSD。这种并行化使用 Ceph 对象网关实例的数量进行扩展,并使用数字序列替换 in-order 索引分片枚举。默认锁定超时从 60 秒延长到 90 秒。
- 使用分片时的最大对象数量: 基于之前的测试,当前支持的存储桶索引分片数量为 65521。红帽质量保证未对存储桶分片执行完整的可扩展性测试。
- 使用分片时的最大对象数量: 基于之前的测试,当前支持的存储桶索引分片数量为 65,521。
您可以在其他区赶上前重新划分存储桶三次 : 在旧的生成同步前,不建议重新划分存储桶。支持以前重新划分中的四个 bucket 生成。达到限制后,动态重新划分不会再次重新划分存储桶,直到至少有一个旧日志生成被完全修剪为止。使用命令
radosgw-admin bucket reshard
会抛出以下错误:Bucket _BUCKET_NAME_ already has too many log generations (4) from previous reshards that peer zones haven't finished syncing. Resharding is not recommended until the old generations sync, but you can force a reshard with `--yes-i-really-mean-it`.
9.3.4. 在简单部署中配置存储桶索引重新划分
要在所有新存储桶上启用和配置存储桶索引重新划分,请使用 rgw_override_bucket_index_max_shards
参数。
您可以将参数设置为以下值之一:
-
0
禁用存储桶索引分片,这是默认值。 -
值大于
0
,以启用存储桶分片并设置分片的最大数量。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- Ceph 对象网关至少安装两个站点。
流程
计算推荐的分片数量:
number of objects expected in a bucket / 100,000
注意目前支持的存储桶索引分片的最大数量为 65,521。
相应地设置
rgw_override_bucket_index_max_shards
选项:语法
ceph config set client.rgw rgw_override_bucket_index_max_shards VALUE
使用计算的推荐分片数量替换 VALUE:
示例
[ceph: root@host01 /]# ceph config set client.rgw rgw_override_bucket_index_max_shards 12
-
要为 Ceph 对象网关的所有实例配置 bucket 索引重新划分,请使用
global
选项设置rgw_override_bucket_index_max_shards
参数。 -
若要仅为 Ceph 对象网关的特定实例配置 bucket 索引重新划分,请在实例下添加
rgw_override_bucket_index_max_shards
参数。
-
要为 Ceph 对象网关的所有实例配置 bucket 索引重新划分,请使用
在集群中的所有节点上重启 Ceph 对象网关以使更改生效:
语法
ceph orch restart SERVICE_TYPE
示例
[ceph: root#host01 /]# ceph orch restart rgw
其它资源
9.3.5. 在多站点部署中配置存储桶索引重新划分
在多站点部署中,每个区域都可以有不同的 index_pool
设置来管理故障转移。要为一个 zone group 中的 zone 配置一致的分片计数,请在该 zone group 配置中设置 bucket_index_max_shards
参数。bucket_index_max_shards
参数的默认值为 11。
您可以将参数设置为以下值之一:
-
0
禁用存储桶索引分片。 -
值大于
0
,以启用存储桶分片并设置分片的最大数量。
将各个区域的索引池映射到基于 SSD 的 OSD 的 CRUSH 规则集也可能有助于 bucket 索引性能。如需更多信息,请参阅 建立性能域 部分。
为防止多站点部署中同步问题,存储桶不应有超过三代差距。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- Ceph 对象网关至少安装两个站点。
流程
计算推荐的分片数量:
number of objects expected in a bucket / 100,000
注意目前支持的存储桶索引分片的最大数量为 65,521。
将 zone group 配置提取到
zonegroup.json
文件中:示例
[ceph: root@host01 /]# radosgw-admin zonegroup get > zonegroup.json
在
zonegroup.json
文件中,为每个命名区设置bucket_index_max_shards
参数:语法
bucket_index_max_shards = VALUE
使用计算的推荐分片数量替换 VALUE:
示例
bucket_index_max_shards = 12
重置 zone group:
示例
[ceph: root@host01 /]# radosgw-admin zonegroup set < zonegroup.json
更新周期:
示例
[ceph: root@host01 /]# radosgw-admin period update --commit
检查重新划分是否完成:
语法
radosgw-admin reshard status --bucket BUCKET_NAME
示例
[ceph: root@host01 /]# radosgw-admin reshard status --bucket data
验证
检查存储集群的同步状态:
示例
[ceph: root@host01 /]# radosgw-admin sync status
9.3.6. 动态重新划分存储桶索引
您可以通过将存储桶添加到重新划分队列来动态重新划分存储桶索引。它被调度为重新划分。重新划分线程在后台运行,并一次执行调度的重新划分。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- Ceph 对象网关至少安装两个站点。
流程
将
rgw_dynamic_resharding
参数设置为true
。示例
[ceph: root@host01 /]# radosgw-admin period get
可选:使用以下命令自定义 Ceph 配置:
语法
ceph config set client.rgw OPTION VALUE
使用以下选项替换 OPTION:
-
rgw_reshard_num_logs
:重新划分日志的分片数量。默认值为16
。 -
rgw_reshard_bucket_lock_duration
:在重新划分期间存储桶上锁定的持续时间。默认值为360
秒。 -
rgw_dynamic_resharding
:启用或禁用动态重新划分。默认值为true
。 -
rgw_max_objs_per_shard
:每个分片的最大对象数量。默认值为每个分片100000
对象。 -
rgw_reshard_thread_interval
:重新线程处理循环之间的最长时间。默认值为600
秒。
示例
[ceph: root@host01 /]# ceph config set client.rgw rgw_reshard_num_logs 23
-
将存储桶添加到重新划分队列中:
语法
radosgw-admin reshard add --bucket BUCKET --num-shards NUMBER
示例
[ceph: root@host01 /]# radosgw-admin reshard add --bucket data --num-shards 10
列出重新划分队列:
示例
[ceph: root@host01 /]# radosgw-admin reshard list
检查存储桶日志生成和分片:
示例
[ceph: root@host01 /]# radosgw-admin bucket layout --bucket data { "layout": { "resharding": "None", "current_index": { "gen": 1, "layout": { "type": "Normal", "normal": { "num_shards": 23, "hash_type": "Mod" } } }, "logs": [ { "gen": 0, "layout": { "type": "InIndex", "in_index": { "gen": 0, "layout": { "num_shards": 11, "hash_type": "Mod" } } } }, { "gen": 1, "layout": { "type": "InIndex", "in_index": { "gen": 1, "layout": { "num_shards": 23, "hash_type": "Mod" } } } } ] } }
检查存储桶重新划分状态:
语法
radosgw-admin reshard status --bucket BUCKET
示例
[ceph: root@host01 /]# radosgw-admin reshard status --bucket data
立即处理重新划分队列中的条目:
[ceph: root@host01 /]# radosgw-admin reshard process
取消待处理的存储桶重新划分:
警告您只能取消 待处理的 重新划分操作。不要取消 正在进行的 重新划分的操作。
语法
radosgw-admin reshard cancel --bucket BUCKET
示例
[ceph: root@host01 /]# radosgw-admin reshard cancel --bucket data
验证
检查存储桶重新划分状态:
语法
radosgw-admin reshard status --bucket BUCKET
示例
[ceph: root@host01 /]# radosgw-admin reshard status --bucket data
其他资源
- 请参阅 重新划分部分后清除存储桶条目的过时的实例,以移除过时的存储桶条目。
- 请参阅 手动重新划分存储桶索引。
- 请参阅在 简单部署中配置存储桶索引重新划分。
9.3.7. 在多站点配置中动态重新划分存储桶索引
Red Hat Ceph Storage 支持在多站点配置中重新划分动态存储桶索引。该功能允许在多站点配置中重新划分 bucket,而不中断其对象的复制。启用 rgw_dynamic_resharding
时,它会独立在每个区上运行,并且该区域可能会为同一 bucket 选择不同的分片计数。
这些步骤只需要遵循的步骤适用于现有的 Red Hat Ceph Storage 集群。在升级存储集群后,您需要在现有区和 zone group 上手动启用 重新划分
功能。
默认情况下支持并启用 zone 和 zone group。
您可以在其他区赶上前重新划分存储桶三次。如需了解更多详细信息,请参阅 存储桶索引重新划分的限制。
如果创建存储桶并上传超过 阈值的对象,以便动态重新划分,您需要继续将 I/O 写入旧存储桶以开始重新划分过程。
先决条件
- 两个站点上的 Red Hat Ceph Storage 集群都会升级到最新的版本。
- 两个站点上启用的所有 Ceph 对象网关守护进程都升级到最新版本。
- 所有节点的根级别访问权限。
流程
检查 zonegroup 上是否启用了
resharding
:示例
[ceph: root@host01 /]# radosgw-admin sync status
如果没有为
zonegroup
重新启用 zonegroup 功能来重新划分 zonegroup,然后继续操作。在安装 Ceph 对象网关的多站点配置中,在所有 zonegroups 上启用
重新划分
功能:语法
radosgw-admin zonegroup modify --rgw-zonegroup=ZONEGROUP_NAME --enable-feature=resharding
示例
[ceph: root@host01 /]# radosgw-admin zonegroup modify --rgw-zonegroup=us --enable-feature=resharding
更新周期和提交:
示例
[ceph: root@host01 /]# radosgw-admin period update --commit
在安装 Ceph 对象网关的多站点配置中,在所有区上启用
重新划分
功能:语法
radosgw-admin zone modify --rgw-zone=ZONE_NAME --enable-feature=resharding
示例
[ceph: root@host01 /]# radosgw-admin zone modify --rgw-zone=us-east --enable-feature=resharding
更新周期和提交:
示例
[ceph: root@host01 /]# radosgw-admin period update --commit
验证 zone 和 zonegroups 上是否启用了
重新划分
功能。您可以看到每个区都列出其supported_features
,zonegroups 会列出其enabled_features
示例
[ceph: root@host01 /]# radosgw-admin period get "zones": [ { "id": "505b48db-6de0-45d5-8208-8c98f7b1278d", "name": "us_east", "endpoints": [ "http://10.0.208.11:8080" ], "log_meta": "false", "log_data": "true", "bucket_index_max_shards": 11, "read_only": "false", "tier_type": "", "sync_from_all": "true", "sync_from": [], "redirect_zone": "", "supported_features": [ "resharding" ] "default_placement": "default-placement", "realm_id": "26cf6f23-c3a0-4d57-aae4-9b0010ee55cc", "sync_policy": { "groups": [] }, "enabled_features": [ "resharding" ]
检查同步状态:
示例
[ceph: root@host01 /]# radosgw-admin sync status realm 26cf6f23-c3a0-4d57-aae4-9b0010ee55cc (usa) zonegroup 33a17718-6c77-493e-99fe-048d3110a06e (us) zone 505b48db-6de0-45d5-8208-8c98f7b1278d (us_east) zonegroup features enabled: resharding
在本例中,为
us
zonegroup 启用了重新划分
功能。可选:您可以为 zonegroups 禁用
重新划分
功能:重要要在任何 singular zone 上禁用重新划分,请将该特定区域的
rgw_dynamic_resharding
配置选项设置为false
。在安装了 Ceph 对象网关的多站点中所有 zonegroups 上禁用该功能:
语法
radosgw-admin zonegroup modify --rgw-zonegroup=ZONEGROUP_NAME --disable-feature=resharding
示例
[ceph: root@host01 /]# radosgw-admin zonegroup modify --rgw-zonegroup=us --disable-feature=resharding
更新周期和提交:
示例
[ceph: root@host01 /]# radosgw-admin period update --commit
其它资源
- 有关动态 bucket 索引的更可配置的参数,请参阅 Red Hat Ceph Storage Object Gateway Configuration and Administration Guide 中的 Resharding bucket 索引动态 部分。
9.3.8. 手动重新划分存储桶索引
如果存储桶增长大于最佳初始配置,请使用 radosgw-admin bucket reshard
命令重新定义存储桶索引池。这个命令执行以下任务:
- 为指定存储桶创建新的 bucket 索引对象集合。
- 在这些 bucket 索引对象之间分发对象条目。
- 创建新的 bucket 实例。
- 使用存储桶链接新 bucket 实例,以便所有新的索引操作都通过新 bucket 索引进行。
- 将旧的和新的 bucket ID 打印到命令输出。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- Ceph 对象网关至少安装两个站点。
流程
备份原始存储桶索引:
语法
radosgw-admin bi list --bucket=BUCKET > BUCKET.list.backup
示例
[ceph: root@host01 /]# radosgw-admin bi list --bucket=data > data.list.backup
重新定义存储桶索引:
语法
radosgw-admin bucket reshard --bucket=BUCKET --num-shards=NUMBER
示例
[ceph: root@host01 /]# radosgw-admin bucket reshard --bucket=data --num-shards=100
验证
检查存储桶重新划分状态:
语法
radosgw-admin reshard status --bucket bucket
示例
[ceph: root@host01 /]# radosgw-admin reshard status --bucket data
其它资源
- 如需了解更多详细信息,请参阅 Red Hat Ceph Storage 对象网关指南中的 在多站点部署中配置存储桶索引重新划分。
- 请参阅动态重新划分存储桶索引。
- 请参阅在 简单部署中配置存储桶索引重新划分。
9.3.9. 重新划分后清理存储桶条目的过时的实例
重新划分过程可能无法自动清理存储桶条目的过时的实例,这些实例可能会影响存储集群的性能。
手动清理它们,以防止过时的实例对存储集群的性能造成负面影响。
在清理过时的实例前,请联系红帽支持。
仅在简单部署中使用这个步骤,而不在多站点集群中使用。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 安装了 Ceph 对象网关.
流程
列出过时的实例:
[ceph: root@host01 /]# radosgw-admin reshard stale-instances list
清理存储桶条目的过时的实例:
[ceph: root@host01 /]# radosgw-admin reshard stale-instances rm
验证
检查存储桶重新划分状态:
语法
radosgw-admin reshard status --bucket BUCKET
示例
[ceph: root@host01 /]# radosgw-admin reshard status --bucket data
9.3.10. 启用压缩
Ceph 对象网关支持利用任何 Ceph 的压缩插件对上传对象进行服务器端压缩。它们是:
-
zlib
:支持。 -
snappy
:支持。 -
zstd
:支持。
配置
要在区域的放置目标上启用压缩,请在 radosgw-admin zone placement modify
命令中提供 --compression=TYPE
选项。compression TYPE
指的是在编写新对象数据时要使用的压缩插件名称。
每个压缩对象存储压缩类型。更改设置不会影响解压缩现有压缩对象的能力,也不会强制 Ceph 对象网关重新压缩现有的对象。
此压缩设置适用于使用此放置目标上传到存储桶的所有新对象。
要禁用对区放置目标的压缩,请为 radosgw-admin zone placement modify
命令提供 --compression=TYPE
选项,并指定空字符串或 none
。
示例
[root@host01 ~] radosgw-admin zone placement modify --rgw-zone=default --placement-id=default-placement --compression=zlib { ... "placement_pools": [ { "key": "default-placement", "val": { "index_pool": "default.rgw.buckets.index", "data_pool": "default.rgw.buckets.data", "data_extra_pool": "default.rgw.buckets.non-ec", "index_type": 0, "compression": "zlib" } } ], ... }
在启用或禁用压缩后,重新启动 Ceph 对象网关实例,以便更改生效。
Ceph 对象网关创建 default
区域和一组池。对于生产环境部署,请参阅创建 Realm 部分。
Statistics
虽然所有现有命令和 API 都继续根据其未压缩数据报告对象和 bucket 大小,但 radosgw-admin bucket stats
命令包含所有存储桶的压缩统计信息。
radosgw-admin bucket stats
命令的使用类型是:
-
rgw.main
指的是常规条目或对象。 -
rgw.multimeta
是指未完成的多部分上传的元数据。 -
rgw.cloud
layer 指的是生命周期策略已过渡到云层的对象。当使用retain_head_object=true
配置时,head 对象会保留不再包含数据,但仍然可以通过 HeadObject 请求提供对象的元数据。这些 stub 头对象使用rgw.cloudlayer
类别。如需更多信息,请参阅 Red Hat Ceph Storage 对象网关指南中的 将数据转换到 Amazon S3 云服务 部分。
语法
radosgw-admin bucket stats --bucket=BUCKET_NAME
{
...
"usage": {
"rgw.main": {
"size": 1075028,
"size_actual": 1331200,
"size_utilized": 592035,
"size_kb": 1050,
"size_kb_actual": 1300,
"size_kb_utilized": 579,
"num_objects": 104
}
},
...
}
其大小
是存储桶中对象的积累大小,未压缩和未加密。size_kb
是以 KB 为单位的总大小,它计算为 ceiling (size/1024)
。在本例中,它是 ceiling (1075028/1024)= 1050
。
size_actual
是每个对象在一组 4096 字节块中分发后所有对象的累计大小。如果 bucket 有两个对象,大小为 4100 字节,另一个大小为 8500 字节,则第一个对象将向上舍入为 8192 字节,第二个对象舍入为 12288 字节,其存储桶的总数为 20480 字节。size_kb_actual
是实际大小(以 KB 为单位),计算为 size_actual/1024
。在本例中,它是 1331200/1024 = 1300
。
size_utilized
是压缩和/或加密后数据的总大小(以字节为单位)。加密可能会增加对象的大小,而压缩可能会减少它。size_kb_utilized
是以 KB 为单位的总大小,它计算为 ceiling (size_utilized/1024)
。在本例中,它是 ceiling (592035/1024)= 579
。