database-design - 设计 Cassandra 数据模型的最佳实践是什么?

标签 database-design nosql cassandra

需要避免哪些陷阱?您有任何交易中断吗?例如,我听说导出/导入 Cassandra 数据非常困难,这让我想知道这是否会妨碍将生产数据同步到开发环境。

顺便说一句,很难找到关于 Cassandra 的好的教程,这是我唯一的教程 http://arin.me/code/wtf-is-a-supercolumn-cassandra-data-model还是很基础的。

谢谢。

最佳答案

对我来说,最重要的是决定是使用 OrderedPartitioner 还是 RandomPartitioner。

如果您使用 RandomPartitioner,则无法进行范围扫描。这意味着您必须知道任何事件的确切 key ,包括清理旧数据。

因此,如果您有很多流失,除非您有某种神奇的方法可以准确地知道您已插入内容的键,否则使用随机分区器您很容易“丢失”内容,这会导致磁盘空间泄漏最终将耗尽所有存储空间。

另一方面,您可以询问有序分区程序“A 和 B 之间的列族 X 中有哪些键”? - 它会告诉你。然后您可以清理它们。

但是,也有一个缺点。由于 Cassandra 不进行自动负载平衡,因此如果您使用有序分区器,您的所有数据很可能最终都会出现在一两个节点中,而不会出现在其他节点中,这意味着您会浪费资源。

对此我没有任何简单的答案,除了在某些情况下您可以通过在开头放置一个简短的哈希值(您可以从其他数据源轻松枚举的值)来获得“两全其美”的效果。键 - 例如用户 ID 的 16 位十六进制散列 - 这将为您提供 4 个十六进制数字,后跟您真正想要使用的 key 。

然后,如果您有最近删除的用户列表,您只需对他们的 ID 进行哈希处理并进行范围扫描即可清理与他们相关的任何内容。

下一个棘手的位是二级索引 - Cassandra 没有任何 - 所以如果您需要通过 Y 查找 X,您需要在两个键下插入数据,或者有一个指针。同样,当这些指针指向的东西不存在时,可能需要清理这些指针,但是没有简单的方法可以在此基础上查询东西,因此您的应用程序需要记住。

应用程序错误可能会留下您忘记的孤立键,并且您将无法轻松检测它们,除非您编写一些垃圾收集器来定期扫描数据库中的每个键(这将需要一段时间 - 但您可以分块进行)以检查不再需要的内容。

这些都不是基于实际使用情况,只是我在研究过程中发现的。我们不在生产中使用 Cassandra。

编辑:Cassandra 现在在主干中有二级索引。

关于database-design - 设计 Cassandra 数据模型的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1502735/

相关文章:

java - 如何访问 java Derby 数据库?我确实需要一些有用的建议

mysql - 文本或 blob 字段是否会减慢对表的访问

sql - 在关系数据库中存储矩阵

MongoDB 在对象数组中加入数据

nosql - Cassandra内部keyspace "system"的使用

Cassandra cql : select N “most recent” rows in ascending order

mysql - 需要帮助优化具有 100K+ 行的表的基本连接操作

django - 适用于 Appengine 或非 SQL 中 Django 模型国际化的任何应用程序?

cassandra - Astyanax ColumnFamily<K, C> 用于多列?

python - Pylons Web 应用程序中的唯一用户 ID