我需要你的帮助来验证 RethinkDB 是否适合我的用例。
用例
我的团队正在构建一个通用的实时聚合平台,它需要:
- 加入来自许多 Kafka 主题的数据
- 需要对原始数据进行连接
- 主题具有相同的键
- 主题中的数据有时是“快照”(可更新),有时是“事件”(不可更新)
- 连接数据的目的地将是一些分析型 OLAP DB。Clickhouse、Druid 等。视情况而定。这些系统与“增量”(SCD)一起工作。因为“快照”,我需要有状态的处理。
- 最多可在 7 天后更新快照
- 主题接收大约 20k msg/s,峰值高达 200k msg/s
- 主题中的数据是从 100 字节到 5kB 的 json
- 主题中的数据可以有重复
- 重复项使用“版本” json 字段进行重复数据删除,该字段是每个主题的一部分。仅当 new_version > old_version 时才应处理数据。或者如果 old_version 不存在。
我已经有了一个包含五个阶段的 Cassandra 的 POC:
- Cassandra Inserter - 使用来自所有 Kafka 主题。仅对同一个 Cassandra 表中的所有主题进行插入。分片是在作为所有 Kafka 主题的键的列上完成的。因此,具有相同密钥的所有消息最终都在同一个分片中。
- 对于每个 Cassandra 插入,都会向 Kafka 生成一个 InsertEvent
- Delta 计算器 - 使用 InsertEvents 并通过分片键查询 Cassandra。获取所有原始数据,然后删除重复数据并创建增量。状态保存在另一个 Cassandra 集群中。通过保存所有已处理的“版本”。下次有新的 InsertEvent 出现时,我们使用保存的状态“版本”只获取两个事件:previous 和 current,因此我们可以创建一个 DeltaEvent
- DeltaEvent 生成到 Kafka
- ClickHouse / Druid 摄取数据
所以它基本上是一个 50/50 的插入/读取工作负载,没有更新 Cassandra。
使用 14 个 Cassandra 数据节点和 8 个状态节点节点,它可以在高达 20k InsertEvent/s 的情况下正常工作。在 25k InsertEvent/s 时,系统开始滞后。节点有 16GB 内存,磁盘是由 SSD 支持的网络存储(我知道这并不理想,但现在无法更改)。网络 10 Gbit。
重新思考数据库的想法
我想做一个新的 POC 来尝试 RethinkDB 并使用 changefeeds 创建增量和重复数据删除。为此,我将使用一张桌子。主键/分片键将是 Kafka 键,来自具有相同键的所有主题的所有 Kafka 数据将在单个文档中加入/更新。
工作量可能是 10/90 插入/更新。我会使用 squash: true,以避免过度读取并减少 DeltaEvents 的数量。
- 你认为这是 RethinkDB 的一个很好的用例吗?
- 它会扩展到 200k msg/s,即 20k insert/s、180k update/s 和大约 150k/reads 通过 changefeeds?
- 我需要删除超过 7 天的数据,这将如何影响插入/更新/查询工作量?
- 你有一个更适合这个用例的系统的建议吗?
非常感谢,达沃尔
PS:如果你喜欢阅读文档,这里是:RethinkDB use case question。