【问题标题】:Is Cassandra good for adhoc/bulk reads/writes? [closed]Cassandra 是否适合临时/批量读取/写入? [关闭]
【发布时间】:2022-01-21 16:16:25
【问题描述】:
我对何时使用像 Cassandra 这样的柱状数据库感到很困惑。我知道它们非常适合我们的用例主要是读取数据列的分析工作负载。但是,根据我对数据在 Cassandra 中的存储方式的理解,我预计写入的性能会降低,因为单个记录的属性分散在多个块中,因为每列的数据都放在一起,并且一条记录的数据对应于多个列.
但是,与我的直觉相反,我在互联网上看到一些资源说 Cassandra 非常适合写入,有些人说它非常适合仅附加工作负载。
因此,希望有人就 Cassandra 是否适合即席/批量读取/写入提供明智的意见。
【问题讨论】:
标签:
database
cassandra
system-design
【解决方案1】:
知道您阅读了哪些参考资料会很有趣,但它通常被称为“写入路径”,它有两个不同的部分 - 两者都必须出现,如下所示:
- 将记录放入代表要插入的表的 mem 表中。在某些情况下,这将刷新到磁盘以在磁盘上创建一个文件(称为 SSTable) - 但就确认写入而言,您无需担心这一点,它不需要等待此刷新。
- 插入/更新也必须放在提交日志中。默认配置是提交日志也在内存中,定期刷新,默认是每 10 秒。同样,写入确认无需等待此提交日志刷新。
由于这两个操作都仅基于内存,因此写入通常会很快得到确认。
这也有例外,例如比较和设置写入(CAS / LWT),以及一些内存表刷新可能成为阻塞操作的场景 - 但在数据库的正常操作中不应该是这种情况.
提到仅附加工作负载的具体原因是某些类型的工作负载(例如充当队列的数据库表)不适合 Cassandra。这是由于 tombstone 生成(删除标记),或者如果不断修改行,这会导致每次读取需要从多个文件中读取该行,这对性能不利。在某种程度上,您可以使用一些设置和杠杆在一定程度上对其进行调整,但 Cassandra 中的“队列表”实现永远无法真正调整为可以接受。
要获得更具体的建议,问题必须在建议的数据模型方面更详细,关键是您打算对表运行的查询。