Cassandra教程(三):Cassandra架构(下)

上篇介绍了Cassandra的架构、数据distribution 与 replication,本文主要介绍Cassandra的内部工作机制,包括存储引擎、Cassandra读写、数据一致性等。

1. 存储引擎

在分布式系统中,有些系统写数据采用read-and-write 的方式(如Elasticsearch),Cassandra为了避免read-and-write 带来的性能问题,没有采用read-and-write的方式,存储引擎将写操作保存于内存,每过一段时间,将内存中的数据以追加的方式,写入磁盘,磁盘中的数据都是不可更改、不可重写的。当读数据时,需要将读取的数据组合起来以得到正确的数据。

在内部实现上,Cassandra 采用了类似 Log-Structured merge tree 的存储结构存储数据,采用顺序IO,这样的话,即使采用HDD也能有不错的性能。

2. 数据读写

write

如下图所示,node接收write请求,将数据写入memtable,同时记录到commit log。commit log 记录node接收到的每一次write请求,这样,即使发生断电等故障,也不会丢失数据。

memtable是一个cache,按顺序存储write的数据,当memtable 的内容大小达到配置的阈值或者commit log的存储空间大于阈值,memtable里的数据被flush到磁盘,保存为SSTables。当memtable中的数据flush到磁盘后,commit log被删除。

在内部实现上,memtable 和 SSTable按table进行划分,不同的table可以共享一个commit log。SSTable本质上是磁盘文件,不可更改,因此,一个partition 包含了多个SSTables。

best practice: 重启node前先使用nodetool flush memtable,这样可以减少commit log重放。

cassandra写入流程

compaction

Cassandra不会采用类似insert/update的方式更新已有数据,而是创建带有时间戳版本信息的新的数据,同时,Cassandra也不删除数据,而是将数据标记为tombstones。这样,随着时间过去,每行数据可能包括不同时间戳版本的多个列集合,读取数据时,可能需要读取越来越多的列才能组成完整的一行数据。为了避免这种情况,Cassandra周期性的合并SSTables并删除旧数据,这个过程称作compaction。compaction 读取每行数据所有版本的数据然后用最新的数据组成完整的一行,新数据写入新的SSTable,旧版本数据随后被删除。compaction 提高了Cassandra的read 性能。

另外,在compaction过程中,新旧数据可能同时存在,所以,磁盘使用率上会存在突增;同时,由于数据按照partition key 按序存储,所以,compaction过程中,不使用随机IO。

update

Cassandra 将每个新行视为upsert,如果已经存在该primary key,则视作是对原有数据的update,

delete

Cassandra 删除数据时使用tombstone,tombstone是一个标记,标记column被删除了,在compaction阶段,标记删除的columns被物理删除。在读取阶段,标记为tombstone的数据被忽略。

read

读取数据时,Cassandra可能需要联合memtable和多个SSTables才能拼装出完整的数据。

3. 数据一致性

根据 CAP 理论,Cassandra 是一个AP系统,提供最终一致性。同时,Cassandra可以灵活配置,使系统更趋向一个CP系统。

3.1 Two consistency features

3.1.1 Tunable consistency

高一致性意味着高延迟,低一致性意味着低延迟,需要根据自己的需求,自己调节。而且,Cassandra 不仅支持集群级别的一致性设置,还支持请求级别的一致性设置,用户可以针对请求设置一致性。

一致性等级决定了处理读/写请求返回成功的数据副本数,Cassandra赋予用户充分的自主选择权,通常情况下,设置读/写的的一致性等级为"QUORUM",其中,quorum = (sum_of_replication_factors / 2) + 1,sum_of_replication_factors表示所有datacenter中replication factor求和。

3.1.2 Linearizable consistency

存在一些场景,一些操作需要顺序执行且不能被中断,Cassandra通过lightweight transactions 来支持这种场景。

3.2 一致性计算

强一致性: R + W > N

最终一致性:R + W <= N

其中,R代表read操作的一致性,W表示write操作的一致性,N表示副本数。

总结

本文介绍了Cassandra的内部实现,下一篇开始介绍CQL。

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

推荐阅读更多精彩内容

  • 1基本安装1.1在基于RHEL的系统中安装Cassandra1.1.1必要条件Ø YUM包管理器Ø Root或...
    战神汤姆阅读 1,038评论 0 4
  • MySQL技术内幕:InnoDB存储引擎(第2版) 姜承尧 第1章 MySQL体系结构和存储引擎 >> 在上述例子...
    沉默剑士阅读 7,388评论 0 16
  • Apache Cassandra 是一个开源的、分布式、去中心化、弹性可扩展、高可用性、容错、一致性可调、面向行的...
    梁睿坤阅读 13,992评论 2 25
  • 【转自】http://alinuxer.sinaapp.com/?p=400 LDB 首先,我们先总结下googl...
    lxqfirst阅读 7,910评论 0 2
  • 常常听朋友说,某某是个闷骚的人,闷骚这次词带有贬义的意思,为什么“闷”和“骚”如此相差千里的字能组合在一起呢? “...
    ___So__阅读 351评论 0 0