2017-08-28 76 views
0

我对Cassandra数据建模有疑问。对不起,很长的帖子。Cassandra数据模型指导

我在这里采取假设的情况。假设我有一个主服务器,它从网络上的机器(1个或多个)收集数据。其他机器的数据形式如机器细节,状态,是否连接,是上或下,是台式机还是笔记本电脑,就像这样。我有这样

  1. 由于主服务器ID获取连接到它
  2. 鉴于机器ID的机器列表,获取本机的详细信息的查询。
  3. 鉴于机器的状态(没有其他)获取机器列表(一个或多个)
  4. 鉴于标志is_connected获取连接到主服务器的机器列表?
  5. 鉴于国旗is_up获取机器列表?

因此,根据Cassandra,我们应该为每个查询(近似)创建一个列族。我担心的是上面的查询#3,#4,#5,这些查询的where子句分别是status,is_connected和is_up,因此为了满足这些查询,我必须创建包含这些标志作为分区键或集群键的表。

CREATE TABLE server (
    server_id text, 
    server_name text, 
    status text, 
    . 
    . 
    . 
    . 
    . 
    other information, 
    PRIMARY KEY (server_id)) 

CREATE TABLE machine (
    machine_id text, 
    machine_name text, 
    status boolean, 
    is_connected boolean, 
    is_up boolean, 
    . 
    . 
    . 
    . 
    . 
    other information, 
    PRIMARY KEY (machine_id)) 

    CREATE TABLE machine_by_status (
     machine_id text, 
     machine_name text, 
     status boolean, 
     is_connected boolean, 
     is_up boolean, 
     . 
     . 
     . 
     . 
     . 
     other information, 
     PRIMARY KEY (status, machine_id)) 

    CREATE TABLE machine_by_connected (
     machine_id text, 
     machine_name text, 
     status boolean, 
     is_connected boolean, 
     is_up boolean, 
     . 
     . 
     . 
     . 
     . 
     other information, 
     PRIMARY KEY (is_connected, machine_id)) 

    CREATE TABLE machine_by_up_down (
     machine_id text, 
     machine_name text, 
     status boolean, 
     is_connected boolean, 
     is_up boolean, 
     . 
     . 
     . 
     . 
     . 
     other information, 
     PRIMARY KEY (is_up, machine_id)) 

但是这些标志的值可能会在一段时间内发生变化。值可能是多个。如果这些是分区密钥或集群密钥的一部分,那么我无法更新或更改它。因此,一旦创建了我的专栏系列并添加了一些带有标志值的记录,那么对于新值,我该如何更新该记录,或者如果我添加新记录,那么如何删除旧记录?我想避免在写之前阅读。

数据收集的频率可能会有所不同,所以我不能使用TTL的固定值,以便Cassandra可以删除旧值。我知道上述模式存在问题,例如它可能会产生热点,或者可能会造成不平衡集群,这就是我需要指导的原因。我该如何处理这种情况。我的客户端应用程序只能在几页上基于这些标志进行查询。客户端没有其他数据要查询。

那么,如何创建列族来满足查询#3,#4,#5?在这种情况下,您的指导将帮助我提出良好的数据模型。

预先感谢您。

+0

可以插入多少台机器? –

+0

@AshrafulIslam机器数量可能会高达200万可能更多 – Shashi

+0

标志状态,is_connected,is_up所有这些都是低基数列,假设所有机器都已启动,所以您的所有数据都将位于一个分区中(在同一个节点上),会产生热点,不可扩展等。这是cassandra中非常糟糕的设计。 –

回答

1

国旗status,is_connected,is_up所有这些都是低基数分区。

比方说,所有的机器就到了,所以所有数据将在一个分区(在同一节点上),将创建热点,会不会是可扩展等

因此,而不是使低基数列(status,is_connected,is_up)作为分区密钥。为每个标志值创建单独的表格。

is_up

CREATE TABLE up_machines ( 
    machine_id text PRIMARY KEY, 
    machine_name text, 
); 

CREATE TABLE down_machines ( 
    machine_id text PRIMARY KEY, 
    machine_name text, 
); 

现在,如果你需要的上机列表,然后你可以从up_machines表中选择所有。同样为其他标志创建表。

另一件事情,而不是在那些选择所有记录,使用驱动程序分页系统

https://docs.datastax.com/en/developer/java-driver/2.1/manual/paging/

注:如果一台机器的状态改变,你必须从一个表中删除和插入到另一个。删除记录创建墓碑。如果这经常发生,可以生成巨大的墓碑。 About Deletes and Tombstones in Cassandra

+0

谢谢@ashrafulIslam – Shashi