随着微服务和分布式系统的广泛运用,CAP 定理被大家熟悉起来,也成为了分布式系统的三大指标。这篇文章我们就来聊一聊 CAP 定理。

CAP 定理

1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标:

  • Consistency.
  • Availability.
  • Partition Tolerance.

Eric Brewer 说,这三个指标不可能同时做到。然后就取首字母,组成了 CAP 定理。

一起来看看这三个指标分别代表什么?

Consistency(一致性):指读写数据的一致性,特指分布式系统中数据的一致性。如何理解这句话?

假设我们现在有G1、G2 两个实例,现在的值都是 v0,有一个客户端向 G1 发起更新请求,将 v0 更新为 v1,如下图所示:

在不做任何处理的情况下,G1实例对应的值为 v1,G2对应的值为v0。如果此时客户端发起读请求,读 G1 实例上的数据是 v1,读 G2 实例上的值是 v0,这就出现了数据不一致,这就不满足数据一致性。如何保证数据一致性?需要在 G1 写操作的时候,让 G1 向 G2 发送一条消息,要求 G2 也改成 v1。

这样的话,两个实例的值都是 v1,不管客户端读取哪个服务器获取的数据都一样,这就是数据一致性。用大白话来讲就是多实例之间任何时刻数据都要相同。

Availability(可用性):指服务的高可用,特指分布式系统中服务的高可用,这个就比较好理解,就是我给你发一个请求,你必须给我一个正确的响应。

Partition Tolerance(分区容错性):指在分布式系统遇到网络分区的情况下,仍然可以响应用户的请求。怎么理解呢?

在我们的分布式系统中,节点组成的网络本来应该是连通的。然而可能因为某些故障,使得有些节点之间不连通了,整个网络就分成了几块区域,而数据就散布在了这些不连通的区域中,这就叫分区。容错的意思就是分区了也需要能够正常访问,大白话就是不要出现单点故障。在分布式系统中,网络抖动、故障是不可避免的所以 CAP 中,P 是必须实现的,只能在 CA 上做取舍

接下来我们就来看看 CAP 的选择策略及在开源中间件的运用,加深对 CAP 的理解。

保 CP 弃 A

对数据一致要求比较的场景,可以牺牲一定的可用性,来保证数据的一致性,也就是强一致性。比如金融行业,因为它任何时候都不允许出现数据不一致的情况,否则就会给用户造成损失。因此,这种场景下必须保证 CP。

在我们的开源中间件中,ZooKeeper 就是采用保 CP 弃 A 策略,一起来看看。

在 ZooKeeper 集群中,Leader 节点之外的节点被称为 Follower 节点,Leader 节点会专门负责处理用户的写请求

  • 当用户向节点发送写请求时,如果请求的节点刚好是 Leader,那就直接处理该请求;
  • 如果请求的是 Follower 节点,那该节点会将请求转给 Leader,然后 Leader 会先向所有的 Follower 发出一个 Proposal,等超过一半的节点同意后,Leader 才会提交这次写操作,从而保证了数据的强一致性。

具体示意图如下所示:

当出现网络分区时,如果其中一个分区的节点数大于集群总节点数的一半,那么这个分区可以再选出一个 Leader,仍然对用户提供服务,但在选出 Leader 之前,不能正常为用户提供服务

如果形成的分区中,没有一个分区的节点数大于集群总节点数的一半,那么系统不能正常为用户提供服务,必须待网络恢复后,才能正常提供服务

这种设计就是保证了数据的一致性,但是牺牲了一定的可用性,比如当 Leader 宕机的时候。

保 AP 弃 C

保 AP 弃 C 的策略是比较常见的策略,我们为了追求系统的高可用性,在出现网络抖动的情况下,允许数据暂时不一致,牺牲一定的数据一致性。

网络分区出现后,各个节点之间数据无法马上同步,为了保证高可用,分布式系统需要即刻响应用户的请求。但是此时可能某些节点还没有拿到最新数据,只能将本地旧的数据返回给用户,从而导致数据不一致的情况。

比如我们的 eureka 注册中心就是采用这种策略,在 eureka 集群中,当某个实例宕机了,并不会导致整个 eureka 注册中心不可用,活跃的 eureka 服务器仍然可以响应外部请求。当宕机的服务器重新启动后,在第一次数据同步之前,eureka 实例之间的数据是不一致的,但是经过一次数据同步之后,实例之间的数据就一致了,这就是通过牺牲数据的一致性,来保证系统的高可用。

以上就是 CAP 定理,希望对你的学习或者工作有所帮助。最后留一道思考题:

你们公司的分布式架构是怎么设计的?

戴上 CAP 这顶帽子,我要和面试官扯皮了相关推荐

  1. 戴上 CAP 这顶帽子,又能和面试官扯皮了

    随着微服务和分布式系统的广泛运用,CAP 定理被大家熟悉起来,也成为了分布式系统的三大指标.这篇文章我们就来聊一聊 CAP 定理. CAP 定理 1998年,加州大学的计算机科学家 Eric Brew ...

  2. 戴好这六顶帽子的项目经理,无论项目团队还是个人成长都受益终生

    六顶思考帽是一个操作简单.经过反复验证的思维工具,让每一场会议.每一次讨论.每一份报告.每一个决策都充满新意和生命力.这六顶帽子分别是: 这个工具能够帮助PM: 提出建设性的观点: 聆听别人的观点: ...

  3. 思考问题的“六顶帽子”

    思考问题的"六顶帽子"(Six Thingking Hats)由爱德华·德·博诺(Edward de Bono)博士首次提出,他是世界上公认的创造性思维领域的权威,由他设计的思考方 ...

  4. 面向对象编程的两顶帽子

    从传统的面向过程的模式,到学习掌握面向对象编程的过程中,总是有些思想观念难于转变,面向对象,更多的是思维的方式,而不是使用方法.越是深入的学习,越感到面向对象技术的博大精深,最近有一些心得总结一下. ...

  5. 字节面试官推荐的一份 Java 基础面试题!太顶了

    Java 基础篇 Java 有哪些特点 并发性的: 你可以在其中执行许多语句,而不必一次执行它 面向对象的:基于类和面向对象的编程语言. 独立性的: 支持一次编写,到处运行的独立编程语言,即编译后的代 ...

  6. 面试官:同事欠你500,你怎么要回来?硕士答不上,学渣智答录用

    在日常生活中,难免会遇到同事借钱的情况,这时,如何把借出去的钱要回来,是一件既考验情商,又考验能力的技术活. 在面试中,遇到一些不按照套路出牌的面试官,便会考验直击人心的面试题,考验你的情商和应变能力 ...

  7. 两顶白帽子和一顶红帽子_自我发展:我如何不戴两顶帽子并找到第三顶帽子

    两顶白帽子和一顶红帽子 Hi all! I lead antispam team and several machine learning teams at Mail.ru Group. The su ...

  8. 741-一群人开舞会,每人头上都戴着一顶帽子...

    题目如下 一群人开舞会,每人头上都戴着一顶帽子.帽子只有黑白两种,黑的至少有一顶.每个人都能看到其它人帽子的颜色,却看不到自己的.主持人先让大家看看别人头上戴的是什幺帽子,然后关灯,如果有人认为自己戴 ...

  9. 为什么西游记中要给孙悟空戴上紧箍儿?

    西游记中为什么要给孙悟空戴上紧箍儿? 我们知道西游记中孙悟空被如来佛祖一巴掌压到五行山下约五百年后,如来佛祖开了个盂兰盆会,决定将三藏真经传往东土大唐,观世音菩萨自愿请缨,在途中点化孙悟空拜唐僧为师, ...

最新文章

  1. MySQL导出到excle显示不了_mysql导出select语句结果到excel文件遇到问题及解决方法_MySQL...
  2. 【Android UI】图片 + 文字展示by SpannableStringBuilder
  3. java开源写字板_简单的写字板 - 努力喵的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. nginx启动初始化过程(二)
  5. python网课观后感_Python OpenOPC的学习观后感
  6. html5怎么改为vue_【面试需要Vue全家桶】一文带你看透Vue前端路由
  7. ubuntu Mysql乱码解决
  8. Jquery$和$$的区别
  9. java怎么使异常不起作用_java – @Test(expected = Exception.class)对我不起作用,我错过了什么?...
  10. php栏目树,php生成无限栏目树
  11. Android audio切换设备通道流程(二十八)
  12. 安装QTP10.0 报需要先安装 c++组件
  13. bzoj:2331: [SCOI2011]地板
  14. 常见的oracle面试题及答案,Oracle精选面试题(附答案及分析)
  15. 聚观早报 | 华为官宣新机Pocket S;苹果旗舰店开售智能门锁
  16. 微信html5怎么制作,图文揭秘微信h5怎么制作-朋友圈微信H5页面制作方法
  17. 苹果手机向windows电脑传照片和视频 无法链接设备或连接到系统上的设备没有发挥作用解决方法
  18. 汇编语言期末复习不挂科——知识点总结
  19. 大学计算机课程学习路线(左飞老师)
  20. UneXt 基于MLP的快速医学图像分割网络

热门文章

  1. python中如何统计文本中的单词个数_python统计文本文件内单词数量的方法
  2. Composer 提示 but these conflict with your requirements or minimum-stability
  3. redis listening socket 127.0.0.1:6379: bind: No error 解决办法
  4. 分享116个ASP电子商务源码,总有一款适合您
  5. 计算机音乐的制作流程,RME Babyface Pro 为音乐制作人/DJ Supa Dups 简化了制作流程...
  6. forth day--装饰器、迭代器、生成器
  7. CF1311C. Perform the Combo题解
  8. k近邻算法(k-Nearest Neighbors,kNN)
  9. android应用的自启动 和 相互关联启动
  10. 《新概念英语》的学习方法