【发布时间】:2022-08-09 16:48:08
【问题描述】:
我们有一个 21 节点的 cassandra 集群,其中有一个包含近 20 亿行的 cassandra 计数器表。 我曾尝试迁移此表。首先,我使用这样的代码(在 golang 中)在两个集群中进行了双重写入:
counterDiff := incrementValue
_, err := newRepo.FindById(ctx, id)
if err != nil {
if err == ErrRecordNotFound {
record, err := oldRepo.FindById(ctx, id)
if err != nil {
// log
return
}
counterDiff = record.Count
} else {
// log
return
}
}
newRepo.Update(ctx, id, counterDiff, false)
事实上,我用旧集群的值初始化了新的计数器。
然后我使用 CQL 查询迁移数据,并在新集群中一一写入所有行,如果行/键不存在。
但不幸的是,在验证步骤中,我看到了两个集群之间的一些差异,并且很多差异(不是全部)的形式为:newClusterValue == n * oldClusterValue
现在我有4个问题:
- 我的迁移策略有什么问题?我认为我应该在我的双重写入功能中使用互斥锁来防止竞争条件。有什么建议吗?还有什么问题吗?
- scylla 或 cassandra
sstableloader工具如何处理计数器列?我可以使用它们进行迁移吗? - 迁移计数器表的最佳方法是什么?
- 由于更新不是幂等的,cassandra 计数器表是否适合准确计数?在大数据的情况下有更好的解决方案吗?
标签: cassandra migration database-migration scylla