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

时间:2012-02-24 19:02:06

标签: nosql cassandra

我开始使用Cassandra(我是新手)开展一个项目,我正在开发一个架构。我遇到的一个问题是I / O的含义是否存在一行,其中包含数百万列,特别是有关写入的内容?

为了清楚我正在尝试做什么,我基本上想要跟踪IP所属的域。我想到这样做的一种方法是使用像'google.com'这样的rowkeys,并且行中的每个列都是属于所述域的IP地址。有人告诉我,如果您的列很宽并且您更改它,那么它将创建大量的I / O b / c它必须在某个时刻将整个行重写为磁盘b / c数据是不可变的。它是否正确?我认为Cassandra只会将更改的数据和只有更改的数据写入提交日志和memtable。然后,当刷新数据并进行压缩时,它会将数据合并到列族的新SSTable中。

2 个答案:

答案 0 :(得分:3)

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

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

您对commitlog / memtable-> SSTable进程是正确的,但请参阅this thread,提到由于in_memory_compaction_limit_in_mb而压缩可能会变慢 - 但是压缩后会有一些变化写的,它可能是过时的信息。

答案 1 :(得分:0)

你总是可以使用playOrm为你做宽行,然后你就可以做S-SQL(可扩展的SQL)。您只需要正确分区数据以执行S-SQL。通常分区是按客户或按时间等等(您可以在分区内进行连接和一切)。