改进持久 Bucket 通知并行性

Adarsh Ashokan

改进持久化 Bucket 通知并行性

问题描述

持久化 Bucket 通知最初是在 Ceph Pacific 中作为 RADOS Gateway (RGW) 项目的一部分推出。
有关背景信息,请参阅 ceph.io 上的现有博客文章

简而言之,本文讨论的是如何提高持久化 Bucket 通知性能。

当前,该实现并未完全利用 RADOS 的分布式能力。每个主题都绑定到一个 2 Phase Commit 队列,该队列由单个 RADOS 对象实现。

这种设计会产生瓶颈。分片队列实现允许将通知分布到多个 RADOS 对象,从而通过多个 OSD 进行并行写入。


已完成的工作

  • 在旧的设计中,每个主题映射到一个 RADOS 对象(一个 2 Phase Commit 队列)。
  • 在新设计中,每个主题映射到多个 RADOS 对象(多个 2 Phase Commit 队列对象)。

与主题关联的每个 2 段提交队列 RADOS 对象称为分片。

分片的数量可以通过中央配置选项 rgw_bucket_persistent_notif_num_shards 进行配置。

  • 默认值:11
  • 注意:现有主题不会重新分片。要将此功能扩展到现有主题,您必须删除并重新创建主题。

主题管理

主题操作已更新以支持分片队列

操作行为
创建主题创建多个 RADOS 对象作为分片
删除主题删除所有关联的分片
设置主题支持切换持久化 ↔ 非持久化,并在需要时清理分片

设计细节

入队

  • 保证每个 key(bucket 中的每个对象)级别的顺序。
  • 目标分片使用以下公式计算
hash("bucket:object") % (# of shards)
  • 计算完成后,通知将被排入所选的分片中。

  • 主题的分片命名方式如下。

    • 第一个分片命名为 topic_name,以确保不知道分片的旧 RGW 实例仍然可以将通知排入有效的队列。
    • 其他分片从 1 到 (n - 1) 命名为 topic_name.x,其中 x 在 1(n-1) 之间。

管理员可以使用 rados ls 命令在 RADOS 对象池中验证创建的分片。

##inside /build dir
bin/rados -c ceph.conf ls --pool default.rgw.log --namespace notif
示例
### create a persistent topic called fishtopic
$ bin/rados -c ceph.conf ls --pool default.rgw.log --namespace notif | grep fishtopic
:fishtopic.7
:fishtopic.5
:fishtopic.2
:fishtopic.10
:fishtopic.1
:fishtopic.4
:fishtopic.8
:fishtopic
:fishtopic.3
:fishtopic.6
:fishtopic.9

注意::fishtopic 是第一个分片的名称,以支持向后兼容性和具有不同版本 RGW 的集群。

出队

  • 主要区别在于分片设置中,每个分片被视为一个独立的队列,可以由不同的 RGW 处理。即使主题数量较少,这也能更好地在 RGW 之间实现负载均衡。

其他受影响的区域

  • 主题转储统计信息:此命令现在聚合主题的所有分片,以确定大小和计数。

限制和注意事项

  • 在升级期间创建的主题的 key 顺序在升级期间无法保证。
    • 在混合集群中,旧的 RGW 不知道分片,并且始终排入第一个分片。

基准测试设置

性能测试是在以下机器上使用下面描述的设置运行的。

  • 机器规格
 lsblk
NAME           MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda              8:0    0 893.8G  0 disk
└─sda1           8:1    0 893.7G  0 part /
nvme1n1        259:0    0   1.5T  0 disk
nvme0n1        259:1    0   1.5T  0 disk
├─vg_nvme-lv_1 253:0    0  89.4G  0 lvm
├─vg_nvme-lv_2 253:1    0  89.4G  0 lvm
├─vg_nvme-lv_3 253:2    0  89.4G  0 lvm
├─vg_nvme-lv_4 253:3    0  89.4G  0 lvm
└─vg_nvme-lv_5 253:4    0  14.9G  0 lvm  /var/lib/ceph
nvme3n1        259:2    0   1.5T  0 disk
nvme4n1        259:3    0   1.5T  0 disk
nvme2n1        259:4    0   1.5T  0 disk
nvme6n1        259:5    0   1.5T  0 disk
nvme5n1        259:6    0   1.5T  0 disk
nvme7n1        259:7    0   1.5T  0 disk
  • 使用 vstart 进行基线通知设置的集群设置 - rgw_bucket_persistent_notif_num_shards 设置为 1。
sudo MON=1 OSD=2 MDS=0 MGR=0 RGW=1 ../src/vstart.sh -n -X --nolockdep --bluestore \
    -o "rgw_bucket_persistent_notif_num_shards=1" \
    --bluestore-devs "/dev/nvme7n1,/dev/nvme6n1,/dev/nvme5n1,/dev/nvme4n1,/dev/nvme3n1,/dev/nvme2n1" \
    -o "bluestore_block_size=1500000000000" -o "rgw_max_concurrent_requests=8192" \
    -o "rgw_dynamic_resharding=false" -o "osd_pool_default_pg_num=128" -o "osd_pool_default_pgp_num=128" \
    -o "mon_max_pg_per_osd=32768" -o "mon_pg_warn_max_per_osd=32768" -o "osd_pool_default_pg_autoscale_mode=warn"
  • 设置持久化通知
aws --region=default --endpoint-url https://:8000 sns create-topic --name=fishtopic0  \
  --attributes='{"push-endpoint": "kafka://", "persistent": "true"}'
aws --region=default --endpoint-url https://:8000 s3api put-bucket-notification-configuration \
  --bucket bk000000000000 --notification-configuration='{"TopicConfigurations": [{"Id": "notif1", "TopicArn": "arn:aws:sns:default::fishtopic0", "Events": []}]}'
  • 现在在 build 目录下将 rgw_bucket_persistent_notif_num_shards 更改为 11。
bin/ceph config set client.rgw.8000 rgw_bucket_persistent_notif_num_shards 11 --conf /ceph.conf
  • 创建具有此设置的新主题和通知。
aws --region=default --endpoint-url https://:8000 sns create-topic --name=fishtopic1  \
  --attributes='{"push-endpoint": "kafka://", "persistent": "true"}'
aws --region=default --endpoint-url https://:8000 s3api put-bucket-notification-configuration \
  --bucket bk000000000000 --notification-configuration='{"TopicConfigurations": [{"Id": "notif1", "TopicArn": "arn:aws:sns:default::fishtopic1", "Events": []}]}'
  • 将此运行的结果与基线性能进行比较,其中 rgw_bucket_persistent_notif_num_shards 设置为默认值(即 11)。

性能统计信息

小对象(4 KB)

  • 无通知
PUT:  542,690 ops (IO/s: 9,044, Lat avg: 7.1 ms)
DEL:  542,690 ops (IO/s: 9,768, Lat avg: 6.5 ms)
  • 有通知,1 个分片(rgw_bucket_persistent_notif_num_shards=1
PUT:  191,572 ops (IO/s: 3,192, Lat avg: 20.0 ms)
DEL:  191,572 ops (IO/s: 3,204, Lat avg: 20.0 ms)
  • 有通知,11 个分片(默认值)
PUT:  363,486 ops (IO/s: 6,057, Lat avg: 10.6 ms)
DEL:  363,486 ops (IO/s: 6,428, Lat avg: 10.0 ms)
  • 旧代码(更改前)≈ 单个分片性能。

中等对象(4 MB)

通知开销较小,因为通知大小(~1 KB)相对于对象大小(4 MB)较小。

  • 无通知
PUT:  24,034 ops (IO/s: 400, Lat avg: 159.9 ms)
DEL:  24,014 ops (IO/s: 8,862, Lat avg: 7.2 ms)
  • 有通知,1 个分片
PUT:  22,167 ops (IO/s: 369, Lat avg: 173.3 ms)
DEL:  22,167 ops (IO/s: 3,027, Lat avg: 21.1 ms)
  • 有通知,11 个分片
PUT:  24,848 ops (IO/s: 413, Lat avg: 154.7 ms)
DEL:  24,848 ops (IO/s: 6,342, Lat avg: 10.1 ms)