我是 Cassandra 的新手——我一直在寻找与 Cassandra 在单个节点上的提交和崩溃恢复相关的信息。而且,希望有人能澄清细节。
我正在测试 Cassandra - 因此,将其设置在单个节点上。我在 datastax 上使用压力工具来插入数百万行。如果出现电气故障或系统关闭会怎样?Cassandra 内存中的所有数据是否会在 Cassandra 重新启动时写入磁盘(我猜 commitlog 充当中介)?这个过程需要多长时间?
谢谢!
我是 Cassandra 的新手——我一直在寻找与 Cassandra 在单个节点上的提交和崩溃恢复相关的信息。而且,希望有人能澄清细节。
我正在测试 Cassandra - 因此,将其设置在单个节点上。我在 datastax 上使用压力工具来插入数百万行。如果出现电气故障或系统关闭会怎样?Cassandra 内存中的所有数据是否会在 Cassandra 重新启动时写入磁盘(我猜 commitlog 充当中介)?这个过程需要多长时间?
谢谢!
Cassandra 的提交日志为 Cassandra 提供了持久写入。当您写入 Cassandra 时,写入会在客户端确认写入之前附加到提交日志。这意味着客户端收到成功响应的每个写入都保证写入提交日志。写入也写入当前的 memtable,当足够大时,最终将作为 SSTable 写入磁盘。这可能是写入完成后的很长时间。
但是,出于性能原因,提交日志不会立即同步到磁盘。默认为周期模式(由 cassandra.yaml 中的 commitlog_sync 参数设置),周期为 10 秒(由 cassandra.yaml 中的 commitlog_sync_period_in_ms 设置)。这意味着提交日志每 10 秒同步一次到磁盘。使用这种行为,如果服务器断电,您最多可能会丢失 10 秒的写入时间。如果集群中有多个节点并使用大于 1 的复制因子,则需要在 10 秒内对多个节点断电才能丢失任何数据。
如果此风险窗口不可接受,您可以对提交日志使用批处理模式。在提交日志同步到磁盘之前,此模式不会确认对客户端的写入。时间窗口由 commitlog_sync_batch_window_in_ms 设置,默认为 50 ms。这将显着增加您的写入延迟并可能降低吞吐量,因此仅在丢失一些已确认写入的成本很高时才使用它。使用此模式时,将提交日志存储在单独的驱动器上尤为重要。
如果您的服务器断电,Cassandra 在启动时会重放提交日志以重建其内存表。在写入量很大的服务器上,此过程将需要几秒钟(可能是几分钟)。
如果您想确保将内存表中的数据写入磁盘,您可以运行“nodetool flush”(每个节点运行)。这将创建一个新的 SSTable 并删除提交日志,这些提交日志引用了已刷新的内存表中的数据。
你在问类似的东西
在电气故障或系统关闭之前传输的任何数据都将保持不变。
回到第二个问题,当 memtable 空间用完时,即当键的数量超过一定限制(默认为 128)或达到持续时间(集群时钟)时,它被存储到 sstable、不可变空间中。