目录
  • 一、背景和问题
  • 二、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