由于Commitlog中的数据在默认情况下每隔10秒就会定期刷新到磁盘(由commitlog_sync_period_in_ms
控制),因此如果所有副本在10秒内崩溃,我会丢失所有数据吗?这是否意味着,从理论上讲,卡桑德拉集群可能会丢失数据?
如果一个节点在更新磁盘上的提交日志之前崩溃,那么是的,您可能会丢失长达10秒的数据。
如果您使用大于1的复制因子保留多个副本,或者有多个数据中心,那么大部分丢失的数据将在其他节点上,并且在修复崩溃的节点时会在该节点上恢复。
此外,如果写入量足够高,在10秒内达到大小限制,提交日志可能会在10秒内写入。
如果您想要更高的耐用性(以更高的延迟为代价),则可以将commitlog_sync
设置从periodic
更改为batch
。在batch
模式中,它使用commitlog_sync_batch_window_in_ms
设置来控制批量写入磁盘的频率。在批处理模式下,直到写入磁盘,写入才会得到确认。
周期模式的10秒默认值是为旋转磁盘而设计的,因为磁盘速度太慢,如果您阻止等待提交日志写入的ack,则会影响性能。出于这个原因,如果您使用batch
模式,他们建议为提交日志提供一个专用磁盘,这样写头就不需要进行任何操作来尽可能降低增加的延迟。
如果您使用的是固态硬盘,那么您可以使用更积极的计时,因为与旋转的磁盘相比,延迟大大降低。
Cassandra的默认配置将commitlog_sync
模式设置为周期性,导致提交日志每commitlog_sync_period_in_ms
毫秒同步一次,因此,如果所有副本在该时间窗口内崩溃,您可能会丢失多达那么多数据。