Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra 卡桑德拉数据模型指南_Cassandra_Data Modeling_Cassandra 3.0 - Fatal编程技术网

Cassandra 卡桑德拉数据模型指南

Cassandra 卡桑德拉数据模型指南,cassandra,data-modeling,cassandra-3.0,Cassandra,Data Modeling,Cassandra 3.0,我有一个关于卡桑德拉数据建模的问题。抱歉发了这么长的邮件 我在这里假设一个情况。假设我有一个主服务器,它从网络上的1台或多台机器收集数据。其他机器的数据以机器详细信息、状态、连接与否、上下、台式机或笔记本电脑等形式显示。我有这样的疑问 给定主服务器id,获取连接到它的计算机的列表 给定机器id,获取机器详细信息。 给定机器的状态,没有其他东西可以获取一台或多台机器的列表 给定标志is_connected,获取连接到主服务器的机器列表? 既然旗子升起了,你能拿到机器清单吗? 因此,按照Cassan

我有一个关于卡桑德拉数据建模的问题。抱歉发了这么长的邮件

我在这里假设一个情况。假设我有一个主服务器,它从网络上的1台或多台机器收集数据。其他机器的数据以机器详细信息、状态、连接与否、上下、台式机或笔记本电脑等形式显示。我有这样的疑问

给定主服务器id,获取连接到它的计算机的列表 给定机器id,获取机器详细信息。 给定机器的状态,没有其他东西可以获取一台或多台机器的列表 给定标志is_connected,获取连接到主服务器的机器列表? 既然旗子升起了,你能拿到机器清单吗? 因此,按照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))
但这些标志的值可能会随着时间的推移而变化。这些值可以是多个。如果这些是分区键或集群键的一部分,则我无法更新或更改它。因此,一旦我的列族被创建,并且一条记录被添加了一些flag值,那么对于新值,我如何更新该记录,或者如果我添加了新记录,那么我如何删除旧记录?我想避免先读后写

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

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


提前感谢。

标志状态为“已连接”,处于“已启动”,所有这些都是低基数分区

假设所有机器都启动了,所以所有数据都将在同一节点上的单个分区中,将创建热点,不可扩展等

因此,与其设置低基数列状态,不如将is_连接,作为分区键。为每个标志值创建单独的表

例如:

现在,如果您需要up machine列表,那么您可以从up_machines表中选择all。类似地,为其他标志创建表

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


注意:如果机器状态发生更改,则必须从一个表中删除,然后插入到另一个表中。删除记录会创建墓碑。如果这种情况经常发生,就会产生巨大的墓碑

可以插入多少台机器?@AshrafulIslam机器的数量可能会增加到200万台可能更多标记状态、已连接、已启动所有这些都是低基数列,假设所有机器都已启动,因此所有数据都将位于同一节点上的单个分区中,将创建热点,将不可扩展等。这在cassandra中是一个非常糟糕的设计。对于查询3、4、5,您的客户端能否以某种方式向您提供服务器id?@AshrafulIslam我理解这一点。这就是我来这里寻求指导的原因。我可以查看客户机是否可以发送服务器id或机器id,但假设我有一个屏幕,我想列出所有连接为true的机器?谢谢@ashrafulIslam
CREATE TABLE up_machines ( 
    machine_id text PRIMARY KEY, 
    machine_name text, 
); 

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