一直在读Cassandra,我觉得它真的不能容错,是吗?
我的意思是,以一个非常简单的场景,传入写,你写到wal,到memtable,然后在wal中标记写成功,然后服务器崩溃,在memtable满之前,所以它没有作为sstable刷新到磁盘,这意味着我刚刚失去了这个写+我将无法重做,因为它在wal中标记为“完成”。
我在这里遗漏了什么还是真的不能容错?这对我来说似乎很奇怪,因为它在这么多的地方和这么多的数据使用,这让我觉得我遗漏了一些东西。
一直在读Cassandra,我觉得它真的不能容错,是吗?
我的意思是,以一个非常简单的场景,传入写,你写到wal,到memtable,然后在wal中标记写成功,然后服务器崩溃,在memtable满之前,所以它没有作为sstable刷新到磁盘,这意味着我刚刚失去了这个写+我将无法重做,因为它在wal中标记为“完成”。
我在这里遗漏了什么还是真的不能容错?这对我来说似乎很奇怪,因为它在这么多的地方和这么多的数据使用,这让我觉得我遗漏了一些东西。
1条答案
按热度按时间gg0vcinb1#
提交日志在memtable之前写入。只需编写突变,就不会将突变标记为应用于memtable。直到memtable被完全刷新到一个新的sstable之后,才会从commitlog中删除突变。
尽管知道这一点很重要,但是使用一些commitlog策略,它们不会阻止在commitlog flush上写入ack,因此仍然可以有一个仅受rf保护的数据丢失窗口。因此,在这些情况下,了解持久性的一致性级别和复制因素也很重要。在4.0+中,我认为组commitlog同步是批处理和周期性同步的最佳选择。