再次理解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. 网络不断的分布式系统,我们选择的是一致性或者性能

时间: 2024-08-08 20:13:09

再次理解CAP的相关文章

再次理解WCF以及其通信(附加一個編程小經驗)

一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NET Framework 3.0 开始引入. WCF的最终目标是通过进程或不同的系统.通过本地网络或是通过Internet收发客户和服务之间的消息. WCF合并了Web服务..net Remoting.消息队列和Enterprise Services的功能并集成在Visual Studio中. WCF

(转)java.ByteArrayInputStream与ByteArrayOutputStream再次理解

转载自:java.ByteArrayInputStream与ByteArrayOutputStream再次理解 第一次看到ByteArrayOutputStream的时候是在Nutch的部分源码,后来在涉及IO操作时频频发现这两个类的踪迹,觉得确实是很好用,所以把它们的用法总结一下. ByteArrayOutputStream的用法 以下是JDK中的记载: public class ByteArrayOutputStream  extends OutputStream 此类实现了一个输出流,其中

再次理解HTTP请求过程

我曾多次阅读http协议,但是理解依然不深,在此,再次阅读,再次理解.加深两点:解析头部信息\r\n,分解头部和主体用\r\n\r\n.之所以一次请求会看到网络里有很多请求,是因为浏览器代替访问了多次!程序只管处理一次即可! HTTP请求 步骤1:浏览器首先向服务器发送HTTP请求,请求包括: 方法:GET还是POST,GET仅请求资源,POST会附带用户数据: 路径:/html/path: 域名:由Host头指定:Host: www.sina.com.cn 以及其他相关的Header: 如果是

ON_MESSAGE和ON_NOTITY再次理解

ON_NOTIFY是控件向其父窗口发送消息处理的宏,ON_COMMAND是菜单和工具栏项处理消息的宏,ON_MESSAGE是处理自定义消息的宏 对这几个消息的理解要先了解一下Window消息的背景. 在Windows3.1里,控件会将mouse, keybord等等的消息通知它的父窗口, 使用的消息就只有WM_COMMAND, 事件种类和控件ID被包含在wParam中, 控件的句柄包含在lParam中.由于wParam和 lParam已经满了,当控件要向父窗口发送其它特殊消息同时附带很多信息的时

二分算法 再次理解

二分算法 再次理解 详解二分查找算法 这篇博客很详细介绍了二分算法的一些细节问题 寻找一个数,也是最基本的二分搜索 //代码示例如下 int bsearch(int []nums, int target) { int left=0, right=nums.length-1;//这里的数组长度用法可以是其他的形式 while(left<=right) { int mid = left + (right - left) / 2; if(num[mid] == target) return mid;

正确理解CAP定理

简介 定义 原文:In a distributed system (a collection of interconnected nodes that share data.), you can only have two out of the following three guarantees across a write/read pair: Consistency, Availability, and Partition Tolerance - one of them must be s

C++再次理解虚表

#include <iostream> using namespace std; class Base { public: virtual void fun1() { cout << "Base::fun1()" << endl; } virtual void fun2() { cout << "Base::fun2()" << endl; } }; class Son : public Base { pu

再次理解javascript的apply

普通函数执行的时候,this指向函数执行的上下文 其实就是一个原型链的结构... 我一直没有搞懂原型链莫非它们像链条一样连在一起? 昂... 原型链可以理解成继承吗? 就像,java里边的继承吧嗯嗯刚想说这个 写js的时候一般没用到这里,还有apply()和call()一直搞不清太灵活了,不知道是什么,想要干啥 ES6新的语法来讲,你可能会看着比较熟悉了 call 和 apply就是绑定一个函数执行的 this指向 觉apply()和代码上下文有很大关系 这意思是修改父类吗? 不是.. 那我又不

再次理解js中的call函数

a.call(b); 网上说明的版本比较多.有的说,是指针替换.有说,将a对象的方法加在b对象执行.官方说:什么对象替换什么对象.反正看了几个版本,尽管有具体的实例,看了我三次都没看懂它的具体含义.看过还是云里雾里的.后来发现,结合实验去理解非常好. 其实,换成自己能够接受的方式理解为好.a对象的方法应用到b对象上(函数apply的意思正好说明符合这样理解:a对象应用到b对象上去) a对象既然添加到b对象上了.那么b对象自然就拥有了a对象所有的内容.所有,b对象就继承了a对象了.结合自己编写的下