Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4447132
  • 博文数量: 1214
  • 博客积分: 13195
  • 博客等级: 上将
  • 技术积分: 9105
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
个人简介

C++,python,热爱算法和机器学习

文章分类

全部博文(1214)

文章存档

2021年(13)

2020年(49)

2019年(14)

2018年(27)

2017年(69)

2016年(100)

2015年(106)

2014年(240)

2013年(5)

2012年(193)

2011年(155)

2010年(93)

2009年(62)

2008年(51)

2007年(37)

分类: 大数据

2014-05-28 14:28:49

文章来源:http://blog.csdn.net/qinzhihu/article/details/8807776

先说写,再说读,最后说 数据一致性(data consistency)。

cassandra对于 数据写入,那是相当给方便的,比对 首长儿子还亲呢, 写的相当快,相当高效。
相比来说,关系型数据库,对于数据 写入,那就不那么方便了。不方便的原因呢,是因为 关系型 数据库 为了保持数据冗余最少,它的表都是结构化的。举例来说,一个产品的大小,形状,价格,打折信息,分散在好多表里面,你要想查询一个产品的完整信息,得去好多表里 拽数据。同样因为如此,如果你要修改产品的信息,所有相关表,你都得通知到。这就跟你去政府部门办事,要横跨多个部门,这事能快得了吗?
那么cassandra为什么能快呢。因为它采取了这么一个解决方案:
数据首先写到 commit log, 然后写到memtable。

干完了这两件事,写就算成功了,别的事情您就不用操心了。

因为它使用这个办法,在写的时候,只有很少量的 disk I/O,所以就非常快。
您这放松下来了,但是cassandra后台还得忙活一阵子,主要忙活啥呢?
把放到memtable里的数据,写到硬盘上去,具体的说,是写到SSTable里面。这个事情,cassandra在后台悄悄地干,打枪的没有。

干完了这些事之后,后台还有个事情要做,就是compaction,负责把sstable压缩一下,减少点空间,这个在前面已经说过了。

在关系型数据库里,有个概念叫ACID。在cassandra里,不再严格的遵循ACID,但是它也有自己的事务机制。

我们逐个解释一下:

Atomicity in Cassandra
关于原子性,cassandra是放在row level的,什么意思呢?就是说针对一个给定的row key, 插入或者更新 columns,被视为一次写操作。
这里说的是一个row,不是多个。
如果你同时操作多个row,cassandra并不负责一起提交或者一起回滚。所以你是有可能操作成功一部分row,失败一部分row的,并非同进同退。

同时,大家都知道,cassandra有很多副本(replica),它也不保证这些副本一起成功或者一起失败。
你是完全有可能一个节点成功,另一个节点失败的。

那么一部分成功了,一部分失败了,到底算谁的呢?谁才是 对呢?
cassandra是用timestamp来处理这个问题的。针对一个column的最近的操作(most recent update)胜出。谁的时间越晚,谁就是最终被采用的。

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个营的残兵,必须全部接收到,才可以离开。

阅读(1141) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~