我很难在 Apache Cassandra(版本 3.0.9)上恢复快照。据我所知,我正在遵循 datastax 博客上描述的程序以及其他几个程序(例如:http ://datascale.io/cloning-cassandra-clusters-fast-way/ )。然而我可能会丢失一些东西,每次我进行恢复时,数据都会丢失。
设置: 6 个节点集群(1 个 DC,3 个机架,每个机架 2 个节点),复制因子设置为 3。机器托管在 AWS 上。
备份程序(在每个节点上):
nodetool snapshot mykeyspace
cqlsh -e 'DESCRIBE KEYSPACE mykeyspace' > /tmp/mykeyspace.cql
nodetool ring | grep "$(ifconfig | awk '/inet /{print $2}' | head -1)" | awk '{print $NF ","}' | xargs > /tmp/tokens
我得到了 nodetool 快照命令生成的文件,并在 S3 上将它们与令牌和 cql 一起备份。
恢复过程(对于每个节点,除非指定):
(创建新虚拟机后)
- 下载快照、令牌和密钥空间
- 停止服务卡桑德拉
- 删除
/var/lib/cassandra/commitlog/*
和/var/lib/cassandra/system/
- 将令牌插入
cassandra.yaml
- 启动服务卡桑德拉
mykeyspace.cql
仅从一个节点上恢复 mykeyspace- 等待复制并停止服务 cassandra
- 删除
.db
文件夹中的文件/var/lib/cassandra/data/mykeyspace/
- 对于每个表,将快照文件 (
.db
,.crc32
,.txt
) 复制到/var/lib/cassandra/data/mykeyspace/$table/
- 重启服务cassandra
- 运行
nodetool repair mykeyspace -full
,一次一个节点
结果 :
总是有缺失的行,每个表的数量大致相同,但绝不是相同的。我试图“混淆”一些过程,比如在令牌之前恢复密钥空间,nodetool refresh
在修复之前运行,但我每次都遇到同样的问题。
由于我距离“良好”恢复不远,我认为我遗漏了一些非常明显的东西。分析日志并没有真正帮助,因为它们没有显示任何错误/失败消息。
欢迎任何帮助:) 如果需要,我当然可以提供更多信息。
编辑:没有人?我用 cassandra 版本(3.0.9)更新了这个问题,我一开始就忘记了。我再次尝试恢复,但没有运气。我真的没有更多的想法:(
该
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>
在每个节点上一个一个地执行。好吧,故事结束,愚蠢的我!
initial_token
在我的恢复过程中,cassandra.yaml 中的行被错误地“植入”了。如果 ':' 后没有空格initial_token
,则 cassandra 无法启动。因此,该行一直被注释并且标记不被解释!tldr:
initial_token:<values>
= 错误initial_token: <values>
= 好非常感谢 Josh Purvis 坚持这个参数的重要性:-)