再次理解CAP

此文图和结构基本剽窃自infoq的一篇文章,还有wikipedia。文字倒是基本是自己的思路

从单机RDMS到分布式数据库

从前...大家都在使用单机,单节点的数据库。例如:sql server, mysql , oracle...

我们如果想要提升整体性能,我们必须纵向提高单节点的能力。这虽然简单,但是很贵,而且很容易就会抵达上限。

后来...大家想出了各种办法:主从复制, 分表,分库,sharding


一种选择(可用还是一致?)


原本数据库都是单节点,不存在一致性的问题。当进入分布式的世界后,就会面临选择。

例如以上图的mysql的主从复制为例,当master节点写入后,直接返回成功,还是向slave节点复制完成后才算成功?

前者保证了可用性,但是损失了强一致性,但是异步复制也能保证最终一致性。

后者保证了一致性,但是很明显损失了些性能。


CAP理论

分布式系统中的CAP理论如火如荼,每个人都在说。是否真的理解呢?

让我们重新梳理一下。

关键的定义不能少:

  • C --- Consistency  一致性
  • A --- Availability 可用性
  • P --- Partition Tolerance 分区容忍性


这个定理起源于柏克莱加州大学(University of California, Berkeley)的计算机科学家埃里克·布鲁尔在2000年的分布式计算原则研讨会(Symposium on Principles of Distributed Computing(PODC))上提出的一个猜想。[5] 在2002年,麻省理工学院(MIT)的赛斯·吉尔伯特和南希·林奇发表了布鲁尔猜想的证明,使之成为一个定理。

根据定理,分布式系统只能满足三项中的两项而不可能满足全部三项[4]。理解CAP理论的最简单方式是想象两个节点分处分区两侧。允许至少一个节点更新状态会导致数据不一致,即丧失了C性质。如果为了保证数据一致性,将分区一侧的节点设置为不可用,那么又丧失了A性质。除非两个节点可以互相通信,才能既保证C又保证A,这又会导致丧失P性质。

CAP理论的澄清


在提出他的CAP理论的10年之后,Brewer博士发表了一份声明,澄清他最初的“三选二”的观点被极大地简化,是为了引起讨论,并有助于超越ACID。不过,这种极大的简化,引发了无数的曲解和误会。按照他的说法,CAP三个维度,不应该是0,1的取值,而应该是范围。

我们先来分析一下:AP,CP好理解。可是AC 是什么意思? 那意味着就无法分区,那就意味着不是分布式系统。这显然不是我们讨论的范围了。

那么既然是分布式系统,那就意味着要么是AP 要么是CP。

当网络情况好,分区不存在的情况下: 实际并不是在可用性和 一致性之间选择,而是在一致性和性能之间选择

当网络情况不好,存在分区的情况下,将会在AP 或 CP之间选择一个。 

举例来说: 当出现节点间网络中断的情况,

如果选择一致性,意味着在网络恢复 数据在节点间同步完之前是不可用的。CP

如果选择可用性,意味着我们放弃了各个节点直接的同步,我们选择了AP

在现实的世界里,没有人会放弃可用性,实际的解决方案是AP 然后在网络恢复后得到最终一致性


几种NO-SQL方案的选择


可以看出:

MongoDB,HBase,Redis选择的是强一致性,带来的肯定是整体的性能会打折扣

而Cassandra,DynamoDB选择的可用性+最终一致性。理论上说应该比前面的几种性能会好一些

关于Cassandra,MongoDB,HBase 后续将会在其他博文中逐一具体分析。

总结CAP

根据前面的描述,我们可以看出:
1. CAP 三者确实只能选2
2. 分布式系统中我们只能选择CP 或者 AP
3. 网络不断的分布式系统,我们选择的是一致性或者性能


本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。

Java设计模式——享元模式 - 2016-04-26 17:04:02

概述 在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。 版权说明 著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。 本文作者: Coding-Naga 发表日期: 2016年4月25日 本文链接: http://blog.csdn.net/lemon_tree12138/article/details/51241598 来源:CSDN 更多内容: 分类 设计模式 目录 概述 版权说明 目录 享元模式
什么是类? 将某类东西归纳在一起,可以成为一个类。 类有很多种提炼角度,需要根据系统地目标、业务的场景,选取合适的角度对事物进行归纳。 什么是类图? 类图可能是UML中使用的最多的一种图。 和其他图一样,类图的基本语法并不复杂,可能一两天就能掌握,但是真正做到灵活的使用类图,可能需呀多年的功力。 类图是锻炼OOA(OO Analysis)和OOD(OO Design)思想的重要工具,有助于OOA、OOD思想的提升。 本篇博文,重点讲述类图中类与类之间的关系以及这种关系在代码中的实现形式。写作本文的原因是:
这是一个使用springMVC+spring+mybatis+bootstrap table做的分页流程,网上之前搜到的类似的教程实在太少了,所以就想着写一个大体的过程(没写的很详细),能帮助到一些人是最好的. 先来一张完成图,可以搜索和按照制定列排序,这些都是操作都是从通过sql搜索出来的. 1.bootstrap table前端设计 对于这种插件,官方例子一般都很详细,遇到不懂得应该去官网查例子,或者翻墙查,反正对百度搜索出来的垃圾不忍直视… 对于表格要注意以下几个问题: 1. 取出来的结果怎么提交给

VIM编辑器常用命令 - 2016-04-26 17:04:47

常用命令 1、vi的基本概念基本上vi可以分为三种状态,分别是命令模式(command mode)插入模式(Insert mode)底行模式(last line mode)1) 命令行模式command mode)控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。2) 插入模式(Insert mode)只有在Insert mode下,才可以做文字输入,按[ESC]键可回到命令行模式。3) 底行模式(last line mode)将文

activiti 多实例任务 - 2016-04-26 17:04:44

1.1.1.  前言 分享牛原创 ( 尊重原创 转载对的时候第一行请注明,转载出处来自分享牛 http://blog.csdn.net/qq_30739519) 我们在使用 activiti 工作流引擎的时候,最常用的肯定是任务节点,因为在 OA 系统、审批系统、办公自动化系统中核心的处理就是流程的运转,在流程运转的时候,可能我们有这样的一个需求,在一个任务节点的时候,我们需要多个人对这个节点进行审批,比如实际中这样一个例子,假如是一个部门的投票,这个部门有 5 个人,那么当 5 个人都投票的时候大概分为

# Linux学习日志(二) 用户 - 2016-04-26 17:04:37

文件管理 文件管理类命令 ls, 查看:cat,more,less,tail,head,tac 复制:cp 移动:mv 删除:rm 创建:touch 元数据属性:stat 查看内容类型:file 文本编辑器:nano,vi Linux的文件类型 普通文件:-,f 目录文件:路径映射d 链接文件(符号链接):软连接l 设备文件: 字符设备:c,一次存取一个字符 块设备:b 命名管道:p fi,fo 套接字文件:s Linux的时间戳 访问时间:最近一次访问的时间 修改时间:写数据 改变时间:元数据改变的时间

Linux 系统裁剪笔记 软盘2 - 2016-04-26 17:04:37

第一步:裁减内核 打开终端,输入:cd /usr/src/linux2.4,然后输入make xconfig.现在编译内核正式开始了 1.1 “code maturity level options”选项,代表代码的成熟等级,因为这是一个试验的部分,我们不需要,所以关闭它。 1.2 “Loadable module support”可加载模块支持 可加载模块是指内核代码(kernel code)的一些片断,比如驱动程序,当编译内核的时候它们也被单独编译。因此,这些代码不是内核的一部分,但是当需要它的时候,

(4)Linux常用命令学习 - 2016-04-26 17:04:37

Linux常用命令 一、命令基本格式 命令 [选项]  [参数] 注意:个别命令使用不遵循此格式,当有多个选项时,可以写在一起。简化选项与完整选项            -a 等于 --all [root@localhost ~]# 其中: root:             当前登录用户 localhost:             主机名                 ~                          当前所在目录(家目录)                 #          

【Chromium中文文档】线程 - 2016-04-26 17:04:16

线程 转载请注明出处: https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Threading.html 全书地址 Chromium中文文档 for https://www.chromium.org/developers/design-documents 持续更新ing,欢迎star gitbook地址: https://ahangchen.gitbooks.io/chromium_doc_zh/co
1.什么是Spring? 我们都知道框架,我学的就是struts2,mybatis和spring 三大框架 struts2处于表现层和业务处理 mybatis处理业务处理和数据访问 而Spring是无处不在的。 以上是我对Spring的理解 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由 Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业