我目前正在深入探索Cassandra,因为我愿意专注于它。我遇到了Cassandra“写路径”,现在试图理解提交日志。据我所知,当写入提交日志时,写入被确认,首先是写入MemTable(内存表中的一个)。但是,如果提交日志被写入FILE SYSTEM,那么就像SSTables一样。什么是使写入更快地提交日志或者在许多帖子和文档中说明的神奇之处
写入提交日志后,写入成功 内存,所以写入时的磁盘I / O非常小
为什么不写入SSTable和MemTable被认为是成功的?
答案 0 :(得分:3)
SSTables是不可变的,所以追加它们是不可能的。因此,写入将发送到memtable和提交日志(用于持久性)。在正常操作下,memtable会定期作为SSTable刷新到磁盘,然后使用现有的SSTable进行压缩,以提高读取效率。提交日志仅在节点重新启动时重播,以恢复尚未刷新到SSTables的写入。
答案 1 :(得分:2)
基于刷新的memtables创建SSTable。虽然提交日志更新会定期发生,但memtable刷新却没有。这是因为memtable首先需要在写入磁盘之前达到某个阈值(即大小)。这可以确保创建的sstable足够大以便有效处理。如果memtables每周会定期刷新几次,我们最终可能需要再次压缩许多微小的sstables。
答案 2 :(得分:0)
写入Cassandra的速度如此之快,因为写入日志已经非常快,您还需要将其添加到内存中的数据结构中,例如b树或avl树(称为内存表)。 Memtables被排序,并且当它们被写入磁盘时,SStables也保持排序,因此使读取非常有效,但速度不如写入。
要注意的一点是,客户端永远不要触摸提交日志。它的唯一目的是创建备份。如果您的计算机死了,那么内存表中的所有数据都会丢失。因此,计算机随后使用提交日志重播内存表。
您希望读取速度快,这只能通过顺序放置所有数据来实现,这也使得缓存数据更加容易。如果要在每个写入磁盘上写入SStable,要么必须进行随机读取以使读取速度变慢,要么必须等待磁盘旋转才能进行顺序写入。