由于Commitlog中的数据每10秒后定期刷新到磁盘(由 commitlog_sync_period_in_ms 控制),所以如果所有副本在10秒内崩溃,我将丢失所有数据吗?从理论上讲,这是否意味着Cassandra集群可能会丢失数据?
答案 0 :(得分:9)
如果一个节点在更新磁盘上的提交日志之前就崩溃了,那么是的,你可能会丢失多达十秒的数据。
如果您保留多个副本,通过使用大于1的复制因子或具有多个数据中心,那么大部分丢失的数据将存在于其他节点上,并且在修复后将在崩溃的节点上恢复。
提交日志也可以在不到十秒的时间内写入,因为写入量足够高,可以在十秒之前达到大小限制。
如果您想要比此更持久(以更高的延迟为代价),那么您可以将commitlog_sync设置从定期更改为批处理。在批处理模式下,它使用commitlog_sync_batch_window_in_ms设置来控制批量写入写入磁盘的频率。在批处理模式下,写入之前不会写入写入。
定期模式的十秒默认设计是为旋转磁盘设计的,因为它们非常慢,如果阻止等待提交日志写入的acks,则性能会受到影响。因此,如果您使用批处理模式,他们会为提交日志推荐一个专用磁盘,这样写头就不需要做任何寻求以尽可能降低延迟的延迟。
如果您正在使用SSD,那么您可以使用更激进的计时,因为与旋转磁盘相比,延迟会大大减少。
答案 1 :(得分:3)
http://wiki.apache.org/cassandra/Durability
" Cassandra的默认配置将commitlog_sync模式设置为periodic,导致commitlog在每个commitlog_sync_period_in_ms毫秒内同步,因此如果所有副本在该时间窗口内崩溃,您可能会丢失那么多数据"