2017-03-16 64 views
1

我们计划使用Cassandra 3.1作为我们的数据存储。数据模型将使用user_uuid作为分区键/主键,而不使用集群键。查询模式是访问特定用户的user_uuid并用各种数据更新该行。目的不是简单地添加更多的列,而是完全覆盖值/列,例如。时间戳,版本和用户的其他各个方面。预计每天将有大约一百万个不同的用户在写,每个用户每天可以写几千次。Cassandra覆盖/更新行的最佳做法?

这是一种使用Cassandra作为数据存储的有效方式吗?通过研究,我发现在Cassandra中更新一行并不会创建墓碑,而是会创建“阴影”,当SSTable变得紧凑时会被删除。

因此,如果它不创建墓碑,那么这是一个安全和有效的方式来存储特定用户的数据?

+0

“每天有大约一百万个不同的用户在写,每个用户每天可以写几千次”如果我们的一个应用团队向我寻求新的clust呃并且说*那*,我的答案是那个**不**,这对于Cassandra来说不是一个好主意。 – Aaron

+0

感谢您的回复。什么特别会让你说这不是一个好主意? – Ste

+0

我担心的是,更新值经常(10k/day ea)会在下面创建如此之多的过时数据,以至于您的分区会变得太大而且不好看。当然压实会收回,但每天更新列值的10k次就太多了。 – Aaron

回答

2

Cassandra模型是一种仅追加(append-only) - 键+列对的每次更新或删除都被保存为新版本,而不是原地更新 - 墓碑只是一个说明该行被删除的版本。因此,即使在墓碑上使用它也会保存:)。在阅读时,Cassandra将只返回此类键/值对的最新值。

数据保存在sstables中,当其中2个压缩时,这些表中每个键值对的最新数据将在处理后保存。

卡桑德拉确实符合要求的负载,以及提供更新繁重的工作,我会建议使用平整压实战略 - 你可以在这里读到它:

http://www.datastax.com/dev/blog/when-to-use-leveled-compaction

而关于写路径:

https://docs.datastax.com/en/cassandra/2.1/cassandra/dml/dml_write_path_c.html