Cassandra 默认配置为丢失 10 秒的数据?

Cassandra is configured to lose 10 seconds of data by default?

由于Commitlog中的数据每隔10秒就会周期性的刷新到磁盘中(由commitlog_sync_period_in_ms控制),所以如果所有副本在10秒内崩溃,我会丢失所有数据吗?这是否意味着,从理论上讲,Cassandra 集群可以丢失数据?

http://wiki.apache.org/cassandra/Durability

"Cassandra's default configuration sets the commitlog_sync mode to periodic, causing the commitlog to be synced every commitlog_sync_period_in_ms milliseconds, so you can potentially lose up to that much data if all replicas crash within that window of time."

如果一个节点在更新磁盘上的提交日志之前崩溃了,那么是的,您可能会丢失多达 10 秒的数据。

如果您通过使用大于 1 的复制因子或拥有多个数据中心来保留多个副本,那么大部分丢失的数据将在其他节点上,并在修复时在崩溃的节点上恢复。

如果写入量足够高以在十秒之前达到大小限制,提交日志可能会在不到十秒内写入。

如果您想要比这更耐用(以更高的延迟为代价),那么您可以将 commitlog_sync 设置从定期更改为批处理。在批处理模式下,它使用 commitlog_sync_batch_window_in_ms 设置来控制批量写入磁盘的频率。在批处理模式下,写入在写入磁盘之前不会被确认。

周期模式的十秒默认值是为旋转磁盘设计的,因为它们太慢了,如果你阻止等待提交日志写入的确认,就会影响性能。出于这个原因,如果您使用批处理模式,他们建议为提交日志使用专用磁盘,这样写头就不需要进行任何查找以尽可能降低延迟。

如果您使用的是 SSD,则可以使用更积极的时序,因为与旋转磁盘相比,延迟大大减少。