【问题标题】:Can a commitlog created several hours ago apply to a cassandra cluster?几个小时前创建的提交日志可以应用于 cassandra 集群吗?
【发布时间】:2018-08-14 16:17:56
【问题描述】:

我有一个 cassandra 集群在 kubernetes 环境中运行,在一个命名空间中,比如 test1,我想测试恢复功能。所以我在 test1 cassandra 中做了一个快照,将快照移动到另一个节点,从这些数据中启动另一个命名空间中的 cassandra 集群,比如 test2。问题是,test2 cassandra 集群完全取代了 test1 集群,客户应该写入 test1 cassandra 集群的数据已经写入了 test2 cassandra 集群。

一个小时后,我注意到了这一点,停止了test2 cassandra集群,并重新启动了test1 cassandra集群,虽然它很快就恢复了工作,但有些数据丢失了。

过了一会儿,我注意到test2 cassandra节点中当时有一些commitlog,我想恢复这些数据。我可以直接停止test1 cassandra集群,把这些commitlog文件放到test1 cassandra节点的commitlog目录下,然后启动cassandra,让cassandra重放这些commitlog吗?

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    来自一个节点的提交日志不能在另一个节点上播放,或者 簇。它们是特定于它们来自的节点的交易。

    source - 阅读说明(“重要说明:时间点恢复需要重新启动集群才能运行提交日志重播”和“一些有用的规划说明”)

    稍后更新:

    我不确定您所说的“test2 cassandra 集群完全取代了 test1 集群”是什么意思。我的假设是您恢复了所有内容,包括系统键空间。

    如果你这样做了,是的,那么应用提交日志可能会起作用,因为除了 IP 和主机名之外,集群是相同的。

    如果您查看 CommitLogReader 代码,您会发现如果抛出 UnknownTableException(基本上是提交日志和系统键空间之间的表 id 不同),则认为突变无效。

    我在 ccm 上进行了类似的测试,并在我在文件系统和 system_schema.tables 中更改了表的 id 后成功地重放了提交日志。

    在我看来,您的集群非常混乱。尽管您可以这样做并且可能会奏效,但我认为您将始终面临数据损坏的高风险。

    因此,由于在 datastax 文档(我们可以考虑 Cassandra 的基本文档)中声明支持此操作,因此我不建议这样做。

    【讨论】:

    • 嗨,霍里亚,感谢您的意见。我仍然很好奇节点如何被认为是“不同的”。正如我的问题所述:test2 cassandra cluster 完全取代了 test1 cluster,所以,我认为在这种情况下,Cassandra 认为这两个节点是同一个节点,对吧?另外,我在实验室环境中创建了另一个cassandra集群,配置相同,当然主机名不同,把snapshot和commitlog放在里面,cassandra启动日志说它正在重放commitlog而没有任何警告,如何解释?
    • 更新了我的答案
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    相关资源
    最近更新 更多