【发布时间】:2018-02-06 00:50:46
【问题描述】:
我有一个关于 Cassandra 数据建模的问题。抱歉,帖子有点长。
我在这里假设情况。假设我有一个主服务器,它从网络上的机器(一台或多台)收集数据。其他机器的数据有机器详细信息、状态、连接与否、启动或关闭、台式机或笔记本电脑等形式。我有这样的疑问
- 给定主服务器 ID,获取与其连接的计算机列表
- 给定机器 ID,获取机器详细信息。
- 给定机器的状态(没有别的)获取机器列表(一台或多台)
- 给定标志 is_connected 获取连接到主服务器的机器列表?
- 给定标志 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 但假设我有一个屏幕,我想在其中列出所有将 is_connected 设置为 true 的机器?
标签: cassandra data-modeling cassandra-3.0