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