Cassandra 卡桑德拉数据模型指南
我有一个关于卡桑德拉数据建模的问题。抱歉发了这么长的邮件 我在这里假设一个情况。假设我有一个主服务器,它从网络上的1台或多台机器收集数据。其他机器的数据以机器详细信息、状态、连接与否、上下、台式机或笔记本电脑等形式显示。我有这样的疑问 给定主服务器id,获取连接到它的计算机的列表 给定机器id,获取机器详细信息。 给定机器的状态,没有其他东西可以获取一台或多台机器的列表 给定标志is_connected,获取连接到主服务器的机器列表? 既然旗子升起了,你能拿到机器清单吗? 因此,按照Cassandra的说法,我们应该为每个查询创建一个列族。我担心的是上面的查询3、4、5,这些查询的where子句分别是status、is_connected和is_up,所以为了满足这些查询,我必须创建一个表,其中包含这些标志作为分区键或集群键Cassandra 卡桑德拉数据模型指南,cassandra,data-modeling,cassandra-3.0,Cassandra,Data Modeling,Cassandra 3.0,我有一个关于卡桑德拉数据建模的问题。抱歉发了这么长的邮件 我在这里假设一个情况。假设我有一个主服务器,它从网络上的1台或多台机器收集数据。其他机器的数据以机器详细信息、状态、连接与否、上下、台式机或笔记本电脑等形式显示。我有这样的疑问 给定主服务器id,获取连接到它的计算机的列表 给定机器id,获取机器详细信息。 给定机器的状态,没有其他东西可以获取一台或多台机器的列表 给定标志is_connected,获取连接到主服务器的机器列表? 既然旗子升起了,你能拿到机器清单吗? 因此,按照Cassan
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,
);