Cassandra 预写日志和内存表刷新到磁盘

Cassandra Write ahead log and memtables flush to disk

一直在研究 Cassandra,我觉得它真的不能容错,对吗?

我的意思是,采取一个非常简单的场景,传入写入,写入 WAL,写入内存表,然后在 WAL 中标记写入成功,然后服务器在内存表变满之前崩溃,所以它不会作为 SSTable 刷新到磁盘,这意味着我刚刚丢失了这个写入 + 我将无法重做它,因为它在 WAL 中标记为 "Done"。

我是不是遗漏了什么,还是它真的不能容错?这对我来说似乎很奇怪,因为它在这么多地方和这么多数据中使用,这让我觉得我遗漏了什么。

提交日志写在内存表之前。您只需编写突变,就不会将突变标记为已应用于内存表。在 memtable 完全刷新到新的 sstable 之前,不会从提交日志中删除突变。

尽管知道这一点很重要,但使用某些提交日志策略它们不会阻止 ack 写入提交日志刷新,因此您仍然可以丢失仅受 RF 保护的数据 window。因此,在这些情况下了解持久性的一致性级别和复制因子也很重要。在 4.0+ 中,我认为 group commitlog sync 是介于批处理和定期之间的绝佳选择。