Database design 什么';设计卡桑德拉数据模型的最佳实践是什么?

Database design 什么';设计卡桑德拉数据模型的最佳实践是什么?,database-design,nosql,cassandra,Database Design,Nosql,Cassandra,要避免的陷阱是什么?你有什么交易中断吗?例如,我听说导出/导入Cassandra数据非常困难,这让我怀疑这是否会妨碍将生产数据同步到开发环境 顺便说一句,很难找到关于卡桑德拉的好教程,我仅有的一本还是很基础的 谢谢。对我来说,最重要的是决定是使用OrderedPartitioner还是RandomPartitioner 如果使用RandomPartitioner,则无法进行范围扫描。这意味着您必须知道任何活动(包括清理旧数据)的确切密钥 因此,如果你有大量的搅动,除非你有某种神奇的方法知道你为哪

要避免的陷阱是什么?你有什么交易中断吗?例如,我听说导出/导入Cassandra数据非常困难,这让我怀疑这是否会妨碍将生产数据同步到开发环境

顺便说一句,很难找到关于卡桑德拉的好教程,我仅有的一本还是很基础的


谢谢。

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

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


因此,如果你有大量的搅动,除非你有某种神奇的方法知道你为哪些键插入了东西,否则使用随机分区器你很容易“丢失”东西,这会导致磁盘空间泄漏,最终会消耗所有的存储空间

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

然而,也有不利的一面。由于Cassandra不进行自动负载平衡,如果您使用有序分区器,很可能所有数据都将只在一个或两个节点中结束,而在其他节点中没有,这意味着您将浪费资源

对此,我没有任何简单的答案,除非在某些情况下,您可以通过在密钥开头添加一个简短的散列值(您可以从其他数据源轻松枚举的内容)来获得“两全其美”,例如用户ID的16位十六进制散列,它将为您提供4个十六进制数字,然后是你真正想用的钥匙

然后,如果你有一个最近被删除的用户列表,你只需要散列他们的ID和范围扫描来清除任何与他们相关的内容

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

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

这些都不是基于实际使用情况,只是我在研究中发现的。我们在生产中不使用卡桑德拉

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

另一个教程在这里:

你有什么交易中断吗? 不一定是交易破坏者,但要注意一些事情

  • 客户端连接到最近的节点(它应该事先知道该节点的地址),与通过它代理的所有其他Cassandra节点的所有通信。 A.读/写流量在节点之间分布不均匀-有些节点代理的数据比它们自己承载的数据多 B如果节点宕机,客户端将无能为力,无法读取或写入集群中的任何位置

  • 尽管卡桑德拉声称“写作永远不会失败”,但他们确实失败了,至少在说话的时候是这样。如果目标数据节点变得迟钝,请求超时并写入失败。节点无响应的原因有很多:垃圾收集器启动、压缩过程,等等… 在所有这些情况下,所有写/读请求都会失败。在传统的数据库中,这些请求会相应地变慢,但在Cassandra中,它们只是失败了

  • 有多重获取,但没有多重删除,也不能截断ColumnFamily

  • 如果一个新的空数据节点进入集群,则来自密钥环上一个相邻节点的部分数据将仅被传输。这会导致数据分布不均匀和负载不均匀。您可以通过将节点数量增加一倍来解决这个问题。您还应该手动跟踪令牌并明智地选择它们


  • 这太长了,无法作为评论添加,因此为了澄清问题列表中的一些误解,请回复:

  • 任何客户端都可以连接到任何节点;如果您选择的第一个节点(或通过负载平衡器连接到的节点)出现故障,只需连接到另一个节点即可。此外,还提供了一个“胖客户端”api,客户端可以在该api中自行指导写操作;一个例子是

  • 当服务器没有响应而不是无限期地挂起时超时是大多数处理过重载rdbms系统的人所希望的特性。Cassandra RPC超时是可配置的;如果您愿意,您可以将其设置为几天,然后处理无限期绞刑的问题。:)

  • 的确,目前还没有对多重删除或截断的支持,但目前正在审查这两个方面的补丁

  • 显然,在保持集群节点之间的负载平衡方面有一个折衷办法:您试图保持负载平衡的程度越高,您将进行的数据移动就越多,这不是免费的。默认情况下,Cassandra集群中的新节点将移动到令牌环中的最佳位置,以最小化不均匀性。在实践中,这已经被证明是有效的,而且集群越大,加倍的效果就越不理想。这一点在本文中有更多介绍


  • 我认为这值得更新,因为卡桑德拉1.2最近发布了

    在过去的18个月里,我一直在使用卡桑德拉制作社交游戏

    我的想法是,你必须利用卡桑德拉的优势。因此,很好地理解它的作用和方式,有必要查看要使用的数据模型,甚至确定另一个DB解决方案是否对您更有用

    OrderedPartitioner非常有用