【问题标题】:Commitlog sync period提交日志同步周期
【发布时间】:2018-04-19 07:20:00
【问题描述】:

根据 cassandra 提交日志同步周期..数据首先进入 os 缓冲区...然后从 os 缓冲区,根据提交日志同步周期,缓冲区数据同步到磁盘中的提交日志文件..并且默认同步周期是 10 秒..如果服务器在那 10 秒内崩溃.. 数据丢失了怎么办?但是当数据被写入 os 缓冲区和 memtable 中的 commitlog 缓冲区时,客户端得到了响应,因为系统在 10 秒窗口内崩溃了,最终数据丢失了……我错过了什么吗?

【问题讨论】:

    标签: cassandra cassandra-3.0 scylla


    【解决方案1】:

    你没有错过任何东西。像 Cassandra 和 Scylla 这样的数据库不仅在故障下权衡一致性以换取可用性,而且与 Postgres 等传统数据库一样,也在持久性与性能之间进行权衡。您可以将commitlog_sync 选项更改为batch 或减少commitlog_sync_period_in_ms;请注意,如果您这样做,最好将提交日志存储在与数据目录不同的媒体中。

    这背后的原因是持久性可以通过持久性来实现,也可以通过复制来实现。一个典型的 Cassandra/Scylla 用户通常会拥有RF = 3,并以QUORUM 的一致性级别写入,这样您就需要多台机器的协调故障才能真正丢失数据。

    【讨论】:

      【解决方案2】:

      (免责声明:我是 ScyllaDB 员工)

      我认为您缺少的是数据同时写入提交日志磁盘上和内存表,并假设您使用 RF > 1 和 CL > 1(例如仲裁)甚至如果某个特定节点崩溃,其他副本仍然有数据,以后可以修复。

      如果您使用 RF > 1 且 CL = ONE,则如果在同步副本之前节点崩溃,则数据也将丢失。

      如果整个集群出现故障,或者在单节点集群的情况下,您的客户端确实可以取回 SUCCESS ACK,但数据将会丢失。

      欢迎您查看 Scylla 架构文档以更好地理解:

      【讨论】:

      • 如果是单节点集群,或者 rf=1 的集群,那是错误的 ryt,用户状态错误,他正在获得成功,但实际上它已经失败并且数据丢失了......
      • 我假设 RF>1 并且我明确地写了它。我添加了更多信息。
      • @RupeshMukherjee 在 rf=1 的情况下,一个节点的永久崩溃将导致数据永久丢失,这当然比丢失 10 秒的数据严重得多。这就是为什么您不会在 Cassandra 的任何实际部署中使用 rf=1(除非您的数据是临时的)。
      • @nyh - 是的,这是正确的,因为故障转移 RF>1 总是需要的。但我只是从单一部署的角度思考......(让我们在开发中说)......这不会是数据的永久丢失,因为一旦 servr 恢复,您的持久(SS 表)数据就会恢复,但是 10 秒数据是永久丢失......但无论如何谢谢家伙......我的意图是理解这个概念,现在很清楚......
      猜你喜欢
      • 2018-05-30
      • 2015-01-13
      • 1970-01-01
      • 2021-10-27
      • 2019-12-28
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      • 2011-02-04
      相关资源
      最近更新 更多