2

According to cassandra commit log sync period..data first goes to os buffer...then from os buffer, based on commit log sync period ,the buffer data gets synced to commit log file in disk..and the default sync period is 10 seconds..what if server crashes in that 10 secs.. data is lost ryt? But the client got a response as SUCCESS the moment data is written to commitlog buffer in os buffer and memtable..but eventually data is lost because system crashed within that 10 sec window...am i missing something?

4

2 回答 2

9

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

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

于 2017-11-08T10:47:04.653 回答
3

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

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

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

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

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

于 2017-11-08T09:58:49.840 回答