cassandra 如何在后台处理更新请求?

How does cassandra handle update request under the hood?

我正在尝试了解 cassandra 的存储机制

看官方文档好像

  1. 写入请求写入可变内存表
  2. 当 memtable 变得太大时,它被写入 sstable

所以我有以下问题

  1. memtable 耐用吗?
  2. 如果更新 qps 很大,是否意味着 memtable 和 sstable 中都会有多个版本的陈旧数据,这样读取延迟会增加? cassandra如何获取最新数据?多版本数据如何存储?
  3. 如果有大量更新 qps 这是否意味着有很多墓碑?

is memtable durable?

内存表根据大小/一些其他设置刷新到磁盘,但此时写入已被接受 - 它在内存表中不持久。 提交日志中还有一个条目,默认情况下每 10 秒刷新一次。 (因此在 RF 3 上,您会期望每 3.33 秒刷新一次)。提交日志的刷新使其对特定节点持久化。要在此刷新发生之前完全丢失写入,需要 all 个副本在它们中的任何一个执行提交日志刷新之前失败。只要冲1个就很耐用

if there is heavy update qps does it mean that there is going to be multiple versions of stale data in both memtable and sstable such that read latency can increase?

对于memtable来说,不会有陈旧的数据。就磁盘上的 SSTables 而言,是的,一条记录可以有多个版本,因为它会随着时间的推移而更新,这会导致读取延迟增加。一个值得关注的指标是 SSTablesPerRead 指标,它将为您提供每个数据库 Table 正在访问的 SSTable 数量的直方图 运行 ]. p95 或更高版本是要查看的主要值,这些将是导致缓慢的场景。

how does cassandra get the latest data? and how is multiple version of data stored?

在读取数据期间,它将使用读取路径(布隆过滤器、分区摘要等)并读取该行的所有版本 - 并丢弃不需要的部分,然后再将记录返回给调用方应用。该行的多个版本是它存在于超过 1 个 sstable 中的一个方面。

压缩的部分作用是管理这种情况并将记录的多个副本、旧版本和新版本组合在一起,并写出仅保留新版本的新 SStable。 (并且删除了它压缩在一起的SSTable)。

if there is heavy update qps does this mean there is alot of tombstone?

这取决于更新的类型,对于大多数正常更新 - 不,这不会生成墓碑。列表集合类型的更新虽然可以而且将会生成墓碑。如果您要删除,那么是的,它会生成墓碑。

如果您要 运行 进行大量更新,那么我建议考虑使用 LeveledCompactionStrategy 而不是默认的 SizeTieredCompactionStrategy - 它可能会为您提供更好的读取性能,但压缩率更高IO成本。