【问题标题】:Cassandra wide row versus regular rowCassandra 宽排与常规排
【发布时间】:2015-02-20 20:20:43
【问题描述】:

我需要一些有关 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 秒,每个节点都会为每个开发者更新 $ 余额。更具体地说,在每个时间 t+5,节点 A 将写入 1000 个余额值。节点 B 将写入 1000 个余额值,节点 C 也将写入。

b) 读取: 还会每 5 秒进行一次读取以读取特定的 developerBalance。

看来 2) 是对此建模的最佳方式。 我确实对我想要执行的查询的行宽有一些担忧。 在最坏的情况下,宽行读取会产生多少 iops。 我是否应该考虑其他优化,例如写入压缩?

我知道我可以运行一些测试并检查性能。但我也想听听其他的经验。

【问题讨论】:

    标签: cassandra cassandra-2.0


    【解决方案1】:

    使用 Cassandra 建模时的基本规则是“根据您的查询建模”。您问题的主要论点是:

    读取特定的 developerBalance。

    如果您通过 developerBalance 查询,则 developerBalance 必须是您的主键的开头。您的解决方案 1 对我来说更好。

    使用解决方案 2,您将无法编写

    select * from my_table where developerBalanceid=?
    

    ...不扫描整个集群

    你必须了解 Cassandra 查询不能做什么,partition key and cluster key 是什么。 Another link

    【讨论】:

    • 感谢您对金塔纳的建议。 Cassandra 规则也有链接。这真的很有用!
    猜你喜欢
    • 1970-01-01
    • 2021-09-15
    • 2017-07-09
    • 2016-05-16
    • 2018-12-19
    • 2023-04-11
    • 2012-01-05
    • 2011-06-13
    • 2010-10-24
    相关资源
    最近更新 更多