【问题标题】:What makes CommitLog faster than writing to SSTable in Cassandra ?是什么让 CommitLog 比在 Cassandra 中写入 SSTable 更快?
【发布时间】:2015-07-28 11:39:44
【问题描述】:

我目前正在深入探索 Cassandra,因为我愿意专攻它。我遇到了 Cassandra “写入路径”,现在试图了解提交日志。据我了解,写入在写入提交日志时得到确认,首先写入到 MemTable(内存表中的一个)。但是,如果提交日志被写入文件系统,那么就像 SSTables。是什么神奇的东西使写入提交日志更快或者正如许多帖子和文档中所述的那样

一旦写入提交日志,就说写入成功,并且 内存,因此写入时磁盘 I/O 非常少

为什么不写入SSTable和MemTable才算成功?

【问题讨论】:

  • 我也有同样的问题。写入提交日志可能会降低 Cassandra 的写入性能,对吧?为什么不是 Cassandra 的写入路径的瓶颈?请任何人帮忙回答这个问题!

标签: cassandra nosql


【解决方案1】:

SSTables 是不可变的,所以附加到它们是不可能的。因此写入被发送到内存表和提交日志(为了持久性)。在正常操作下,memtable 会作为 SSTable 定期刷新到磁盘,然后与现有的 SSTable 压缩以提高读取效率。提交日志仅在节点重启时重放,以恢复尚未刷新到 SSTables 的写入。

【讨论】:

  • CommitLog 和 SSTable 都写入磁盘,不变性与速度有什么关系?
  • @Adelin 的重点是你不能一直追加到 sstables。这使得将它们用于需要能够快速将数据写入磁盘以便确认写入的正常写入操作变得不切实际。提交日志使这成为可能,因为您没有将它用于读取,因此排序无关紧要。
【解决方案2】:

SSTables 是基于刷新的 memtables 创建的。虽然提交日志更新确实会定期发生,但内存表刷新不会。这是因为 memtable 在写入磁盘之前首先需要达到某个阈值(即大小)。这确保创建的 sstable 足够大,可以有效处理。如果内存表每分钟会定期刷新几次,我们最终可能会得到许多必须再次压缩的微小 sstable。

【讨论】:

    【解决方案3】:

    写入 Cassandra 非常快,因为写入日志已经非常快,您还可以添加内存数据结构,例如 b 树或称为 memtable 的 avl 树。 Memtables 是排序的,当它们被写入磁盘时,SStables 也保持排序状态,因此读取效率很高,但不如写入快。

    需要注意的一点是客户端从不接触提交日志。它的唯一目的是创建备份。如果你的机器死了,那么你在 memtable 中的所有数据都会丢失。所以机器然后使用提交日志来重放内存表。

    您希望读取速度更快,这只有通过按顺序放置所有数据才能实现,这也使得缓存数据更容易。如果您要在每个写入磁盘上写入 SStable,则要么您必须进行随机读取使读取速度变慢,要么您必须等待磁盘旋转以便执行顺序写入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-25
      • 1970-01-01
      • 2012-11-30
      • 2012-02-14
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 2020-08-12
      相关资源
      最近更新 更多