Rgw设置shard避免单bucket下数量过大导致性能下降的方法
一. 问题描述
在前期测试集群rgw性能的过程中,发现了bucket shard 的两个严重问题。
同一个bucket,在数量级越来越大的时候,性能下降非常厉害
测试过程中发现有一段时间内bucket无法进行读写,查看日志发现日志在进行动态的resharding
第一个问题,通过查看bucket的状态,可以发现,bucket 已经OVER 100%,官方的建议中,bucket的一个shard存储数据为十万 当数量级远远大于这个数的时候,性能就会急烈下降
# radosgw-admin bucket limit check
{
"bucket": "ceph_bucket2",
"tenant": "",
"num_objects": 26288031,
"num_shards": 1,
"objects_per_shard": 26288031,
"fill_status": "OVER 100.000000%"
}
第二个问题,L版开始,官方提供一个参数,可以在单个bucket 数量 over 100%的时候动态进行resharding,而且这个参数是默认开启的
rgw_dynamic_resharding = true
但是这个参数有个致命的缺陷,sharding过程中bucket无法进行读写,因为元数据对象正在重新分散索引,需要保证一致性,同时,数据量越大时间会越来越长。
二. 解决方案
为了解决上面两个问题
- 首先第一个需要做的是关闭动态resharding,不管怎么样不能影响到生产服务质量
预估单个bucket需要存放的对象数量,按照每个shard 十万数据,提前做好分片,这有个好处是,后期不需要再进行resharding
[global] rgw_dynamic_resharding = false
设置shard的两个方法
方法1:rgw_override_bucket_index_max_shards
the rgw_override_bucket_index_max_shards setting for simple configurations
rgw_override_bucket_index_max_shards : 配置在配置文件中,指定新建的bucket的shard数量,配置了这个参数,需要重启才能让参数生效。
方法2:multisite 中的 bucket_index_max_shards
the bucket_index_max_shards setting for multi-site configurations.
这个参数需要配置在multisite zonegroup中的配置中,会覆盖rgw_override_bucket_index_max_shards 参数
- 获取zonegroup
# radosgw-admin zonegroup --rgw-zonegroup=default get > /root/zonegroup.json { "id": "3c5cc9c6-7e31-46cd-ac6d-652ce466c879", "name": "default", "api_name": "", "is_master": "true", "endpoints": [], "hostnames": [], "hostnames_s3website": [], "master_zone": "b70f0b56-08a0-472a-880f-6114f593c972", "zones": [ { "id": "b70f0b56-08a0-472a-880f-6114f593c972", "name": "default", "endpoints": [], "log_meta": "false", "log_data": "false", "bucket_index_max_shards": 0, // 这个参数 "read_only": "false", "tier_type": "", "sync_from_all": "true", "sync_from": [] } ], "placement_targets": [ { "name": "default-placement", "tags": [] } ], "default_placement": "default-placement", "realm_id": "f43494f8-bfb6-4723-b169-6ba929cdca1c" }
修改 bucket_index_max_shards 参数
- 重新导入zonegroup
# radosgw-admin zonegroup --rgw-zonegroup=default set < /root/zonegroup.json { "id": "3c5cc9c6-7e31-46cd-ac6d-652ce466c879", "name": "default", "api_name": "", "is_master": "true", "endpoints": [], "hostnames": [], "hostnames_s3website": [], "master_zone": "b70f0b56-08a0-472a-880f-6114f593c972", "zones": [ { "id": "b70f0b56-08a0-472a-880f-6114f593c972", "name": "default", "endpoints": [], "log_meta": "false", "log_data": "false", "bucket_index_max_shards": 4, "read_only": "false", "tier_type": "", "sync_from_all": "true", "sync_from": [] } ], "placement_targets": [ { "name": "default-placement", "tags": [] } ], "default_placement": "default-placement", "realm_id": "f43494f8-bfb6-4723-b169-6ba929cdca1c"
- 提交配置,让配置生效,这一步不能少
# radosgw-admin period update --commit
这个参数会对所有在这个zonegroup下面的zone其效果,而且不需要重启