什么是CAP定理

转载自 什么是CAP定理

计算机界有很多高大上又难于理解的术语,CAP就是其中之一, 什么一致性(Consistency), 可用性(Availability), 分区容错性(Partition tolerance) 就很难理解了,  再加上CAP定理更是让人云里雾里,  今天咱们试图通俗的演绎一下。

张大胖在公司奋发图强,经过多年的努力,终于做到了架构师的位置。


架构师的椅子还没坐热,很快就来了一个项目要做架构设计。


老板把大胖叫来,谆谆教导说: 大胖啊, 数据是我们的宝贵资产,你设计的系统可千万要保证数据不能丢失啊!


大胖说老板放心, 这方面我有经验, 一般来讲我们要做数据的冗余处理, 简单的来讲就是给数据做多个副本来保存。 我会设计一个分布式系统, 把数据备份到多个机器节点去。


几天后, 大胖给发了一张图, 展示了这个分布式系统是怎么工作的:


数据副本在不同的机器上做冗余, 中间有数据的复制, 保证数据的同步。


虽然只是两台机器, 但是也构成了一个简单的分布式环境。


老板虽然不懂技术, 但是看到数据在不同的机器之间有备份,也就放心了。


经过几个月的开发和测试,系统顺利上线, 但是大家很快就发现:  分布式系统不像单机系统那么简单, 由于网络的原因, 或者某个机器的原因很容易导致通讯失败,或者节点不可用。


有一天, 用户先访问了左边的机器A , 写入了一条数据,  然后机器A很不幸, 网线被悲催的网管给踢掉了, 这直接导致了两个严重的后果:


1. 负载均衡找不着机器A,认为它死翘翘了, 就要把用户的下一次访问转到机器B去。


2. 数据复制也找不着机器A  ,  只好罢工。 用户刚写入的数据没法复制到机器B,机器B上还是老数据


怎么办?   虽然这是一次偶然, 把网管臭骂一顿, 插上网线就可以了, 但是谁能保证以后两个机器的通信是一致畅通的呢?


组里的小王说:    我们的机器B 还活着呢, 还能提供服务, 数据复制不到机器B, 不就是少看几条数据嘛, 无伤大雅,不影响大局, 勉强可用, 插上网线后数据复制就会工作, 一切就会恢复正常。


小王无意中选择了系统的可用性(Availability,简称A), 系统能提供服务就好, 数据不一致可以忍受。


张大胖说:  不行,  老板说了,我们系统的数据极为重要, 数据如果不一致会带来严重后果,所以机器B上的和这些关键数据相关的功能也必须停掉, 必须等到机器A插上网线,数据同步以后才能开工


很明显, 张大胖遵循老板指示, 把一致性(Consistency, 简称C )放到了首位。


所以问题就很明显了, 在网络节点之间无法通信的情况下,  和数据复制相关的功能, 要么选择可用性(A) , 要么选择一致性(C), 不能同时选择两者。


大胖仔细思考了一下, 其实这两种选择的背后其实隐藏着另外一个事实, 那就是网络节点之间无法通信的情况下, 节点被隔离,产生了网络分区,  整个系统仍然是可以工作的, 大胖给它起了个名: 分区容错性(Partition tolerance, 简称P)


如果选择了可用性(A) + 分区容错性(P) ,  就要放弃一致性(C)。


如果选在一致性(C) + 分区容错性(P) , 就得放弃可用性(A)  ,   对了, 这种情况下,虽然系统的有些功能是不能使用的, 因为需要等待数据的同步, 但是那些和数据同步无关的功能还是可以访问的 , 相当于系统做了功能的降级。


既然有AP和CP,    会不会出现仅仅是CA(一致性+可用性)这种组合呢? 就是没有分区容错性, 只保留可用性和一致性? 仔细想想, 这种情况其实就退化成了单机应用, 没有意义了。


大胖觉得自己似乎发现了一个规律:   在一个分布式计算机系统中,一致性(C),可用性(A)和分区容错性(P) 这三种保证无法同时得到满足,最多满足两个。


他决定把找个规律叫做CAP定理, 听起来比较高大上, 显得自己高深莫测。


如果你实在是搞不懂这CAP,   张大胖会告诉你一个更容易理解的版本: 在一个分布式系统中, 在出现节点之间无法通信(网络分区产生), 你只能选择 可用性 或者 一致性,  没法同时选择他们。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python找不到指定的文件夹里_Python环球网在Unix中的指定文件路径中找不到*.txt

我在Windows环境中写了一些文件,我在转换文件时遇到了麻烦。在Windows中,我通常使用类似以下内容读取目录中的所有.txt文件:pathtotxt "C:\\Text Data\\EJC\\Philosophical Transactions 1665-1678\\*\\*.txt" for file in glob.g…

从开发者角度谈Mysql主键

转载自 从开发者角度谈Mysql主键说在前面零度mysql一直比较薄弱,俗话说的好,不会mysql的程序员不是好程序员,刚刚好认识mysql大牛刘龘刘,刚刚好就有了这些文章,主要是刘龘刘大牛写的,零度稍微修改成文&…

JVM内存结构分析:为什么需要S0和S1?

一、为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,…

rabbitmq-消息追踪rabbitmq_tracing

【README】 消息中心的消息追踪需要使用 Trace 实现,Trace是 rabbitmq用于记录每一次发送的消息;方便开发者调试,排错。可通过插件形式提供可视化界面。 【1】 开启消息追踪 1)消息追踪通过 rabbitmq的插件 trace 来实现&#x…

python大神交流网站_学习Python必去的8个网站

作为一个现时代的程序员初学者,除了看书之外,互联网的学习手段也是断不能少的! 以下这些网站,虽说不上全方位的满足你的需求,但是大部分也都能! 0.国外的大神GitHub : https://github.com/pypa/…

一文理清Http2.0

前言 HTTP2.0主要有三大特性:二进制协议、头部压缩、服务端推送(Server Push)、多路复用。本文从分析http1.x存在的问题入手,逐一介绍http2.0的优势。 Http1.x存在的问题 在HTTP1.0下,HTTP1.1非Keep-Alive模式下&am…

收敛和发散思维如何被用作解决问题的手段

转自: https://www.jdon.com/mda/thinking.html 将发散和收敛的思想结合在一起使用时,可以帮助分析人员得出更好的和更有创造性的解决方案。发散性思维是将一个话题分解并产生许多从原始概念中分支出来的想法的过程,而收敛性思维则是集中于少…

关于python面向对象编程中、下列说法中_关于Python面向对象编程的知识点总结

前言 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程。 接下来我们就来了解关于Python面向对象编程的知…

Java开发必会的反编译知识

转载自 Java开发必会的反编译知识 编程语言在介绍编译和反编译之前,我们先来简单介绍下编程语言(Programming Language)。编程语言(Programming Language)分为低级语言(Low-level Language)和高…

happen-before原则的理解

前言 在程序执行时,为了提高性能,编译器和处理器会对指令进行重排序。 为了明确定义多线程场景下重排序的问题(可见性、有序性、原子性),Java引入了JMM(Java Memory Model),也就是Java内存模型。JMM为JAV…

转:RabbitMQ 消息队列特性知多少

转自: https://www.jianshu.com/p/94d6d5d98c3d 序言 现在我们每天都要与信息打交道,主动或被动的在创造或接收消息。你会收到话费通知短信,使用微信 QQ跟远在万里的朋友交流,也可能使用钉钉跟同事讨论工作,使用抖音…

easyui根据select下拉框内容更新表单内容_Ant Design 4.0 的一些杂事儿 - Select 篇

前几篇:Ant Design 4.0 的一些杂事儿 - Table 篇Ant Design 4.0 的一些杂事儿 - Form 篇聊完了 Table 和 Form 两个重型组件,我们来继续聊聊看起来不那么重的 Select 组件。它在 Ant Design 4.0 中有哪些变化。如果你读过 《Ant Design 4.0 进行时》&…

避免代码冗余,使用接口和泛型重构Java代码

转载自 避免代码冗余,使用接口和泛型重构Java代码在使用动态语言和.NET工作了若干年后,我又回到老本行–Java开发。在Ruby中,清除代码冗余是非常方便的,而在Java中则需要结合接口和泛型实现类似的功能。 原始代码 以下是这个类中的…

一文理类加载相关知识:类加载器、双亲委派、SPI

思维导图 类加载的时机 类加载的流程 类从被加载到内存中开始,直到被从内存中卸载为止,它的整个生命周期包括:验证、准备、解析、初始化、使用和卸载7 个阶段。 其中验证、准备、解析 3 个部分统称为连接(Linking) …

可以搜python编程答案的软件_python实现百万答题自动百度搜索答案

用python搭建百万答题、自动百度搜索答案。 使用平台 windows7 python3.6 MIX2手机 代码原理 手机屏幕内容同步到pc端 对问题截图 对截图文字分析 用浏览器自动搜索文本 使用教程 1、使用Airdroid 将手机屏幕显示在电脑屏幕上。也可使用360手机助手实现。不涉及任何代码。实现效…

intellij idea设置主题、字体样式和背景色

转自&#xff1a; https://blog.csdn.net/fanrenxiang/article/details/80598895 点击这里查看 <intellij idea使用教程汇总篇> 引言&#xff1a;所谓工欲善其事必先利其器&#xff0c;idea就是这样的利器&#xff0c;刚装好的intellij idea主题样式是白的&#xff0c;…

MySQL优化(四):count()

count()不同写法的区别 COUNT(字段名)&#xff1a;返回SELECT语句检索的行中值不为NULL的行数 COUNT(1)&#xff1a;表示的是直接查询符合条件的数据库表的行数&#xff08;会包含值为NULL的行数&#xff09;。其中1指的是表中的第一个字段&#xff0c;如有表 table(id, colu…

图像sobel梯度详细计算过程_数字图像处理(第十章)

点、线、边缘检测背景知识。书中主要介绍了图像的一阶导数与二阶导数&#xff0c;这个之前的文章中有过介绍这里在复习一遍。对于函数 ,对于点 在x方向的一阶偏导为&#xff1a;,二阶偏导为&#xff1a;之后书中总结了一阶导与二阶导对于图像求取边缘的结论&#xff1a;孤立点检…

idea部署maven+javaweb项目到jboss

小编习惯使用eclipse对jboss跑的项目部署,第一次使用idea进行jboss部署项目,遇到很多问题,做此文章以帮助更多人. 图中涂鸦的是项目名,对应上自己的项目名即可 1.导入项目,这一步不多说 2.配置项目: a>点击file-->Project-Stucture-->Project 3.配置Modules 配置…

Java8-本地缓存

转载自 Java8-本地缓存这里我将会给大家演示用ConcurrentHashMap类和lambda表达式实现一个本地缓存。因为Map有一个新的方法可以在key为Null的时候自动计算一个新的value值。非常完美的实现cache。来看下代码&#xff1a;12345678910111213141516publicstatic void main(String…