最近折腾了一下关于ceph中关于multi-site的一些东西,有不少坑,踩完之后感觉还是爽爽的。
写在前面
松鼠哥的ceph专业课程上线啦!
面向新手同学,从0实战,全面入门ceph安装部署与运维,有需要的同学赶紧联系松鼠哥订购吧:
shard的具体数据在很多时候都可以固定下来,但是对于具体业务可能还需要进行适配。
问题引入
ceph集群上线后,稳定性阶段暴露了一些问题,除了分区划分的一些估计问题外,比较棘手的一个问题是,bucket分片浪费的问题;在ceph.conf中,我们手动配置了rgw_override_bucket_index_max_shards
参数,使得bucket在一定程度上保证不会有索引分片方面的性能问题,那么问题来了,手动设置该值,是让集群的bucket在一开始就分好片,产生的大量分片为即将进行的数据存储做好了准备,但是,线上业务反映,每天写入的文件量远不及我们一开始的配置,在分片数设置为768的情况下,单个bucket可以容纳7千6百80万个文件,而线上的业务进来的文件每天只有百万级别,事先分好的片不但浪费掉了,而且在持续写入之后会有性能不友好的问题,那么有没有办法在创建bucket的时候就可以设置分片值,这样能很大程度减少浪费问题
问题的解决
经过调查,修改bucket_index_max_shards的方法有两个,第一个是修改配置文件ceph.conf中的rgw_override_bucket_index_max_shards
字段,配置push后要重启所有相关的rgw实例,这个我们不能接受,每次修改都要影响到业务是不可取的,另外一个是通过zonegroup的方法来进行修改
zone相关概念的介绍
在ceph中,针对不同的部署,尤其是大规模部署,有一个非常清晰的划分方法,它针对不同区域、设备对集群资源进行划分
- 1、realm - 这是ceph中的顶级域,是一个全局的命名空间
- 2、zonegroup - 这是zone组,包含多个zone,而zonegroup属于某个realm
- 3、zone - 一个zone大致可以对应一个机房的一系列设备,zone属于某个zonegroup
- 4、rgw - rgw实例属于某个zone,zone内包含了它所管理的一组rgw实例
在luminous 12.2.5中,我们可以使用zonegroup的配置对其下所有的zone和rgw实例做出bucket_index_max_shards的配置
使用zone的相关操作
使用zone相关功能,需要先创建它,这里摘录ceph官方的资料
1、创建rgw实例
1 | ceph-deploy rgw create xxx xxx |
rgw实例创建之后,会默认创建几个存储池,这些存储池属于default的zone,但是他们并不完整,要全部删掉
1 | for x in `sudo ceph osd pool ls`;do sudo ceph osd pool delete $x $x --yes-i-really-really-mean-it;done |
2、手动创建存储池,这些存储池是对应的zone使用的存储池
1 | sudo ceph osd pool create .rgw.root 32 32 replicated_rule |
3、创建realm
1 | sudo radosgw-admin realm create --rgw-realm=tupu-realm --default |
4、创建zonegroup
1 | sudo radosgw-admin zonegroup create --rgw-zonegroup=my-zonegroup --endpoints=http://192.168.52.205:7480 --rgw-realm=tupu-realm --master --default |
5、创建zone
1 | sudo radosgw-admin zone create --rgw-zonegroup=my-zonegroup --rgw-zone=my-zone1 --endpoints=http://192.168.52.205:7480,http://192.168.52.206:7480 --default --master |
6、提交修改
1 | sudo radosgw-admin period update --commit |
7、所有存储池加入到mon监控中
1 | for x in `sudo ceph osd pool ls`;do sudo ceph osd pool application enable $x mon ;done |
8、创建s3 的system用户
1 | sudo radosgw-admin user create --uid="mimi" --display-name="mimi-s3-system" --system --secret-key=K11BFkHYgw --access-key=R4O6G8ZYDH |
9、修改并提交到zonegroup
1 | sudo radosgw-admin zone modify --rgw-zone=my-zone1 --access-key=R4O6G8ZYDH --secret=K11BFkHYgw |
10、重启rgw实例
1 | systemctl start ceph-radosgw@rgw.`hostname -s` |
11、导出zonegroup配置并进行修改
1 | sudo radosgw-admin zonegroup get > zonegroup.json |
12、导入配置并使其生效
1 | sudo radosgw-admin zonegroup set < zonegroup.json |
至此,就完成了rgw实例的bucket_index_max_shards的修改,可通过查看bucket的配置来确认分片配置已经生效
注意
在配置realm和zonegroup前就创建好rgw,如果创建realm和zonegroup等之后,再创建rgw实例,创建的realm和zonegroup会被rgw实例的配置所覆盖,无法按预期进行使用
实际效果
使用计划任务进行动态bucket检测并通过算法修改shard值得到的效果如下:
参考资料
MULTI-SITE
对象存储跨区灾备 - RGW MultiSite
- 本文作者: 奋斗的松鼠
- 本文链接: http://www.strugglesquirrel.com/2018/06/27/动态设置bucket-index-max-shards参数/
- 版权声明: 本博客所有文章除特别声明外,创作版权均为作者个人所有,未经允许禁止转载!