【问题标题】:CommitLog Recovery with Cassandra使用 Cassandra 进行 CommitLog 恢复
【发布时间】:2019-04-08 14:06:57
【问题描述】:

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

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

这个声明让我们担心使用基于 Cassandra 提交日志的时间点恢复,因为这表明如果我们有超出时间戳顺序的突变,时间点恢复将不会恢复时间戳低于指示的还原点时间戳的所有突变(我们将拥有)。

我尝试通过一些实验来验证此行为,但未能重现此行为。

我做了两个实验:

简单的行插入

将 restore_point_in_time 设置为提前 1 小时。 插入 10 行(使用默认的当前时间戳) 使用时间戳插入一行 插入 10 行(使用默认的当前时间戳)

现在我杀死了我的 cassandra 实例,确保它在没有机会刷新到 SS 表的情况下被终止。

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

重播后,我按表查询,可以看到已经恢复了 20 行,但没有插入带有提前时间戳的行。虽然这里基于文档,但我预计只插入了前 10 行。我在 casssandra 日志中验证了 CommitLog 重播已经完成。

更大的 CommitLog 拆分实验

我想看看记录的功能是否正在处理提交日志拆分/翻转。

所以我将 commitlog_segment_size_in_mb 设置为 1 MB,以使 commitlog 更频繁地翻转,而不是默认的 32MB。 然后我运行了一个脚本来批量插入行以强制拆分提交日志。

所以这里的结果是我插入了 12000 条记录,然后插入了一条时间戳在我的 restore_point_in_time 之前的记录,然后我插入了 8000 条记录。

在大约 13200 行时,我的提交日志滚动到一个新文件。 然后我再次杀死了我的 cassandra 实例并重新启动。我再次可以在日志中看到 CommitLog 重播正在完成,重播后我可以看到除了时间戳早于 restore_point_in_time 的单行之外的所有行都已恢复。

注意事项

我使用 commitlog_sync 批处理选项进行了类似的实验,并且为了确保我的行没有被刷新到 SSTables,我尝试在启动 cassandra 之前使用空表恢复快照以使其执行 commitlog 重播。在所有情况下,我得到了相同的结果。

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

任何帮助将不胜感激?我需要一个答案才能得出我们希望在更大规模的 cassandra 集群设置中实施的备份/恢复机制的结论。

在 Docker 容器(官方 cassandra docker 映像)中使用 Cassandra 3.11(单节点设置)完成的所有实验。我在“从头开始”的图像上进行了实验,因此除了我在此处的描述中包含的内容之外,没有对配置进行任何更改。

【问题讨论】:

    标签: database cassandra cassandra-3.0


    【解决方案1】:

    我认为它会相对难以重现,因为您需要确保某些突变比其他突变来得晚,这可能主要发生在某些客户端没有同步时钟或节点过载时,然后提示会在一段时间后重播,等等。

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

    【讨论】:

    • 嗨,Alex 感谢您的回复。我试图使用插入 时间戳 <....> 导致突变无序。但也许这不足以重现问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2014-05-29
    • 1970-01-01
    • 2016-08-16
    • 2014-05-22
    • 1970-01-01
    • 2015-07-07
    相关资源
    最近更新 更多