Cassandra 写机制

1. Cassandra写流程

Cassandra的写入操作主要包含以下3个步骤:

(1)记录数据到commit log

(2)写数据到memtable(一般情况下一个column family有一个memtable)

(3)当commit log的size达到阀值或者memtable的size达到阀值时,将数据flush到SSTable中,flush完成后清空commit log和memtable

Cassandra写操作

(1)对于一个写操作,Cassandra首先将客户端提交的数据和操作记录到commit log中,此操作是为了提升可靠性(起到数据恢复的作用)。

(2)接着Cassandra将数据写入到内存表memtable中,memtable中组织的数据按照key排序。当memtable中的数据大小到达一定限制后,Cassandra才会将memtable中的数据批量刷新到一个SSTable中。这种机制,相当于缓存写回机制(Write-back Cache),优势在于将随机IO写变为顺序IO写, 大大降低了写操作对于存储系统的压力。

(3)SSTable一旦完成写入,就不可变更,只能读取。因此对于Cassandra来说,可以认为只有顺序写,没有随机写操作。

(4)由于SSTable的只读性,因此同一个Column Family的数据可能存储在多个SSTable中,如果一个Column Family中的数据量很大的时候,那么Cassandra需要合并读取多个SSTable和memtable,导致查询效率严重下降。为此Cassandra引入了BloomFilter,每个SSTable都拥有一个BloomFilter。BloomFilter是一个存储在内存中的数据结构,它能够快速判断某个给定的key是否位于某个SSTable中,因此,Cassandra能够快速定位某个key对应的SSTable。

(5)为了避免大量SSTable带来的性能影响,Cassandra通过一种称为压缩(Compaction)的机制来处理随着时间推移而不断膨胀的SSTables。Cassandra定期将多个SSTable合并成一个SSTable,由于每个SSTable中的数据均是有序的,因此只要做一次合并排序就可以完成该任务,这个代价是可以接受的。

(6)Cassandra的数据存储目录下,可以看到三种类型的文件,文件名的格式类似于:

         Column Family Name-序号-Data.db

         Column Family Name-序号-Filter.db

         Column Family Name-序号-index.db

其中Data.db文件是SSTable数据文件,SSTable是Sorted Strings Table的缩写,按照key排序后存储key/value键值字符串。index.db是索引文件,保存的是每个key在数据文件中的偏移位置,而Filter.db则是Bloom Filter算法生产的映射文件。

2. Cassandra Compaction Strategies

Cassandra主要支持三种数据压缩策略,Size Tiered Compaction Strategy(STCS)Leveled Compaction Strategy(LCS),Time Window Compaction Strategy(TWCS)。

2.1 Size Tiered Compaction Strategy(STCS)

当具有类似大小的SSTable的数目达到阀值(默认为4)时,STCS会将这些SSTables合并成一个新的SSTable,当这些新的SSTable数量增加到阀值,STCS会将他们合并成更大的SSTable。

优点:写占比高的情况下压缩效果好。

缺点:(1)将读操作变慢了,因为根据大小来进行合并的过程并不会对数据进行分组,这样使某个特定行的多个版本很有可能分散在多个SSTable中。

(2)浪费存储空间。由于SSTable是经过一段时间后合并的,一个被删除的记录,它的老版本可能一直存储在旧的SSTable中,直到新的合并出现才会将这些记录删除。因此对于一些经常进行删除操作的系统,其浪费的的空间是很大的。

(3)压缩时占用大量的空间。随着时间的推移,系统中会出现一些很大的SSTable。这时如果需要合并四个很大的SSTable,压缩占用的存储空间就是这四个SSTable大小的总和。

2.2 Leveled Compaction Strategy(LCS)

LCS将SSTable分层,每一层都拥有各自的SSTables。首先memtable flush数据到L0层,当L0层的SSTabel数量达到阀值(例如4)时,然后L0层4个的SSTabl会和和L1层的10个SSTable进行合并。从L1层开始,每一层的SSTable数量都是上一层的10倍,同时每个SSTable的默认大小为160MB。如果L1层合并后的数据量大于160MB*10,那么LCS会选择L1层的一个SSTable(合并后此SSTable会被删除),与L2层的SSTable进行合并。由于每个SSTable都是有序并且不相交的,因此从L2层也大约只需要选出10个SSTable来进行合并。

这样就解决了STCS出现的问题:

(1)由于每一层的各个SSTable中的数据都有序不相交,可以保证90%的读操作都在一个SSTable中完成,最坏情况是一个记录存在每一层,这样最坏情况下10TB数据也只需要读7层,也就是7个SSTable。

(2)最多只有10%的空间会被浪费。因为最坏的情况是该层的记录和完全存在在下一层中,而且每一层都是这种情况。也就是会所每一层都有10%(下一层数据是上一层的10倍)的数据时冗余的。

(3)在压缩合并操作的开销上,每次只会使用10倍于要压缩的sstable大小的空间。

适用条件:

对于一个更新操作和删除操作比较多的系统,或者读操作占比高的系统,使用分层压缩是比较合适的。因为这种系统会产生同一份数据的多个版本。但是由于这种压缩会在压缩中进行更多的IO操作,所以如果是一个主要是insert操作的系统,建议不要使用分层压缩方法。

2.3 Time Window Compaction Strategy(TWCS)

TWCS通过使用一系列的时间窗口将SSTables进行分组。在compaction阶段,TWCS在最新的时间窗口内使用STCS去压缩SSTables。在一个时间窗口的结束,TWCS将掉落在这个时间窗口的所有的SSTables压缩层一个单独的SSTable,在SSTable maximum timestamp基础上。一旦一个时间窗口的主要压缩完成了,这部分数据就不会再有进一步的压缩了。这个过程结束之后SSTable开始写入下一个时间窗口。

例如,从上午10点到上午11点,memtables flush到100MB的SSTables中。使用STCS策略将这些SSTables压缩到一个更大的SSTables中。在上午11点的时候,这些SSTables被合并到一个单独的SSTable,而且不会被TWCS再进行压缩了。在中午12点,上午11点到中午12点创建的新的SSTables被STCS进行压缩,在这个时间窗口结束的时候,TWCS压缩开始。注意在每个TWCS时间窗口包含不同大小的数据。

优势:用作时间序列数据,为表中所有数据使用默认的TTL。比DTCS配置更简单。

劣势:不适用于时间乱序的数据,因为SSTables不会继续做压缩,存储会没有边界的增长,所以也不适用于没有设置TTL(Time To Live)的数据。相比较DTCS,需要更少的调优配置。

参考:How is data written?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容