我已经阅读了几篇关于Cassandra提交日志的文档,对我而言,有关于这个"结构和#34;的信息存在冲突。该图显示当发生写入时,Cassandra会写入memtable和commit日志。令人困惑的部分是此提交日志所在的位置。
我已经看过的图表显示了磁盘上的提交日志。但是,如果你进行更多的阅读,他们还会在内存中讨论提交日志缓冲区 - 这段内存每隔10秒刷新一次。
DataStax文档说明: "当发生写入时,Cassandra将数据存储在名为memtable的内存结构中,并且为了提供可配置的持久性,它还将写入附加到内存中的提交日志缓冲区。此缓冲区每10秒刷新一次磁盘#34;
他们的图表中没有显示一个称为提交日志缓冲区的内存结构。它们仅显示驻留在磁盘上的提交日志。
它还说明: "当发生写入时,Cassandra将数据存储在内存中的结构中,即memtable,并且还将写入附加到磁盘上的提交日志。"
所以我对上述内容感到困惑。是否写入提交日志内存缓冲区,最终刷新到磁盘(我假设它也称为"提交日志"),还是写入磁盘上的memtable和commit日志? / p>
Apache的文档说明了这一点: "相反,与其他现代系统一样,Cassandra通过首先将写入附加到提交日志来提供持久性。这意味着只有commitlog需要是fsync,如果commitlog在自己的卷上,则不需要寻找,因为commitlog只是append-only。实现细节在ArchitectureCommitLog。
中Cassandra的默认配置将commitlog_sync模式设置为periodic,导致commitlog在每个commitlog_sync_period_in_ms毫秒内同步,因此如果所有副本在该时间窗口内崩溃,您可能会丢失那么多数据。&#34 ;
我从Apache语句中得出的结论是,由于写入的异步性质(确认缓存写入)可能会丢失数据(它甚至表示如果所有副本在刷新/同步之前崩溃,您可能会丢失数据#39; d)。
我不确定我可以从DataStax文档和图表中推断出什么,因为他们已经提到了两个关于提交日志的不同陈述 - 一个在内存中,一个在磁盘上。
任何人都可以澄清,我认为,这是一套措辞不当且相互冲突的文件吗?
我假设有一个提交日志缓冲区,因为它们都引用它(但DataStax没有在图中显示它)。我认为,如何以及何时管理这一点是理解的关键。
答案 0 :(得分:9)
通常在解释写入路径时,提交日志被表征为文件 - 并且提交日志是提供持久性的磁盘存储机制。深入介绍了混淆,介绍了缓冲区缓存和必须发布fsyncs的部分。引用"在内存中提交日志缓冲区"正在谈论OS缓冲区缓存,而不是Cassandra中的内存结构。您可以在code中看到提交日志中没有单独的内存中结构,而是将序列化序列化并写入file-backed buffer。
Cassandra提供了两种在提交日志中管理fsync的策略。
commitlog_sync
(Default: periodic) The method that Cassandra uses to acknowledge writes in milliseconds:
periodic: (Default: 10000 milliseconds [10 seconds])
Used with commitlog_sync_period_in_ms to control how often the commit log is synchronized to disk. Periodic syncs are acknowledged immediately.
batch: (Default: disabled)note
Used with commitlog_sync_batch_window_in_ms (Default: 2 ms) to control how long Cassandra waits for other writes before performing a sync. When using this method, writes are not acknowledged until fsynced to disk.
periodic
提供了更好的性能,但代价是数据丢失的可能性略有增加。 batch
设置以延迟为代价保证了持久性。