在Cassandra可以更新到位吗?

时间:2014-12-12 12:49:38

标签: cassandra cassandra-2.0 cassandra-cli nosql

我在Cassandra有一个表,我用1000个条目填充一些行(每行有10000多列)。行中的条目经常更新,基本上只是一个字段(它是一个整数)用不同的值更新。列的所有其他值保持不变。我的问题是,更新是否会就地完成? Cassandra频繁更新参赛作品有多好?

3 个答案:

答案 0 :(得分:5)

首先,每次更新都是对cassandra的顺序写入,因此,就cassandra而言,无论是更新还是写入,它对cassandra都没有任何影响。

真正的问题是你需要多快读取那些可供阅读的写入?正如@john建议的那样,首先将所有写入写入驻留在内存中的可变CQL Memtable。因此,每个更新实际上都附加为特定CQL表的memtable的新顺序条目。它同时也定期写入`commitlog' (每10秒钟)耐用性。

当Memtable已满或达到comittlog的总大小时,cassandra会将所有数据刷新为不可变的Sorted String Table(SSTable)。刷新之后,压缩是保留新列值的所有PK条目并删除所有先前值(更新前)的过程。

经常刷新会导致频繁顺序写入磁盘和压缩的开销,这会占用大量I / O并对cassandra性能产生严重影响。

就读取而言,首先cassandra将尝试从row cache(如果已启用)或memtable读取。如果它失败,它将转到bloom filterkey cachepartition summarypartition index,最后按顺序转到SSTable。收集所有列值的数据后,内存中的聚合和具有最新时间戳的列值将在聚合后返回给客户端,并在row cache中为该分区键进行输入。

所以,是的,当您查询分区键时,它将扫描该特定CQL表的所有SSTable以及尚未刷新到磁盘的所有列值的memtable。

答案 1 :(得分:3)

最初,这些更新存储在名为Memtable的内存数据结构中。 Memtables定期刷新为不可变的SSTables。

因此,将从各种SSTable中读取单个宽行。正是在一个名为“compacation”的过程中,不同的SSTables将被合并到磁盘上更大的SSTable中。

提高刷新的阈值Memtables是一种优化方法。如果在将Memtable刷新到磁盘之前更新速度非常快,我认为更新应该在内存中就位,但不确定。

此外,每个读取操作首先检查Memtables,如果数据仍在那里,它将被简单地返回 - 这是最快的访问。

Cassandra read path

When a read request for a row comes in to a node, the row must be combined from all SSTables on that node that contain columns from the row in question

Cassandra write path:

答案 2 :(得分:0)

不,无法进行更新。

正如@john建议的那样,如果你经常写,那么你应该延迟刷新过程。在刷新期间,存储在MemTable中的同一分区的多次写入将被写入新创建的SSTable中的单个分区。

C *适合重写。但是,您需要监视每次读取访问的SSTable的数量。如果#太高,那么您需要检查压缩策略。