我对Cassandra数据建模有疑问。对不起有点长的帖子。
我在这里假设一个假设的情况。假设我有一个主服务器,它从网络上的机器(1个或多个)收集数据。其他机器的数据形式如机器详细信息,状态,是否连接,是否上下,是台式机还是笔记本电脑,类似这样。我有这样的疑问
因此,根据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))
但这些标志的价值可能会在一段时间内发生变化。值可以是多个。如果这些是分区键或群集键的一部分,那么我无法更新或更改它。因此,一旦我的列族被创建并且记录添加了一些value值,那么对于新值我如何更新该记录或者如果我添加新记录那么我该如何删除旧记录?我想在写之前避免阅读。
数据收集的频率可能会有所不同,因此我无法使用TTL的固定值,因此Cassandra可以删除旧值。据我所知,上面的模型存在问题,例如它可能会产生热点或者可能会产生不平衡集群,这就是我需要指导的原因。我该如何处理这种情况。我的客户端应用程序只能在几页上基于这些标志进行查询。客户端没有其他数据可供查询。
那么如何创建列族以满足查询#3,#4,#5?在这种情况下,您的指导将帮助我提出良好的数据模型。
提前谢谢。
答案 0 :(得分: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