正确的cassandra键空间恢复过程

正确的cassandra键空间恢复过程,cassandra,backup,restore,Cassandra,Backup,Restore,我正在寻找确认,我的卡桑德拉备份和恢复程序是健全的,我没有遗漏任何东西。你能确认一下,或者告诉我是否有不正确/遗漏的地方吗 备份: 我每天通过“nodetool snapshot keyspace_name-t current_timestamp”运行我关心的密钥空间的完整备份。拍摄快照后,我将数据复制到一个装载的磁盘上,专用于备份,然后执行“nodetool clearnapshot$keyspace\u name-t$current\u timestamp” 我还每小时运行增量备份—执行“

我正在寻找确认,我的卡桑德拉备份和恢复程序是健全的,我没有遗漏任何东西。你能确认一下,或者告诉我是否有不正确/遗漏的地方吗

备份

  • 我每天通过“nodetool snapshot keyspace_name-t current_timestamp”运行我关心的密钥空间的完整备份。拍摄快照后,我将数据复制到一个装载的磁盘上,专用于备份,然后执行“nodetool clearnapshot$keyspace\u name-t$current\u timestamp”
  • 我还每小时运行增量备份—执行“nodetool flush keyspace_name”,然后将文件从每个keyspace的备份目录移动到备份装入点
恢复

到目前为止,我发现执行恢复(并经过测试/确认)的唯一有效方法是在群集中的所有Cassandra节点上执行此操作:

  • 阻止卡桑德拉
  • 清除commitlog*.log文件
  • 从要还原的表中清除*.db文件
  • 将快照/完整备份文件复制到该目录中
  • 复制我需要的任何增量文件(我没有使用多个增量文件进行测试,但我假设我必须按从最旧到最新的顺序覆盖这些文件)
  • 开始卡桑德拉
  • 在其中一个节点上,运行“nodetool repair keyspace_name”
  • 因此,我的问题是:

  • 上述备份和恢复策略是否有效?是否有任何步骤不准确或遗漏
  • 有没有一种方法可以在不停止每个节点上的Cassandra的情况下执行此操作?例如,是否有一种方法可以恢复一个节点上的数据,然后以某种方式使其具有“权威性”?我尝试了这一点,正如预期的那样,由于恢复的数据较旧,其他节点(较新)上的数据在修复期间同步时会被覆盖

  • 谢谢大家!

    有两种方法可以在不重新启动C*的情况下恢复Cassandra备份:

  • 将文件复制到位,然后运行“nodetool刷新”。这有一个警告,那就是这些行仍将比墓碑旧。因此,如果您试图恢复已删除的数据,它将不会执行您想要的操作。它也仅适用于本地服务器(您需要在之后修复)
  • 使用“sstableloader”。这将向所有节点加载数据。您需要确保从一个完整的副本中获得SSTABLE,这可能意味着从多个节点加载SSTABLE。额外的好处是,即使集群大小发生了变化,这种方法仍然有效。我不确定排序在这里是否重要(也就是说,我不知道行时间戳是在加载过程中保留的,还是在加载过程中重新定义的)