- 一、背景和问题
- 二、bucket reshard 过程
- 主集群信息汇总
- Multisite 下手动reshard
- References
一、背景和问题
默认情况下只有当单个bucket承载的object数量过多,导致omap过大会导致性能问题。在L 版之前需要线下reshard,从L 版开始支持线上自动reshard,默认rgw dynamic resharding 是开启的。但是在开启了Multisite的情况下,一旦对bucket进行了reshard操作,则会破坏原有的元数据对应规则,导致对应的bucket无法进行数据同步。所以L 版在后面的一个pr 禁用了multisite 下自动的reshard1。multisite 对于omap 过大的问题,需要手动reshard,生产环境上有很大风险。所以事先规划好bucket 对象数上限和num_shard 是必要的。
二、bucket reshard 过程主集群信息汇总
查看当前集群状态:
## ceph -s
查看当前主集群的存储桶列表:
## radosgw-admin bucket list
在存储桶数量不多的情况下,依次查看各个存储桶的状态信息,重点关注num shards, num_objects
## radosgw-admin bucket stats --bucket=test1
## rados -p default.rgw.buckets.index ls|grep <bucket-id>
获取IO 路径
## ceph osd map default.rgw.buckets.index .dir.a5ef9049-a15b-48b5-9a28-1692590e8752.24166.24.0 // 指定索引对象
Multisite 下手动reshard
1.查看主集群状态,确认同步完成,并没有新的写入:
[master]# radosgw-admin sync status
2.从集群检查
[slave]# radosgw-admin sync status
3.主集群上关闭对应bucket的sync
[master]# radosgw-admin sync disable --bucket=test1
[master]# radosgw-admin sync status --bucket=test1
4.主、备集群停掉所有RGW 服务
[master]# systemctl stop ceph-radosgw@rgw.`hostname -s`
[slave]# systemctl stop ceph-radosgw@rgw.`hostname -s`
5.主集群上的任意节点执行下面操作,手工对指定bucket 做reshard,记录对应的old bucket instance id:
[master]# radosgw-admin bucket reshard --bucket=test1 --num-shards=<N>
*** NOTICE: operation will not remove old bucket index objects ***
*** these will need to be removed manually ***
tenant:
bucket name: test1
old bucket instance id: e8921092-c7e8-42d8-80d1-5e83c25d5661.72254.1
new bucket instance id: e8921092-c7e8-42d8-80d1-5e83c25d5661.72437.1
total entries: 6
6.从集群删除bucket所有数据,同时清除bucket
[slave]# radosgw-admin bucket rm --purge-objects --bucket=test1
[slave]# radosgw-admin bucket list
7.主集群,删除旧bucket的bi信息
[master# radosgw-admin bi purge --bucket-id="" --bucket=test1
8.启动所有主、从节点上的rgw服务
[master]# systemctl start ceph-radosgw@rgw.`hostname -s`
[slave]# systemctl start ceph-radosgw@rgw.`hostname -s`
9.主集群重新开启对应bucket的sync,等待主集群里面的数据慢慢同步回从集群
[master]# radosgw-admin sync enable --bucket=test1
[master]# radosgw-admin sync status --bucket=test1