cassandra - 将数据迁移到新集群后,Cassandra 集群中的数据不一致
问题描述
将数据移动到新集群后,我发现一些数据不一致。
旧集群总共有 9 个节点,每个节点上都有 2+ TB 的数据。新集群与旧集群具有相同的节点集,并且配置相同。
这是我按顺序执行的操作:
nodetool snapshot
.- 将该快照复制到目标
- 在目标集群上创建了一个新的键空间。
- 用于
sstableloader
加载的实用程序。 - 重新启动所有节点。
成功完成传输后,我运行了几个查询来比较(旧集群与新集群),发现新集群不一致,但我看到的数据正确分布在每个节点上(nodetool status
)。相同的查询为某些分区返回不同的结果集,我第一次得到零行,第二次得到 100 行,200 行,最终它对于少数分区和记录计数与旧集群匹配变得一致。
新集群中很少有分区没有数据,而旧集群有这些分区的数据。
cqlsh
我尝试在with上运行查询,CONSISTENCY ALL
但问题仍然存在。
我是否错过了之前和之后需要考虑的任何重要步骤?
是否有任何程序可以找出其根本原因?
我目前正在跑步"nodetool repair"
,但我怀疑这是否可以解决,因为我尝试使用 Consistency ALL。
非常感谢您的帮助!
解决方案
结果最终变得一致的事实表明副本不同步。
您可以通过查看加载数据时的日志来验证这一点,特别是对于丢弃的突变。您还可以检查nodetool netstats
. 如果您看到阻止读取修复,这是副本不同步的另一个确认。
如果您还有其他可以测试的分区,请TRACING ON
在查询时在 cqlsh中启用CONSISTENCY ALL
. 您将看到跟踪输出中是否存在摘要不匹配,这也应该触发读取修复。干杯!
[编辑] 根据您在下面的评论,听起来您可能没有使用sstableloader
. 如果您错过了将 SSTables 加载到目标集群,那么这可以解释为什么数据丢失了。
推荐阅读
- sql - 从字母数字字符串中删除字符并更新列中的数值
- python - 将 RDD 转换为 DataFrame 时出现 java.lang.StackOverFlowError
- python - 如何从网络获取数据
- r - 禁用闪亮仪表板中的垂直滚动条
- javascript - Reactjs:总是使用'npm start'的替代方案
- sql - 按列分组的自定义排序 SSRS / SQL
- haskell - 如何从 GHCI 中列出启用的语言扩展?
- asp.net-core - 为什么在 VS 2017 到 VS 2019 升级后,查询不能按数据库表中的计算列排序
- excel - 动态拉取 Excel 工作簿
- sql - 我需要查询以我的名字开头但不以该集合中的任何开头的孩子