我需要一些Cassandra数据建模方面的帮助。 这是问题描述: 我有3台服务器处理用户请求NodeA,NodeB和NodeC。我有1000个不同的开发人员(可能是10000),并且必须为每个处理节点维护每个开发人员的$余额。 我可以看到两种建模方式: 1)使用developerid + balanceid作为行键的CF。列名称将是NodeA,NodeB和NodeC。
create table {
developerBalanceid int primarykey;
nodeA varchar;
nodeB varchar;
nodeC varchar;
}
2)带宽节点的CF,节点ID为键。列名称为developerid + balanceid。这看起来类似于存储在Cassandra中的时间序列数据。
create table {
nodeid varchar as primary key;
developerBalanceid int; //this will be dynamic columns
}
运营: a)写入:每隔5秒,每个节点都会为每个开发者更新$ balance。更具体地,在每个时间t + 5,节点A将写入1000个平衡值。节点B也会写入1000个余额值和节点C.
b)读取:读取也会每5秒钟读取一次特定的开发者平衡。
看来2)是建模的最佳方式。 我确实有一些关于行如何与我想要的查询一起工作的问题。 在最坏的情况下,宽行读取的iops数量是多少。 我应该考虑其他优化,例如写入压缩吗?
我知道我可以运行一些测试并检查性能。但我也希望听到其他经历。
答案 0 :(得分:1)
使用Cassandra进行建模时的基本规则是"来自您的查询的模型"。你问题的主要论点是:
阅读特定的开发人员平衡。
如果您通过developerBalance查询,那么developerBalance必须是您主键的开头。你的解决方案1对我来说更好。
使用解决方案2,您无法编写
select * from my_table where developerBalanceid=?
...不扫描整个群集
你必须明白Cassandra查询不能做什么,partition key and cluster key是什么。 Another link