什么使得在Cassandra中写入CommitLog比写入SSTable更快?

6
我目前正在深入研究Cassandra,因为我想专攻它。我遇到了Cassandra "写路径"并试图理解提交日志。据我所知,当写入提交日志时首先被确认写入,然后才写入内存表(一种内存中的表)。但是,如果提交日志被写入文件系统,则SSTables也会被写入。那么是什么神奇的东西使得写入提交日志更快,或者如许多帖子和文档所述?
引用: 一个写操作被认为是成功的,一旦它被写入提交日志和内存,因此在写入时几乎没有磁盘I/O。
为什么不将其写入SSTable和MemTable被视为成功?

我也有同样的问题。写入提交日志可能会降低Cassandra的写入性能,对吗?为什么它不是Cassandra写入路径中的瓶颈?请有人帮忙回答! - duong_dajgja
3个回答

5

SSTable是不可变的,因此无法对其进行追加。因此,写入操作会发送到内存表和提交日志(以实现耐久性)。在正常运行中,内存表会定期刷新为SSTable,然后与现有的SSTable进行合并,以使读取更加高效。提交日志仅在节点重新启动时回放,以恢复尚未刷新到SSTable的写入。


CommitLog和SSTable都写入磁盘,不可变性与速度有什么关系? - Adelin
1
@Adelin,关键在于你不能不断地向SSTables中添加内容。这使得它们在正常的写操作中变得不实用,因为你需要能够快速将数据写入磁盘,以便确认写入操作。提交日志使这成为可能,因为你不会将其用于读取,因此顺序并不重要。 - rs_atl

3

SSTables是基于刷新的memtable创建的。虽然提交日志的更新是周期性发生的,但是memtable的刷新却不是。这是因为一个memtable在被写入磁盘之前需要达到一定的门槛(即大小)。这确保了创建的SSTable足够大以便高效地处理。如果每隔几分钟就定期清除memtable,我们可能会得到许多小型的sstables,这些sstables需要再次进行压缩。


0

写入Cassandra非常快,因为写入日志已经非常快了,您还会添加到内存数据结构,例如B树或AVL树,这被称为memtable。 Memtable是排序的,当它们被写入磁盘时,SStables也保持排序,从而使读取非常高效,但不像写入那样快。

需要注意的是,客户端永远不会触及提交日志。它的唯一目的是创建备份。如果您的机器死机,则memtable中的所有数据都会丢失。因此,机器使用提交日志来回放memtable。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接