一、ceph shard背景
默认情况下单个bucket的索引对象index全部存储在一个shard文件(shard数量为0,主要以OMAP-keys方式存储在rocksdb中),随着单个bucket内的Object数量增加,整个shard文件的体积也在不断增长,当shard文件体积过大就会引发各种问题。而且在并发读写的场景,都去更新同一个shard文件,这个索引对象就会成为新的瓶颈,影响性能。
因此需要对桶做分片,避免该对象随着上传对象的逐渐增多而变得越来越大,引发各种问题。但分片也不能切分太多,分片过多会影响对索引对象的读操作效率,本来list 桶只需要读一个shard文件,现在需要读多个shard分片,并且这些shard分散在多个osd上,读完后还要做结果合并,会降低对象索引查询的性能。
每个存储到rados的Object都需要先计算出对应元数据存储的shard number,之后再将元数据信息更新到shard number对应的Object里面。
二、reshard简介
reshard是将指定桶的分片数重新划分,如将原64分片的桶reshard为2048分片,在reshard过程中该桶可读不可写。整个reshard的过程可以简单地划分为copy和remove两部分,其中copy是将原shard中的kv读出,依次写入新shard中;remove是在copy阶段完成后,将原shard对应的rados对象删除。
当前ZOS创桶默认分片数为2048,建议的单桶对象上限为4亿,但对于早期创建的桶,其分片数可能仍保持一个较低的值,在这种场景下如果单个bucket承载的object数量过多,导致omap过大会导致性能问题。由于reshard时会导致桶可读不可写,会带来性能和业务受损,ZOS默认rgw dynamic resharding是关闭的。对于上述omap过大的问题,需要手动reshard,生产环境上有很大风险,所以事先规划好bucket 对象数上限和桶的分片数是必要的。
三、reshard操作
1.查看存储桶的状态信息,重点关注num shards, num_objects
radosgw-admin bucket stats --bucket {bucket_name}
2.指定该桶进行reshard
radosgw-admin bucket reshard --bucket {bucket_name} --num-shards {target_shard_num} --yes-i-really-mean-it
3.再次查看存储桶的状态信息
radosgw-admin bucket stats --bucket {bucket_name}
完成上述操作后,该存储桶的建议对象数上限由1200w提高到4亿。