先说写,再说读,最后说 数据一致性(data consistency)。node
cassandra对于 数据写入,那是至关给方便的,比对 首长儿子还亲呢, 写的至关快,至关高效。
相比来讲,关系型数据库,对于数据 写入,那就不那么方便了。不方便的缘由呢,是由于 关系型 数据库 为了保持数据冗余最少,它的表都是结构化的。举例来讲,一个产品的大小,形状,价格,打折信息,分散在好多表里面,你要想查询一个产品的完整信息,得去好多表里 拽数据。一样由于如此,若是你要修改产品的信息,全部相关表,你都得通知到。这就跟你去政府部门办事,要横跨多个部门,这事能快得了吗?
那么cassandra为何能快呢。由于它采起了这么一个解决方案:
数据首先写到 commit log, 而后写到memtable。数据库
干完了这两件事,写就算成功了,别的事情您就不用操心了。app
由于它使用这个办法,在写的时候,只有不多量的 disk I/O,因此就很是快。
您这放松下来了,可是cassandra后台还得忙活一阵子,主要忙活啥呢?
把放到memtable里的数据,写到硬盘上去,具体的说,是写到SSTable里面。这个事情,cassandra在后台悄悄地干,打枪的没有。rest
干完了这些事以后,后台还有个事情要作,就是compaction,负责把sstable压缩一下,减小点空间,这个在前面已经说过了。orm
在关系型数据库里,有个概念叫ACID。在cassandra里,再也不严格的遵循ACID,可是它也有本身的事务机制。server
咱们逐个解释一下:事务
Atomicity in Cassandra
关于原子性,cassandra是放在row level的,什么意思呢?就是说针对一个给定的row key, 插入或者更新 columns,被视为一次写操做。
这里说的是一个row,不是多个。
若是你同时操做多个row,cassandra并不负责一块儿提交或者一块儿回滚。因此你是有可能操做成功一部分row,失败一部分row的,并不是同进同退。内存
同时,你们都知道,cassandra有不少副本(replica),它也不保证这些副本一块儿成功或者一块儿失败。
你是彻底有可能一个节点成功,另外一个节点失败的。ci
那么一部分红功了,一部分失败了,到底算谁的呢?谁才是 对呢?
cassandra是用timestamp来处理这个问题的。针对一个column的最近的操做(most recent update)胜出。谁的时间越晚,谁就是最终被采用的。rem
Tunable Consistency in Cassandra
你若是以为上面说的方式不爽,好比说,你就坚信应该 不抛弃,不放弃,必须得同进同退,要么同时成功,要么同时失败。
那么cassandra也可让你这么作。
你能够经过配置cassandra,达到 强一致性,这是能够的。
Isolation in Cassandra
关于隔离性,在1.1以后,使用了 full row-levelisolation, row级别的隔离,这样作的好处是:
so that writes to a row are isolated to the client performing the write and arenot
visible to any other user until they are complete.
当你在写更新一个row的时候,使之与客户端隔离,在更新操做完成以前,不向其余用户开放。
也就是说,我这个正在写呢,别人不能读,得等我写好了,再读。
从ACID的角度呢,这个算是AID。
Durability in Cassandra
关于持久性,是这么说的
All writes to a replica node are recorded both in memory and in a commit logbefore
they are acknowledged as a success. If a crash or server failure occurs beforethe memory tables are flushed to disk,
the commit log is replayed on restart to recover any lost writes。
放在memory table的数据,最终会被刷到磁盘上,若是在刷以前,发生了宕机或者其余错误,可使用commit log来恢复。
关于insert and update
cassandra 修改一个列族里面的列的时候,首先得定位 它是哪个row的。
因此row key很重要,它必须是惟一的。这个看起来,和primarykey有点像。
可是cassandra里面,若是你插入一个同名的row key,并不报错,它会认为是你是要更新原来的row key的记录。
关于删除。
删除一个column,在cassandra里面,跟原来关系型数据库的概念不大同样,主要有2个:
1.Deleted data is not immediately removed from disk
2.A deleted column can reappear if routine node repair is not run.
首先是被删掉的数据,不会被立刻从硬盘里删掉。你们知道,数据在cassandra里面,是放在SSTable里面的。SSTable一旦写入了,就是不可更改的。要删除一个列,实际上会有一个 墓碑(tombstone)被写进来,来证实这个列的状态。
有了墓碑,就是等同于判了死刑,可是不会马上执行,要到秋后处斩。
‘秋后’这个时间点,是你预先配置好的。(gc_grace_seconds)
其次是,若是分布在环里的某一个节点死了,并且死的时间特别长,长过秋后(gc_grace_seconds ),那么这个节点就错过了删除列 这个事情,因此当它活过来以后,可能 被删除的数据又从新出现了。
解决这个问题的办法就是作regular node repair on every node。
常常清理,不要积压问题,就不会形成这个困扰了。
关于读
当一个请求过来,要读取一个row的时候,这个row所须要的信息,可能要从许多SSTable和memtable来取。
从memtable来取,问题不大,由于在内存里,速度没问题。
从SSTable呢,就要斟酌一下,由于 它是存在磁盘上的。
好在cassandra有一个 Bloom filter, 这个东东就是专门用来判断某个数据是否存在一个sstable的,若是不在,就不用浪费时间了。
因此读也是挺快的。
关于数据一致性。
In Cassandra, consistency refers to how up-to-date and synchronized a row ofdata is on all of its replicas。
一致性说的是,你如何更新 分布在全部副本里的一个row。
关于 write一致性:
这个咱们能够举个例子,假若有一个师,下辖 3个团,一个独立营,共10个营。
你的做战命令修改了,须要通知下去。
伙计们,要知道,战场形势瞬息万变,耽误一分钟,就要死很多人。
理想的状况是,10个营所有获得通知之后,做战命令才能执行,这会须要好久的时间,可是时间紧迫,要看你如何取舍了。
When you do a write in Cassandra, the consistency level specifies on how manyreplicas the write must succeed before
returning an acknowledgement to the client application.
The following consistency levels are available, with ANYbeing the lowest consistency (but highest availability), and ALL
being the highest consistency (but lowest availability). QUORUM is a goodmiddle-ground ensuring strong consistency,
yet still tolerating some level of failure.
cassandra提供了三个选择:
1. any 只要一个节点被写入了,就能够认为是成功。
2. all ,必需要所有节点,都通知到了,才能算是成功
3. quorum, 通知达到法定节点后就算成功。
对应于刚才的例子,
第一个选择是,只要做战命令 达到一个营,就能够执行,这种命令通常是什么命令呢? 撤退! 跑掉一个算一个。
第二个选择是,命令必须到达所有营,才能够执行,这种命令是什么呢? 多路围攻,只要协同做战,才能成功。
第三个选择是,命令到达6个营便可,这种命令是什么样子的呢? 追击敌人,只要有6个营收到命令,就能够马上追击,以避免敌人跑掉。
为何是6个呢?
A quorum is calculated as (rounded down to a whole number):
(replication_factor / 2) + 1
10/2+1 = 6
关于read一致性。
read和write基本是同样的。
When you do a read in Cassandra, the consistency level specifies how manyreplicas must respond before a result is
returned to the client application.
The following consistency levels are available, with ONE being the lowestconsistency (but highest availability), and ALL
being the highest consistency (but lowest availability). QUORUM is a goodmiddle-ground ensuring strong consistency,
yet still tolerating some level of failure.
也是分为三个级别,
1. one
2. quorum
3. all
意思也基本差很少。只是方向反了,此次是读了。 对应上面的例子,能够是这样。 你这个师,由于指挥不当,被完全打残废了。 上面派人来收拢残兵。 1. one说的是,只要接收到1个营的残兵,就能够 离开。 2. quorum说的是,必需要接收到6个营的残兵,才能够走。 3. ALL说的是,全部10个营的残兵,必须所有接收到,才能够离开。