首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用卡桑德拉恢复CommitLog

用卡桑德拉恢复CommitLog
EN

Stack Overflow用户
提问于 2018-11-05 08:16:11
回答 1查看 600关注 0票数 0

我在关于提交日志归档配置的Cassandra文档中注意到以下声明:https://docs.datastax.com/en/cassandra/3.0/cassandra/configuration/configLogArchive.html

“当第一个客户端提供的时间戳大于恢复点时间戳时,恢复将停止。因为数据库接收突变的顺序不严格遵循时间戳顺序,这可能会使某些突变无法恢复。”

这一声明使我们关注基于Cassandra提交日志的时间点恢复,因为这表明时间恢复点将不会以低于指示的恢复点时间戳恢复所有突变,如果我们有超出时间戳顺序的突变(我们将有)。

我试图通过一些实验来验证这种行为,但没有能够再现这种行为。

我做了两个实验:

简单行插入

将restore_point_in_time设置为提前1小时。插入10行(使用默认当前时间戳),在time>中使用时间戳<2小时插入一行,插入10行(使用默认当前时间戳)

现在,我杀死了我的cassandra实例,确保它被终止,而没有机会冲到SS表上。

在启动期间,我可以从cassandra日志中看到它正在执行CommitLog重放。

重放之后,我通过表查询,可以看到已经恢复了20行,但没有插入提前具有时间戳的行。尽管在这里,根据文档,我希望只插入前10行。我在锡沙拉日志中证实,CommitLog重播已经完成。

大型CommitLog分裂实验

我想看看文档化的特性是否正在处理提交日志的拆分/滚转。

因此,我将commitlog_segment_size_in_mb设置为1MB,以使提交日志更频繁地滚动,而不是32 MB的默认值。然后,我运行了一个脚本来大量插入行,以强制提交日志分裂。

因此,这里的结果是,我插入了12000条记录,然后在我的restore_point_in_time之前插入了一个带有时间戳的记录,然后我插入了8000条记录。

在大约13200行时,我的提交日志转到一个新文件中。然后我又杀了卡桑德拉的案子,重新开始了。再次,我可以在日志中看到CommitLog重放正在进行,在重放之后,我可以看到除了在restore_point_in_time之前具有时间戳的单个行之外的所有行都已被恢复。

备注

我使用commitlog_sync批处理选项做了类似的实验,并且为了确保我的行没有被刷新到SSTables,我尝试在启动cassandra之前用空表恢复快照,让它执行提交日志重放。在所有情况下,我都得到了同样的结果。

我想我的问题是文档中的陈述是否仍然有效?或者我在实验中遗漏了什么?

有什么帮助是非常感谢的吗?为此,我需要一个答案,以便能够在更大范围的cassandra集群设置中实现备份/恢复机制。

在码头容器中使用Cassandra 3.11 (单节点设置)完成的所有实验(官方的cassandra对接图像)。我在图片上“从头开始”进行了实验,所以除了我在描述中所包含的内容之外,在其他地方没有任何变化。

EN

回答 1

Stack Overflow用户

发布于 2018-11-05 09:23:27

我认为复制起来相对比较困难,因为您需要确保某些突变发生得比其他的晚,而且这种情况可能主要发生在一些客户端没有同步时钟,或者节点被重载,然后提示稍后被重放时,等等。

但是可能根本不需要这个参数--如果您查看CommitLogArchiver.java,那么您可以看到如果没有指定这个参数,那么它将被设置为Long.MAX,这意味着没有上限,所有提交日志都将被重放,然后Cassandra将以标准的方式处理它:“最新的时间戳胜利”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53150590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档