RadosGW 大索引

laurentbarbe
$ rados -p .default.rgw.buckets.index listomapkeys .dir.default.1970130.1 | wc -l
166768275

对于每个键包含 100 到 250 字节,这会使 rados 中的对象非常大(几个 GB)……尤其是在从一个 OSD 迁移到另一个 OSD 时(这将锁定所有写入),此外,包含此对象的 OSD 将使用大量内存……

自从 hammer 版本发布以来,就可以对 bucket 索引进行分片。但是,您无法对现有索引进行分片,但可以为新的 bucket 设置它。这对可扩展性来说是一件非常好的事情。

设置索引最大分片数

您可以指定新 bucket 的默认分片数

  • 按区域,在 regionmap 中
1
2
3
4
5
6
7
8
9
10
11
12
13
$ radosgw-admin region get
...
"zones": [
    {
        "name": "default",
        "endpoints": [
            "http:\/\/storage.example.com:80\/"
        ],
        "log_meta": "true",
        "log_data": "true",
        "bucket_index_max_shards": 8             <===
    },
...
  • 在 ceph.conf 中的 radosgw 部分(这将覆盖每个区域的值)
1
2
3
4
...
[client.radosgw.gateway]
rgw bucket index max shards = 8
....

验证:

$ radosgw-admin metadata get bucket:mybucket | grep bucket_id
            "bucket_id": "default.1970130.1"

$ radosgw-admin metadata get bucket.instance:mybucket:default.1970130.1 | grep num_shards
            "num_shards": 8,

$ rados -p .rgw.buckets.index ls | grep default.1970130.1
.dir.default.1970130.1.0
.dir.default.1970130.1.1
.dir.default.1970130.1.2
.dir.default.1970130.1.3
.dir.default.1970130.1.4
.dir.default.1970130.1.5
.dir.default.1970130.1.6
.dir.default.1970130.1.7

Bucket 列出影响:

对一个包含约 200k 个对象的 bucket 进行简单测试

num_shard时间 (s)
025
836
128109

因此,如果您不需要,请不要使用包含数千个分片的 bucket,因为 bucket 列出将会变得非常慢……

链接到蓝图

https://wiki.ceph.com/Planning/Blueprints/Hammer/rgw%3A_bucket_index_scalability