在Cassandra中使用非常宽的行时的I/O含义



我开始使用Cassandra(我是新手)进行一个项目,我正在开发一个模式。我的一个问题是,如果一行中包含数百万列,特别是与写入有关的列,那么I/O意味着什么?

为了明确我想做什么,我本质上也想跟踪IP属于哪个域。我想这样做的一种方法是使用类似"google.com"的行键,并且该行中的每一列都是属于所述域的IP地址。有人告诉我,如果你的列很宽,并且你对它进行了更改,那么它将创建大量I/O b/c,它必须在某个点将整行重写到磁盘b/c,数据是不可变的。这是正确的吗?我认为Cassandra只需将更改后的数据写入提交日志和内存表即可。然后,当数据被刷新并进行压缩时,它会将数据合并到列族的新SSTable中。

宽行通常用于时间序列数据,通常不会成为问题。不过,每一行必须适合一个节点(机器)-请参阅http://wiki.apache.org/cassandra/CassandraLimitations

架构的一个问题是,您必须搜索所有域(行)才能找到IP,这将使按IP查找效率非常低。如果你确实想按IP查找,那么以某种方式键入IP的行会更好;你可能想要两者,这样你就可以向任何一个方向抬头看。

您对commitlog/memtable->SSTable进程的看法是正确的,但请参阅此线程,其中提到由于in_memory_compaction_limit_in_mb,压缩可能会较慢,但自编写以来,压缩已经发生了一些更改,可能是过时的信息。

您可以始终使用playOrm,它为您处理宽行,然后您可以只执行S-SQL(可扩展SQL)。您只需要正确地对数据进行分区就可以执行S-SQL。一般来说,分区是按客户或时间等进行的(您可以在分区内进行连接和所有操作)。

最新更新