对我来说,最重要的是决定是使用 OrderedPartitioner 还是 RandomPartitioner。
如果您使用 RandomPartitioner,则无法进行范围扫描。这意味着您必须知道任何活动的确切密钥,包括清理旧数据。
因此,如果您有很多流失,除非您有某种神奇的方法可以准确地知道您插入了哪些键,否则使用随机分区器您很容易“丢失”东西,这会导致磁盘空间泄漏,并最终会导致磁盘空间泄漏。消耗所有存储空间。
另一方面,您可以询问有序分区程序“A 和 B 之间的列族 X 中有哪些键”? - 它会告诉你。然后您可以清理它们。
然而,也有一个缺点。由于 Cassandra 不进行自动负载平衡,因此如果您使用有序分区器,您的所有数据很可能最终都会出现在一两个节点中,而不会出现在其他节点中,这意味着您将浪费资源。
我对此没有任何简单的答案,除了在某些情况下您可以通过在键的开头放置一个短哈希值(您可以从其他数据源轻松枚举的值)来获得“两全其美” - 例如例如,用户 ID 的 16 位十六进制哈希值 - 将为您提供 4 个十六进制数字,后跟您真正想要使用的密钥。
然后,如果您有最近删除的用户列表,您只需对他们的 ID 进行哈希处理并进行范围扫描即可清理与他们相关的任何内容。
The next tricky bit is secondary indexes - Cassandra doesn't have any - so if you need to look up X by Y, you need to insert the data under both keys, or have a pointer. Likewise, these pointers may need to be cleaned up when the thing they point to doesn't exist, but there's no easy way of querying stuff on this basis, so your app needs to Just Remember.
应用程序错误可能会留下您忘记的孤立键,并且您将无法轻松检测它们,除非您编写一些垃圾收集器来定期扫描数据库中的每个键(这将需要一段时间 -但您可以分块进行)以检查不再需要的内容。
这些都不是基于实际使用情况,只是我在研究过程中发现的。我们不在生产中使用 Cassandra。
编辑:Cassandra 现在在主干中有二级索引。