开始阅读Cassandra时,我感到有点震惊,那就是它真的不能容错,是吗?
我的意思是,在非常简单的情况下,传入写入,您写入WAL,写入内存表,然后在WAL中标记写入成功,然后服务器在内存表变满之前崩溃,因此不会刷新到磁盘作为SSTable,这意味着我刚刚丢失了该写入操作,因为在WAL中将其标记为“完成”,所以我将无法重做它。
我在这里缺少什么吗?还是真的不能容错?这对我来说似乎很奇怪,因为它在许多地方和大量数据中使用,这使我觉得自己缺少了一些东西。
答案 0 :(得分:2)
将提交日志写入到内存表之前。您只需编写突变,就没有将突变标记为应用于内存表。直到将内存表完全刷新到新的sstable之后,才会从提交日志中删除该突变。
尽管重要的是要知道,对于某些提交日志策略,它们不会阻止对提交日志刷新写入的确认,因此您仍然可以拥有仅受RF保护的数据丢失窗口。因此,重要的是要知道在这些情况下的持久性一致性级别和复制因子。在4.0+版本中,我认为group commitlog sync是批处理和定期之间的不错选择。