【问题标题】:Cassandra data model guidanceCassandra 数据模型指南
【发布时间】:2018-02-06 00:50:46
【问题描述】:

我有一个关于 Cassandra 数据建模的问题。抱歉,帖子有点长。

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

  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?您的指导将帮助我在这种情况下提出良好的数据模型。

提前谢谢你。

【问题讨论】:

  • 可以插入多少台机器?
  • @AshrafulIslam 机器数量可能高达 200 万台可能更多
  • 标志状态,is_connected,is_up 都是低基数列,假设所有机器都启动了,所以你所有的数据都在一个分区中(在同一个节点上),将创建热点,不可扩展等。在 cassandra 中这是一个非常糟糕的设计。
  • 对于查询 #3、#4、#5,您的客户端能否以某种方式为您提供 server_id ?
  • @AshrafulIslam 我明白这一点。这就是为什么我在这里得到一些指导。我可以查看客户端是否可以发送 server_id 或 machine_id 但假设我有一个屏幕,我想在其中列出所有将 i​​s_connected 设置为 true 的机器?

标签: cassandra data-modeling cassandra-3.0


【解决方案1】:

标志statusis_connectedis_up都是低基数分区。

假设所有机器都已启动,因此您的所有数据都将位于单个分区(在同一节点上)、创建热点、不可扩展等。

因此,不要将低基数列(statusis_connectedis_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 机器列表,那么您可以从 up_machines 表中选择所有。同样为其他标志创建表。

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

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

注意:如果机器状态发生变化,您必须从一个表中删除并插入到另一个表中。删除记录会创建墓碑。如果这种情况经常发生,可以生成巨大的墓碑。 About Deletes and Tombstones in Cassandra

【讨论】:

  • 谢谢@ashrafulIslam
猜你喜欢
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多