我开始使用Cassandra(我是新手)开展一个项目,我正在开发一个架构。我遇到的一个问题是I / O的含义是否存在一行,其中包含数百万列,特别是有关写入的内容?
为了清楚我正在尝试做什么,我基本上想要跟踪IP所属的域。我想到这样做的一种方法是使用像'google.com'这样的rowkeys,并且行中的每个列都是属于所述域的IP地址。有人告诉我,如果您的列很宽并且您更改它,那么它将创建大量的I / O b / c它必须在某个时刻将整个行重写为磁盘b / c数据是不可变的。它是否正确?我认为Cassandra只会将更改的数据和只有更改的数据写入提交日志和memtable。然后,当刷新数据并进行压缩时,它会将数据合并到列族的新SSTable中。
答案 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。通常分区是按客户或按时间等等(您可以在分区内进行连接和一切)。