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