nosql – Cassandra SSTables和Compaction
所以我正在研究Cassandra并试图了解架构,我正在从wiki阅读以下页面:
http://wiki.apache.org/cassandra/MemtableSSTable 因此,为了遵循此处的工作流程,您发送更新表的请求,将此请求写入CommitLog,然后写入名为Memtable的内存表(如果系统出现故障,可以从Commitlog重建).一旦Memtable达到一定的大小,它就会将整个Memtable刷新到光盘上的SSTable,它不能再被修改,只能在压缩过程中合并.当您达到可配置数量的SSTable时,您会进行压缩,这基本上会合并结果,从而释放磁盘空间并创建一个新的和改进的最新SSTable.如果我在这里弄错了,请纠正我. 现在我有一些关于压实的问题.首先,这次行动有多贵?如果我在光盘上有两个SSTables时要求压缩,这是否会令人望而却步,或者我会更好地服务,直到半夜使用率下降? 您可以提供的任何关于此的信息和经验都会很棒!
试着回答每个问题:
压缩必须复制它正在压缩的SSTable中的所有内容(减去来自墓碑或覆盖的任何湮灭).然而,这比起初看起来要便宜,因为压缩使用纯粹的顺序IO,这在旋转磁盘上是好的和快速的.
这意味着您的写入会变得更加昂贵;想象每次写入都会导致新的SSTable;因此,每次写入都必须压缩所有写入之前的写入.编写N项的成本为N ^ 2. 更好的想法是采用类似Acunu的双倍数组使用的压缩策略:将每个SSTable(aka数组)存储在“级别”中,并在级别中有两个数组时压缩它们,将输出数组提升到下一级别.这可以显示为每次写入分摊到O((log N)/ B)顺序IO,同时将阵列数限制为O(log N). 该方案在Castle,Cassandra的(开源)存储引擎中实现.有关更多信息,请参阅此处: > http://skillsmatter.com/podcast/nosql/castle-big-data NB我为Acunu工作
使用较小的SSTable进行压缩将花费更少的时间,但您必须完成更多的操作.真的是它的马匹课程. SSTable计数&但是,尺寸会影响读取性能(参见下一个问题)
对于点读取,不是很多:Cassandra(和Castle)有Bloom过滤器,以避免在知道密钥不存在时查看SSTables,并且当它找到正确的值时可以提前终止(通过对值使用时间戳)和SSTables). 但是,使用get_slice查询时,您无法提前终止,因此您必须访问可能包含行中值的每个SSTable – 因此,如果您有很多,则get_slices将会更慢. get_range_slices的情况更糟,你不能使用bloom过滤器,每次调用都必须访问每个SSTable.这些调用的性能将与您拥有的SSTable数量成反比. 更重要的是,有数千个SSTables,布隆过滤器误报率(~1%)将开始受到伤害,因为每次查找都需要查看10个不包含该值的SSTable!
在Cassandra中,一旦在内存中没有对它的引用(由垃圾收集器决定),SSTable就会被删除.所以读取不需要担心,旧的SSTables会被懒散地清理掉. 谢谢 汤姆 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |