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 对象。重新划分存储桶索引在升级的单站点配置上动态工作,而无需对 zone 或 zone group 进行任何修改。单个站点配置可以是以下任意一个:- 没有 realm 的默认区配置。
- 一个具有至少一个域的非默认配置。
- 一个多站点配置。
9.3.2. 恢复存储桶索引
重新划分使用 bucket_index_max_shards = 0
创建的存储桶,从而移除存储桶的元数据。但是,您可以通过恢复受影响的存储桶来恢复存储桶索引。
/usr/bin/rgw-restore-bucket-index
工具在 /tmp
目录中创建临时文件。这些临时文件根据之前 bucket 中的 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
.Example
[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
工具,则它不会恢复站点 2 中的对象,反之亦然。在多站点上,应在存储桶的两个站点上执行恢复工具和对象 re-index 命令。
9.3.3. bucket 索引的限制重新划分
请谨慎使用以下限制:您的硬件选择会有影响,因此您应该始终与您的红帽客户团队讨论这些要求。
- 在需要重新划分前一个存储桶中的最大对象数量: 每个存储桶索引分片使用最多 102,400 对象。为了充分利用重新划分和最大化并行性,请在 Ceph 对象网关 bucket 索引池中提供足够数量的 OSD。这种并行化使用 Ceph 对象网关实例的数量进行扩展,并使用数字序列替换 in-order index shard enumeration。默认锁定超时从 60 秒延长至 90 秒。
- 使用分片时的最大对象数量: 基于之前的测试,当前支持的存储桶索引分片数量为 65521。红帽质量保证未对存储桶分片执行完整的可扩展性测试。
- 使用分片时的最大对象数量: 基于之前的测试,当前支持的存储桶索引分片数量为 65,521。
您可以在其他区赶上前重新划分存储桶三次 : 在旧的生成同步前,不建议重新划分存储桶。支持之前重新划分的四代存储桶。达到限制后,动态重新划分不会再次重新划分存储桶,直到至少有一种旧日志生成完全修剪。使用命令
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:
Example
[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
Example
[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
文件中:Example
[ceph: root@host01 /]# radosgw-admin zonegroup get > zonegroup.json
在
zonegroup.json
文件中,为每个命名区设置bucket_index_max_shards
参数:语法
bucket_index_max_shards = VALUE
使用计算的推荐分片数量替换 VALUE:
Example
bucket_index_max_shards = 12
重置 zone group:
Example
[ceph: root@host01 /]# radosgw-admin zonegroup set < zonegroup.json
更新周期:
Example
[ceph: root@host01 /]# radosgw-admin period update --commit
检查重新划分是否完成:
语法
radosgw-admin reshard status --bucket BUCKET_NAME
Example
[ceph: root@host01 /]# radosgw-admin reshard status --bucket data
验证
检查存储集群的同步状态:
Example
[ceph: root@host01 /]# radosgw-admin sync status
9.3.6. 动态重新划分存储桶索引
您可以通过将存储桶添加到重新划分队列来动态重新划分存储桶索引。它被调度为 resharded。重新划分线程在后台运行,并一次执行调度的重新划分。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 至少两个站点安装的 Ceph 对象网关。
流程
将
rgw_dynamic_resharding
参数设置为true
。Example
[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
秒。
Example
[ceph: root@host01 /]# ceph config set client.rgw rgw_reshard_num_logs 23
-
将存储桶添加到重新划分队列中:
语法
radosgw-admin reshard add --bucket BUCKET --num-shards NUMBER
Example
[ceph: root@host01 /]# radosgw-admin reshard add --bucket data --num-shards 10
列出重新划分队列:
Example
[ceph: root@host01 /]# radosgw-admin reshard list
检查存储桶日志生成和分片:
Example
[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
Example
[ceph: root@host01 /]# radosgw-admin reshard status --bucket data
立即处理重新划分队列中的条目:
[ceph: root@host01 /]# radosgw-admin reshard process
取消待处理的存储桶重新划分:
警告您只能取消 待处理的 重新划分操作。不要取消 正在进行的 重新划分的操作。
语法
radosgw-admin reshard cancel --bucket BUCKET
Example
[ceph: root@host01 /]# radosgw-admin reshard cancel --bucket data
验证
检查存储桶重新划分状态:
语法
radosgw-admin reshard status --bucket BUCKET
Example
[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。
您可以在其他区赶上前重新划分存储桶三次。如需了解更多详细信息,请参阅 bucket 索引的限制重新划分。
如果创建存储桶并上传超过用于动态重新划分的对象阈值,则需要继续将 I/O 写入旧存储桶,以开始重新划分过程。
先决条件
- 两个站点上的 Red Hat Ceph Storage 集群都会升级到最新的版本。
- 在两个站点启用的所有 Ceph 对象网关守护进程都升级到最新版本。
- 所有节点的根级别访问权限。
流程
检查 zonegroup 上是否启用了
resharding
:Example
[ceph: root@host01 /]# radosgw-admin sync status
如果没有为
zonegroup
重新启用 zonegroup 功能来重新划分 zonegroup,然后继续操作。在安装了 Ceph 对象网关的多站点配置中的所有 zonegroups 上启用
重新划分
功能:语法
radosgw-admin zonegroup modify --rgw-zonegroup=ZONEGROUP_NAME --enable-feature=resharding
Example
[ceph: root@host01 /]# radosgw-admin zonegroup modify --rgw-zonegroup=us --enable-feature=resharding
更新 period 和 commit:
Example
[ceph: root@host01 /]# radosgw-admin period update --commit
在安装了 Ceph 对象网关的多站点配置中的所有区上启用
重新划分
功能:语法
radosgw-admin zone modify --rgw-zone=ZONE_NAME --enable-feature=resharding
Example
[ceph: root@host01 /]# radosgw-admin zone modify --rgw-zone=us-east --enable-feature=resharding
更新 period 和 commit:
Example
[ceph: root@host01 /]# radosgw-admin period update --commit
验证在 zone 和 zonegroups 上启用了
重新划分
功能。您可以看到每个区都列出其supported_features
,zonegroups 会列出其enabled_features
Example
[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" ]
检查同步状态:
Example
[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 区域的重新划分,请在该特定区域上将
rgw_dynamic_resharding
配置选项设为false
。在安装了 Ceph 对象网关的多站点中所有 zonegroups 上禁用该功能:
语法
radosgw-admin zonegroup modify --rgw-zonegroup=ZONEGROUP_NAME --disable-feature=resharding
Example
[ceph: root@host01 /]# radosgw-admin zonegroup modify --rgw-zonegroup=us --disable-feature=resharding
更新 period 和 commit:
Example
[ceph: root@host01 /]# radosgw-admin period update --commit
其它资源
- 有关动态 bucket 索引的更可配置的参数重新划分,请参阅 Red Hat Ceph Storage Object Gateway Configuration and Administration Guide 中的 Resharding bucket index 部分。
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
Example
[ceph: root@host01 /]# radosgw-admin bi list --bucket=data > data.list.backup
重新定义存储桶索引:
语法
radosgw-admin bucket reshard --bucket=BUCKET --num-shards=NUMBER
Example
[ceph: root@host01 /]# radosgw-admin bucket reshard --bucket=data --num-shards=100
验证
检查存储桶重新划分状态:
语法
radosgw-admin reshard status --bucket bucket
Example
[ceph: root@host01 /]# radosgw-admin reshard status --bucket data
其它资源
- 如需了解更多详细信息,请参阅 Red Hat Ceph Storage Object Gateway 指南中的 配置存储桶索引重新划分多站点部署中。
- 请参阅动态重新划分存储桶索引。
- 请参阅在 简单部署中配置存储桶索引重新划分。
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
Example
[ceph: root@host01 /]# radosgw-admin reshard status --bucket data
9.3.10. 启用压缩
Ceph 对象网关支持利用任何 Ceph 的压缩插件对上传对象进行服务器端压缩。它们是:
-
zlib
:支持。 -
snappy
:支持。 -
zstd
:支持。
配置
要在区域的放置目标上启用压缩,请在 radosgw-admin zone placement modify
命令中提供 --compression=TYPE
选项。压缩 TYPE
指的是在编写新对象数据时要使用的压缩插件名称。
每个压缩对象存储压缩类型。更改设置不会影响解压缩现有压缩对象的能力,也不会强制 Ceph 对象网关重新压缩现有的对象。
此压缩设置适用于使用此放置目标上传到存储桶的所有新对象。
要在区域的放置目标上禁用压缩,请为 radosgw-admin zone placement modify
命令提供-- compression=TYPE
选项,并指定空字符串或 none
。
Example
[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
ier 是指生命周期策略过渡到云层的对象。使用retain_head_object=true
配置时,头对象保留在不再包含数据后面,但仍然可以通过 HeadObject 请求提供对象的元数据。这些 stub 头对象使用rgw.cloudier
类别。如需更多信息,请参阅 Red Hat Ceph Storage Object Gateway 指南中的 过渡到 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)
。在本例中,它被接收 (1075028/1024)= 1050
。
size_actual
是每个对象分布在一组 4096 字节块中后所有对象的总大小。如果 bucket 有两个对象,一个大小为 4100 字节,另一个大小为 8500 字节,第一个对象将舍入到 8192 字节,第二个对象则舍入到 12288 字节,并且 bucket 的总数为 20480 字节。size_kb_actual
是以 KB 为单位的实际大小,它计算为 size_actual/1024
。在本例中,它是 1331200/1024 = 1300
。
size_utilized
是压缩和/或加密后数据的总大小,以字节为单位。加密可以增加对象的大小,而压缩可能会减小它。size_kb_utilized
是以 KB 为单位的总大小,它计算为 ceiling (size_utilized/1024)
。在本例中,它被接收 (592035/1024)= 579
。