我最近了解了像 Cassandra 这样的键值存储环境中的预写日志和故障恢复,并有一些后续问题:
- WAL 是否被持久化到更小的快照中,以便我们只需要从最新的快照而不是整个提交历史中恢复?保留这些快照并从中恢复的高级机制是什么?
- 为了性能写入磁盘时,日志会被批处理吗?这是否有永久丢失数据的风险?
- 当机器在从 WAL 恢复期间出现故障时会发生什么?我们最终会在数据库中得到部分结果吗?下一次数据库启动时,我们如何从该状态恢复?
我最近了解了像 Cassandra 这样的键值存储环境中的预写日志和故障恢复,并有一些后续问题:
当应用程序发出写请求时:
memtable
,并且commitlog
(WAL) 来持久保存到磁盘。附加到
commitlog
is done 有两个原因:内存表中的数据最终会被刷新到磁盘上名为 SSTable(排序字符串表文件)的数据文件中。在以下情况下会触发内存表刷新:
一旦内存表被刷新到磁盘,其对应的提交日志中的数据就会被清除。
由于突变会持久保存到磁盘中,因此它们是持久的,并且可以在重启和计划外中断后继续存在。在提交日志磁盘/卷丢失的最坏情况下,数据不会永远丢失,因为突变会发送到集群中的所有副本,因此存在可以通过修复同步到其他副本的副本。
有关详细信息,请参阅如何在 Cassandra 中写入数据。干杯!