改进持久 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)