我已经阅读了有关 Cassandra 提交日志的多个文档,对我来说,有关此“结构”的信息存在冲突。该图显示,当发生写入时,Cassandra 会写入内存表和提交日志。令人困惑的部分是该提交日志所在的位置。
我反复看到的图表显示了磁盘上的提交日志。但是,如果您进行更多阅读,他们还会讨论内存中的提交日志缓冲区 - 并且该内存块每 10 秒刷新到磁盘。
DataStax 文档指出:
“当发生写入时,Cassandra 将数据存储在名为 memtable 的内存结构中,为了提供可配置的持久性,它还会将写入附加到内存中的提交日志缓冲区。该缓冲区每 10 秒刷新到磁盘”。
在他们的图表中没有任何地方显示称为提交日志缓冲区的内存结构。它们仅显示驻留在磁盘上的提交日志。
它还指出:
“当发生写入时,Cassandra 将数据存储在内存中的结构(memtable)中,并将写入附加到磁盘上的提交日志中。”
所以我对上面的内容很困惑。它是写入提交日志内存缓冲区,最终刷新到磁盘(我假设也称为“提交日志”),还是写入磁盘上的内存表和提交日志?
Apache 的文档是这样描述的:
“相反,像其他现代系统一样,Cassandra 通过首先将写入附加到提交日志来提供持久性。这意味着只有提交日志需要进行 fsync,如果提交日志位于其自己的卷上,则无需进行查找,因为commitlog 是仅追加的。实现细节在 ArchitectureCommitLog 中。
Cassandra 的默认配置将 commitlog_sync 模式设置为定期,导致提交日志每 commitlog_sync_period_in_ms 毫秒同步一次,因此如果所有副本在该时间窗口内崩溃,您可能会丢失那么多数据。”
我从 Apache 声明中推断出的是,仅由于写入的异步性质(缓存写入的确认),您才会丢失数据(它甚至指出,如果所有副本在刷新/同步之前崩溃,您可能会丢失数据) 。
我不确定我可以从 DataStax 文档和图表中推断出什么,因为他们提到了关于提交日志的两种不同的语句 - 一种在内存中,一种在磁盘上。
任何人都可以澄清我所认为的一组措辞不当且相互矛盾的文档吗?
我假设有一个提交日志缓冲区,因为它们都引用它(但 DataStax 没有在图中显示它)。我认为,如何以及何时进行管理是理解的关键。