【问题标题】:Cassandra is configured to lose 10 seconds of data by default?Cassandra默认配置丢失10秒数据?
【发布时间】:2015-09-10 23:40:03
【问题描述】:

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

【问题讨论】:

标签: cassandra data-integrity data-loss


【解决方案1】:

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

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

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

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

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

如果您使用的是 SSD,那么您可以使用更激进的时序,因为与旋转磁盘相比,延迟大大降低。

【讨论】:

  • 据我所知,提交日志已经在磁盘上,所以即使一个节点在 10 秒内崩溃并重新启动,它不应该重播提交日志中的所有内容并恢复数据吗?
  • @Vinay 数据仅在每 10 秒后写入磁盘。因此,“如果所有副本在该时间窗口内崩溃,您可能会丢失这么多数据。”请查看:wiki.apache.org/cassandra/Durability
  • “写入磁盘”应该在任何地方“同步”。提交日志写入发生在突变完成之前,但提交日志本身不会在每次写入时同步。只有当崩溃是机器级别的崩溃而不是进程级别的崩溃时,才会出现数据丢失。
  • 看起来 mongodb-is-web-scale.com 也适用于 Cassandra
【解决方案2】:

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

“Cassandra 的默认配置将 commitlog_sync 模式设置为周期性,从而导致每 commitlog_sync_period_in_ms 毫秒同步一次提交日志,因此如果所有副本在该时间窗口内崩溃,您可能会丢失这么多数据。”

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    相关资源
    最近更新 更多