Cassandra 快照恢复:随机丢失数据

Cassandra 快照恢复:随机丢失数据

我在恢复 Apache Cassandra (版本 3.0.9) 上的快照时遇到了困难。据我所知,我正在遵循 datastax 博客上描述的步骤以及其他几个步骤(例如:http://datascale.io/cloning-cassandra-clusters-fast-way/)但我可能遗漏了一些东西,每次我进行恢复时,数据都会丢失。

设置 : 6 个节点集群(1 个 DC,3 个机架,每个机架有 2 个节点),复制因子设置为 3。机器托管在 AWS 上。

备份过程(在每个节点上):

  1. nodetool snapshot mykeyspace
  2. cqlsh -e 'DESCRIBE KEYSPACE mykeyspace' > /tmp/mykeyspace.cql
  3. nodetool ring | grep "$(ifconfig | awk '/inet /{print $2}' | head -1)" | awk '{print $NF ","}' | xargs > /tmp/tokens

我获取由 nodetool 快照命令生成的文件,并将它们与令牌和 cql 一起备份到 S3 上。

恢复过程(针对每个节点,除非另有指定):

(创建新虚拟机之后)

  1. 下载快照、令牌和密钥空间
  2. 停止 Cassandra 服务
  3. 删除/var/lib/cassandra/commitlog/*/var/lib/cassandra/system/
  4. 将 token 插入cassandra.yaml
  5. 启动 Cassandra 服务
  6. mykeyspace.cql仅从一个节点恢复 mykeyspace
  7. 等待复制并停止服务 cassandra
  8. 删除.db文件夹中的文件/var/lib/cassandra/data/mykeyspace/
  9. 将每个表的快照文件(.db,,.crc32.txt复制到/var/lib/cassandra/data/mykeyspace/$table/
  10. 重启 Cassandra 服务
  11. 运行nodetool repair mykeyspace -full,一次一个节点

结果 :

总是有缺失的行,每个表的数量大致相同,但从不相同。我尝试“混合”一下程序,例如在恢复令牌之前恢复密钥空间,在nodetool refresh修复之前运行,但每次都会遇到同样的问题。

由于我距离“良好”的恢复还差得很远,我认为我忽略了一些非常明显的东西。分析日志并没有真正起到帮助作用,因为它们没有显示任何错误/失败消息。

欢迎任何帮助:) 如果需要,我当然可以提供更多信息。

编辑:没人?我用 Cassandra 版本 (3.0.9) 更新了问题,我一开始就忘记了。我再次尝试恢复,但没有成功。我真的没有任何想法了 :(

答案1

该博客文章中的命令sed应该附加-Dcassandra.load_ring_state=false$JVM_OPTS,但其当前形式无效。

如果您直接从博客文章中复制该命令,则可能是此问题。您可以尝试以下命令,将其放在文件底部:

sudo sed -i '$ a\JVM_OPTS="$JVM_OPTS -Dcassandra.load_ring_state=false"' /etc/cassandra/cassandra-env.sh

nodetool repair -pr <ks>按照此过程操作后,您还需要在每个节点上逐个执行此操作。

答案2

好吧,故事结束了,我真笨!initial_token在我的恢复过程中,cassandra.yaml 中的行被错误地“删除”。如果密钥的“:”后面没有空格initial_token,则 cassandra 无法启动。因此,该行被保留为注释,并且标记未被解释!

总结:

  • initial_token:<values>= 错误
  • initial_token: <values>= 好

非常感谢 Josh Purvis 强调这个参数的重要性 :-)

相关内容