From 55902e92046214d03dabe8fbe873089c6cae6fb4 Mon Sep 17 00:00:00 2001 From: tonyxuqqi Date: Wed, 24 Jan 2024 21:49:01 -0800 Subject: [PATCH 1/6] update titan doc to provide guidline on min-blob-size Signed-off-by: tonyxuqqi --- storage-engine/titan-configuration.md | 2 +- storage-engine/titan-overview.md | 21 ++++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/storage-engine/titan-configuration.md b/storage-engine/titan-configuration.md index 8c5ad50a0d6f..6c5b3c7060b8 100644 --- a/storage-engine/titan-configuration.md +++ b/storage-engine/titan-configuration.md @@ -82,7 +82,7 @@ Titan 对 RocksDB 兼容,也就是说,使用 RocksDB 存储引擎的现有 T ### `min-blob-size` -你可以通过设置 [`min-blob-size`](/tikv-configuration-file.md#min-blob-size) 来调整 value 的大小阈值,决定哪些数据保存在 RocksDB 中,哪些数据保存在 Titan 的 blob file 中。经过测试,`32KB` 是个折中的值。如果你想进一步提升写性能,并能接受扫描性能的下降,你可以将该值调整为 `1KB`。 +你可以通过设置 [`min-blob-size`](/tikv-configuration-file.md#min-blob-size) 来调整 value 的大小阈值,决定哪些数据保存在 RocksDB 中,哪些数据保存在 Titan 的 blob file 中。`32KB` 是个折中的值,它确保Titan的使用相对RocksDB没有回退,但对很多场景来说不是最佳的值。建议参考[`min-blob-size对性能的影响`](/storage-engine/titan-overview.md#min-blob-size对性能影响)来选择合适的值。如果你想进一步提升写性能,并能接受扫描性能的下降,你可以最低将该值调整为 `1KB`。 ### `blob-file-compression` 和 `zstd-dict-size` diff --git a/storage-engine/titan-overview.md b/storage-engine/titan-overview.md index 5c6f65ed334c..33f83f84a4ab 100644 --- a/storage-engine/titan-overview.md +++ b/storage-engine/titan-overview.md @@ -52,7 +52,7 @@ BlobFile 的实现上有几点值得关注的地方: + BlobFile 中的 key-value 是有序存放的,目的是在实现 iterator 的时候可以通过 prefetch 的方式提高顺序读取的性能。 + 每个 blob record 都保留了 value 对应的 user key 的拷贝,这样做的目的是在进行 GC 的时候,可以通过查询 user key 是否更新来确定对应 value 是否已经过期,但同时也带来了一定的写放大。 -+ BlobFile 支持 blob record 粒度的 compression,并且支持多种 compression algorithm,包括 [Snappy](https://github.com/google/snappy)、[LZ4](https://github.com/lz4/lz4) 和 [Zstd](https://github.com/facebook/zstd) 等,目前 Titan 默认使用的 compression algorithm 是 LZ4。 ++ BlobFile 支持 blob record 粒度的 compression,并且支持多种 compression algorithm,包括 [Snappy](https://github.com/google/snappy)、[LZ4](https://github.com/lz4/lz4) 和 [Zstd](https://github.com/facebook/zstd) 等,在7.6之前的版本Titan 默认使用的 compression algorithm 是 LZ4, 7.6之后默认使用ZSTD。 > **注意:** > @@ -122,3 +122,22 @@ Range Merge 是基于 Level Merge 的一个优化。考虑如下两种情况, ### 扩容与缩容 基于向后兼容的考虑,TiKV 在扩缩容时的 Snapshot 仍然是 RocksDB 的格式。因此扩容后的节点由于一开始全部来自 RocksDB,因此会显示 RocksDB 的特征,比如压缩率会高于老的 TiKV 节点、Store Size 会较小、同时 Compaction 的写放大会相对较大。后续这些 RocksDB 格式的 SST 参与 Compaction 之后逐步转换为 Titan 格式。 + +### min-blob-size对性能影响 + +`min-blob-size` 是一个Value是否用Titan存储的依据。如果Value大于等于`min-blob-size`会用Titan存储,反之则用RocksDB原生的格式。当`min-blob-size`太小或太大都会导致性能下降。以下表格列举了ycsb这个负载在不同`min-blob-size`值时的QPS对比。每一轮测试中测试数据的行宽和`min-blob-size`相等,从而保证Titan启用时数据能真正存在Titan中。 + +| `min-blob-size`| pointget | pointget(titan)| scan100 | scan100(titan)| scan10000 | scan10000(titan)| update | update titan | +| ---------------- | ---------| -------------- | --------| ------------- | --------- | --------------- | ------ | ------------ | +|1KB | 139255 | 140486 | 25171 | 21854 | 533 | 175 | 17913 | 30767 | +| 2KB | 114201 |124075 | 12466 |11552 |249 |131 |10369 |27188 | +| 4KB | 92385 | 103811 | 7918 | 5937 | 131 | 87 | 5327 | 22653 | +|8KB |104380 | 130647 | 7365 | 5402 | 86.6| 68|3180| 16745| +|16KB| 54234 | 54600 | 4937 |5174 | 55.4 |58.9 |1753| 10120 | +|32KB| 31035|31052|2705|3422|38|45.3|984|5844| + +> **注意:** +> +> scan100是指scan 100条记录,scan10000指scan 10000条记录。 + +以上可见,当行宽是`16 KB`时,Titan在所有YCSB细分负载下上都超过了RocksDB。然而在一些极端重度扫描场景下如Dumpling,`16 KB`行宽下Titan的性能还是会有10%左右的回退。因此,如果负载是写和点查为主,建议`min-blob-size`调整为`1 KB`;如果负载有大量扫描,建议`min-blob-size`调整为至少`16 KB`。 \ No newline at end of file From b4a34ceaa53bcd2510fb7be5ef35bd3dbf315c07 Mon Sep 17 00:00:00 2001 From: xixirangrang Date: Thu, 25 Jan 2024 16:38:11 +0800 Subject: [PATCH 2/6] Apply suggestions from code review Co-authored-by: Cathy <24819510+benmaoer@users.noreply.github.com> --- storage-engine/titan-configuration.md | 2 +- storage-engine/titan-overview.md | 26 ++++++++++++++------------ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/storage-engine/titan-configuration.md b/storage-engine/titan-configuration.md index 6c5b3c7060b8..680bbdb5a6e2 100644 --- a/storage-engine/titan-configuration.md +++ b/storage-engine/titan-configuration.md @@ -82,7 +82,7 @@ Titan 对 RocksDB 兼容,也就是说,使用 RocksDB 存储引擎的现有 T ### `min-blob-size` -你可以通过设置 [`min-blob-size`](/tikv-configuration-file.md#min-blob-size) 来调整 value 的大小阈值,决定哪些数据保存在 RocksDB 中,哪些数据保存在 Titan 的 blob file 中。`32KB` 是个折中的值,它确保Titan的使用相对RocksDB没有回退,但对很多场景来说不是最佳的值。建议参考[`min-blob-size对性能的影响`](/storage-engine/titan-overview.md#min-blob-size对性能影响)来选择合适的值。如果你想进一步提升写性能,并能接受扫描性能的下降,你可以最低将该值调整为 `1KB`。 +你可以通过设置 [`min-blob-size`](/tikv-configuration-file.md#min-blob-size) 来调整 value 的大小阈值,决定哪些数据保存在 RocksDB 中,哪些数据保存在 Titan 的 blob file 中。`32KB` 是个折中的值,它能确保 Titan 的性能相对 RocksDB 没有回退。但在很多场景中,该值并不是最佳值。建议参考 [`min-blob-size对性能的影响`](/storage-engine/titan-overview.md#min-blob-size对性能影响) 来选择合适的值。如果你想进一步提升写性能,并能接受扫描性能的下降,你可以将该值最低调整为 `1KB`。 ### `blob-file-compression` 和 `zstd-dict-size` diff --git a/storage-engine/titan-overview.md b/storage-engine/titan-overview.md index 33f83f84a4ab..59d2f045777b 100644 --- a/storage-engine/titan-overview.md +++ b/storage-engine/titan-overview.md @@ -52,7 +52,7 @@ BlobFile 的实现上有几点值得关注的地方: + BlobFile 中的 key-value 是有序存放的,目的是在实现 iterator 的时候可以通过 prefetch 的方式提高顺序读取的性能。 + 每个 blob record 都保留了 value 对应的 user key 的拷贝,这样做的目的是在进行 GC 的时候,可以通过查询 user key 是否更新来确定对应 value 是否已经过期,但同时也带来了一定的写放大。 -+ BlobFile 支持 blob record 粒度的 compression,并且支持多种 compression algorithm,包括 [Snappy](https://github.com/google/snappy)、[LZ4](https://github.com/lz4/lz4) 和 [Zstd](https://github.com/facebook/zstd) 等,在7.6之前的版本Titan 默认使用的 compression algorithm 是 LZ4, 7.6之后默认使用ZSTD。 ++ BlobFile 支持 blob record 粒度的压缩,并且支持多种压缩算法,包括 [Snappy](https://github.com/google/snappy)、[`lz4`](https://github.com/lz4/lz4) 和 [`zstd`](https://github.com/facebook/zstd)。在 v7.6.0 之前的版本,Titan 默认使用的压缩算法是 `lz4`。v7.6.0 之后,默认使用 `zstd`。 > **注意:** > @@ -123,21 +123,23 @@ Range Merge 是基于 Level Merge 的一个优化。考虑如下两种情况, 基于向后兼容的考虑,TiKV 在扩缩容时的 Snapshot 仍然是 RocksDB 的格式。因此扩容后的节点由于一开始全部来自 RocksDB,因此会显示 RocksDB 的特征,比如压缩率会高于老的 TiKV 节点、Store Size 会较小、同时 Compaction 的写放大会相对较大。后续这些 RocksDB 格式的 SST 参与 Compaction 之后逐步转换为 Titan 格式。 -### min-blob-size对性能影响 +### `min-blob-size` 对性能影响 -`min-blob-size` 是一个Value是否用Titan存储的依据。如果Value大于等于`min-blob-size`会用Titan存储,反之则用RocksDB原生的格式。当`min-blob-size`太小或太大都会导致性能下降。以下表格列举了ycsb这个负载在不同`min-blob-size`值时的QPS对比。每一轮测试中测试数据的行宽和`min-blob-size`相等,从而保证Titan启用时数据能真正存在Titan中。 +[`min-blob-size`](/tikv-configuration-file.md#min-blob-size) 是决定一个 Value 是否用 Titan 存储的依据。如果 Value 大于或等于 `min-blob-size`,会用 Titan 存储,反之则用 RocksDB 的原生格式存储。`min-blob-size` 太小或太大都会导致性能下降。 -| `min-blob-size`| pointget | pointget(titan)| scan100 | scan100(titan)| scan10000 | scan10000(titan)| update | update titan | +下表格列举了 YCSB 这个负载在不同 `min-blob-size` 值时的 QPS 对比。每一轮测试中测试数据的行宽和 `min-blob-size` 相等,从而确保 Titan 启用时数据保存在 Titan 中。 + +| 行宽 (Bytes) | `Point_Get` | `Point_Get` (Titan)| scan100 | scan100 (Titan)| scan10000 | scan10000 (Titan)| `UPDATE` | `UPDATE` (Titan) | | ---------------- | ---------| -------------- | --------| ------------- | --------- | --------------- | ------ | ------------ | -|1KB | 139255 | 140486 | 25171 | 21854 | 533 | 175 | 17913 | 30767 | -| 2KB | 114201 |124075 | 12466 |11552 |249 |131 |10369 |27188 | -| 4KB | 92385 | 103811 | 7918 | 5937 | 131 | 87 | 5327 | 22653 | -|8KB |104380 | 130647 | 7365 | 5402 | 86.6| 68|3180| 16745| -|16KB| 54234 | 54600 | 4937 |5174 | 55.4 |58.9 |1753| 10120 | -|32KB| 31035|31052|2705|3422|38|45.3|984|5844| +| 1KB | 139255 | 140486 | 25171 | 21854 | 533 | 175 | 17913 | 30767 | +| 2KB | 114201 |124075 | 12466 |11552 |249 |131 |10369 | 27188 | +| 4KB | 92385 | 103811 | 7918 | 5937 | 131 | 87 | 5327 | 22653 | +| 8KB |104380 | 130647 | 7365 | 5402 | 86.6 | 68 | 3180 | 16745 | +| 16KB | 54234 | 54600 | 4937 | 5174 | 55.4 | 58.9 |1753 | 10120 | +| 32KB | 31035 |31052 | 2705 | 3422 | 38 | 45.3 | 984 | 5844 | > **注意:** > -> scan100是指scan 100条记录,scan10000指scan 10000条记录。 +> `scan100` 是指扫描 100 条记录,`scan10000` 是指扫描 10000 条记录。 -以上可见,当行宽是`16 KB`时,Titan在所有YCSB细分负载下上都超过了RocksDB。然而在一些极端重度扫描场景下如Dumpling,`16 KB`行宽下Titan的性能还是会有10%左右的回退。因此,如果负载是写和点查为主,建议`min-blob-size`调整为`1 KB`;如果负载有大量扫描,建议`min-blob-size`调整为至少`16 KB`。 \ No newline at end of file +以上可见,当行宽是 `16KB` 时,Titan 在所有 YCSB 细分负载下上都超过了 RocksDB。然而在一些极端重度扫描场景下,如运行 Dumpling,`16KB` 行宽下 Titan 的性能会有约 10% 的回退。因此,如果负载是以写和点查为主,建议将 `min-blob-size` 调整为 `1KB`;如果负载有大量扫描,建议将 `min-blob-size` 调整为至少 `16KB`。 \ No newline at end of file From a2b74894049fbee205565df35f5a09c26d151e51 Mon Sep 17 00:00:00 2001 From: xixirangrang Date: Thu, 25 Jan 2024 16:38:36 +0800 Subject: [PATCH 3/6] Update storage-engine/titan-overview.md --- storage-engine/titan-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage-engine/titan-overview.md b/storage-engine/titan-overview.md index 59d2f045777b..1c639f9cabee 100644 --- a/storage-engine/titan-overview.md +++ b/storage-engine/titan-overview.md @@ -123,7 +123,7 @@ Range Merge 是基于 Level Merge 的一个优化。考虑如下两种情况, 基于向后兼容的考虑,TiKV 在扩缩容时的 Snapshot 仍然是 RocksDB 的格式。因此扩容后的节点由于一开始全部来自 RocksDB,因此会显示 RocksDB 的特征,比如压缩率会高于老的 TiKV 节点、Store Size 会较小、同时 Compaction 的写放大会相对较大。后续这些 RocksDB 格式的 SST 参与 Compaction 之后逐步转换为 Titan 格式。 -### `min-blob-size` 对性能影响 +### `min-blob-size` 对性能的影响 [`min-blob-size`](/tikv-configuration-file.md#min-blob-size) 是决定一个 Value 是否用 Titan 存储的依据。如果 Value 大于或等于 `min-blob-size`,会用 Titan 存储,反之则用 RocksDB 的原生格式存储。`min-blob-size` 太小或太大都会导致性能下降。 From e5285db6bc16f587fc35663c9d721ee292da7e56 Mon Sep 17 00:00:00 2001 From: xixirangrang Date: Thu, 25 Jan 2024 16:39:26 +0800 Subject: [PATCH 4/6] Update storage-engine/titan-configuration.md --- storage-engine/titan-configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage-engine/titan-configuration.md b/storage-engine/titan-configuration.md index 680bbdb5a6e2..0d0083834313 100644 --- a/storage-engine/titan-configuration.md +++ b/storage-engine/titan-configuration.md @@ -82,7 +82,7 @@ Titan 对 RocksDB 兼容,也就是说,使用 RocksDB 存储引擎的现有 T ### `min-blob-size` -你可以通过设置 [`min-blob-size`](/tikv-configuration-file.md#min-blob-size) 来调整 value 的大小阈值,决定哪些数据保存在 RocksDB 中,哪些数据保存在 Titan 的 blob file 中。`32KB` 是个折中的值,它能确保 Titan 的性能相对 RocksDB 没有回退。但在很多场景中,该值并不是最佳值。建议参考 [`min-blob-size对性能的影响`](/storage-engine/titan-overview.md#min-blob-size对性能影响) 来选择合适的值。如果你想进一步提升写性能,并能接受扫描性能的下降,你可以将该值最低调整为 `1KB`。 +你可以通过设置 [`min-blob-size`](/tikv-configuration-file.md#min-blob-size) 来调整 value 的大小阈值,决定哪些数据保存在 RocksDB 中,哪些数据保存在 Titan 的 blob file 中。`32KB` 是个折中的值,它能确保 Titan 的性能相对 RocksDB 没有回退。但在很多场景中,该值并不是最佳值。建议参考 [`min-blob-size` 对性能的影响`](/storage-engine/titan-overview.md#min-blob-size-对性能的影响) 来选择合适的值。如果你想进一步提升写性能,并能接受扫描性能的下降,你可以将该值最低调整为 `1KB`。 ### `blob-file-compression` 和 `zstd-dict-size` From 59cccdca9f2547e1299a13b21c1d5c49d1ea5271 Mon Sep 17 00:00:00 2001 From: xixirangrang Date: Thu, 25 Jan 2024 16:57:02 +0800 Subject: [PATCH 5/6] Update storage-engine/titan-configuration.md --- storage-engine/titan-configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage-engine/titan-configuration.md b/storage-engine/titan-configuration.md index 0d0083834313..bfac87ddd78a 100644 --- a/storage-engine/titan-configuration.md +++ b/storage-engine/titan-configuration.md @@ -82,7 +82,7 @@ Titan 对 RocksDB 兼容,也就是说,使用 RocksDB 存储引擎的现有 T ### `min-blob-size` -你可以通过设置 [`min-blob-size`](/tikv-configuration-file.md#min-blob-size) 来调整 value 的大小阈值,决定哪些数据保存在 RocksDB 中,哪些数据保存在 Titan 的 blob file 中。`32KB` 是个折中的值,它能确保 Titan 的性能相对 RocksDB 没有回退。但在很多场景中,该值并不是最佳值。建议参考 [`min-blob-size` 对性能的影响`](/storage-engine/titan-overview.md#min-blob-size-对性能的影响) 来选择合适的值。如果你想进一步提升写性能,并能接受扫描性能的下降,你可以将该值最低调整为 `1KB`。 +你可以通过设置 [`min-blob-size`](/tikv-configuration-file.md#min-blob-size) 来调整 value 的大小阈值,决定哪些数据保存在 RocksDB 中,哪些数据保存在 Titan 的 blob file 中。`32KB` 是个折中的值,它能确保 Titan 的性能相对 RocksDB 没有回退。但在很多场景中,该值并不是最佳值。建议参考 [`min-blob-size` 对性能的影响`](/storage-engine/titan-overview.md#min-blob-size-对性能的影响)来选择合适的值。如果你想进一步提升写性能,并能接受扫描性能的下降,你可以将该值最低调整为 `1KB`。 ### `blob-file-compression` 和 `zstd-dict-size` From 2ea18cdcf3505fd75a6c028878d9f1682d593c8b Mon Sep 17 00:00:00 2001 From: xixirangrang Date: Thu, 25 Jan 2024 19:46:56 +0800 Subject: [PATCH 6/6] Update storage-engine/titan-configuration.md --- storage-engine/titan-configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage-engine/titan-configuration.md b/storage-engine/titan-configuration.md index bfac87ddd78a..13598e665678 100644 --- a/storage-engine/titan-configuration.md +++ b/storage-engine/titan-configuration.md @@ -82,7 +82,7 @@ Titan 对 RocksDB 兼容,也就是说,使用 RocksDB 存储引擎的现有 T ### `min-blob-size` -你可以通过设置 [`min-blob-size`](/tikv-configuration-file.md#min-blob-size) 来调整 value 的大小阈值,决定哪些数据保存在 RocksDB 中,哪些数据保存在 Titan 的 blob file 中。`32KB` 是个折中的值,它能确保 Titan 的性能相对 RocksDB 没有回退。但在很多场景中,该值并不是最佳值。建议参考 [`min-blob-size` 对性能的影响`](/storage-engine/titan-overview.md#min-blob-size-对性能的影响)来选择合适的值。如果你想进一步提升写性能,并能接受扫描性能的下降,你可以将该值最低调整为 `1KB`。 +你可以通过设置 [`min-blob-size`](/tikv-configuration-file.md#min-blob-size) 来调整 value 的大小阈值,决定哪些数据保存在 RocksDB 中,哪些数据保存在 Titan 的 blob file 中。`32KB` 是个折中的值,它能确保 Titan 的性能相对 RocksDB 没有回退。但在很多场景中,该值并不是最佳值。建议参考 [`min-blob-size` 对性能的影响](/storage-engine/titan-overview.md#min-blob-size-对性能的影响)来选择合适的值。如果你想进一步提升写性能,并能接受扫描性能的下降,你可以将该值最低调整为 `1KB`。 ### `blob-file-compression` 和 `zstd-dict-size`