我在Cassandra有一个表,我用1000个条目填充一些行(每行有10000多列)。行中的条目经常更新,基本上只是一个字段(它是一个整数)用不同的值更新。列的所有其他值保持不变。我的问题是,更新是否会就地完成? Cassandra频繁更新参赛作品有多好?
答案 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 filter
,key cache
,partition summary
,partition 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的数量。如果#太高,那么您需要检查压缩策略。