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