我有一个在kubernetes环境中运行的cassandra集群,在一个名为test1的命名空间中,并且我想测试还原功能。因此,我在test1 cassandra中创建了快照,将快照移至另一个节点,从这些数据启动了另一个命名空间(例如test2)中的cassandra集群。问题是,test2 cassandra集群完全替换了test1集群,应写入test1 cassandra集群的客户数据已写入test2 cassandra集群。
一个小时后,我注意到了这一点,停止了test2 cassandra集群,并重新启动了test1 cassandra集群,尽管它很快又恢复了工作,但是丢失了一些数据。
过了一会儿,我注意到在那个时期,test2 cassandra节点中有一些提交日志,并且想要恢复这些数据。我可以只停止test1 cassandra集群,将这些commitlog文件放入test1 cassandra节点的commitlog目录中,然后启动cassandra,让cassandra重播这些commitlog吗?
答案 0 :(得分:0)
一个节点上的Commitlog不能在另一个节点上播放,或者 簇。它们是特定于其来源节点的事务。
source-阅读说明(“重要说明:时间点还原需要重新启动集群才能运行commitlog重播”和“一些有用的计划说明”
最近更新:
我不确定“ test2 cassandra cluster完全替换了test1 cluster”的含义。我的假设是您还原了所有内容,包括系统键空间。
如果您这样做,是的,那么应用提交日志可能会起作用,因为除了IP和主机名之外,群集还是一样。
如果查看CommitLogReader代码,则会发现如果抛出UnknownTableException(基本上是在提交日志和系统键空间之间表的ID不相同的情况下),则认为该突变是无效的
我在ccm上进行了类似的测试,并在文件系统和system_schema.tables中更改了表的ID之后,成功重播了提交日志。
从我的角度来看,您的集群非常混乱。尽管您可以做到这一点并且可能会奏效,但我认为您始终会有损坏数据的高风险。
因此,由于在datastax文档(我们可以考虑使用Cassandra的基础文档)中声明支持此操作,因此不建议这样做。