背景:
很多人对ceph,rgw的性能问题不太满意,主要是index pool(默认是存在一个shard里面,当一个shard越来越大时,一种极端情况是把相关的osd占满)的瓶颈,当然网上也有人提到了产生一些问题,主要问题如下:
对index pool进行scrub或deep-scrub的时候,如果shard对应的Object过大,会极大消耗底层存储设备性能,造成io请求超时。
底层deep-scrub的时候耗时过长,会出现request blocked,导致大量http请求超时而出现50x错误,从而影响到整个RGW服务的可用性。
当坏盘或者osd故障需要恢复数据的时候,恢复一个大体积的shard文件将耗尽存储节点性能,甚至可能因为OSD响应超时而导致整个集群出现雪崩。
改进方式:
考虑一个场景
如果你向ceph 上传对象时,同时也在本地或别的地方记录了元数据信息,你就可以避免使用index pool,同时也分担了ceph存储的压力。
使用indexless将会是一个不错的选择。
网址:http://www.ksingh.co.in/blog/2017/01/30/ceph-indexless-bucket-part-2/
这个网址写的已经很全了。我就不费太多口舌。
验证是否设置好indexless,可以通过radosgw-admin 去查
例如:radosgw-admin bucket stats --bucket=bucket3
有一个index_type,normal是具有索引的对象存储,别的indexless的。
另外一种是采取分片+快池的方式详情请查看https://cloud.tencent.com/developer/article/1032858
注意事项:
1.设置完indexless 不会对之前的buket的类型有影响
2.通过indexless 设置的bucket 如果里面有数据,不会给你警告,会给你直接删除bucket,object会处于游离态
3.普通 bucket 可以通过上述命令查看数量,但是indexless 看不了,usage信息不存在。
4.删除bucket不会删除里面的对象 ,但是删除方式现在只能管理员操作rgw pool来删除,需要结合一定pool 文件命名格式去删,查看rgw object bucket 存储位置以及在pool里面对象名称命名方式 (后续文档介绍),当然通过你得知道下bucket_id。
5.设置生命周期,未到时间点人为删除bucket ,删除bucket ,内部游离的object 不会随生命周期而操作。