![Cassandra 快照恢复:随机丢失数据](https://linux22.com/image/692311/Cassandra%20%E5%BF%AB%E7%85%A7%E6%81%A2%E5%A4%8D%EF%BC%9A%E9%9A%8F%E6%9C%BA%E4%B8%A2%E5%A4%B1%E6%95%B0%E6%8D%AE.png)
我在恢复 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 快照命令生成的文件,并将它们与令牌和 cql 一起备份到 S3 上。
恢复过程(针对每个节点,除非另有指定):
(创建新虚拟机之后)
- 下载快照、令牌和密钥空间
- 停止 Cassandra 服务
- 删除
/var/lib/cassandra/commitlog/*
并/var/lib/cassandra/system/
- 将 token 插入
cassandra.yaml
- 启动 Cassandra 服务
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) 更新了问题,我一开始就忘记了。我再次尝试恢复,但没有成功。我真的没有任何想法了 :(
答案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 强调这个参数的重要性 :-)