分布式与一致性协议之CAP(四)

CAP

BASE理论:CAP的"碱",追求可用性

很多人可能喜欢使用事务型的分布式系统或者强一致性的分布式系统,因为方便,不需要考虑太多,就像单机系统一样。但是学了CAP理论后,你肯定知道在分布式系统中,要实现强一致性,必然会影响可用性。比如,在采用两阶段提交协议的集群系统中,要执行提交操作,需要所有节点确认和投票。所以,集群的可用性时每个节点可用性的乘积,比如,假设有一个拥有3个节点的集群,每个节点的可用性为99.9%,那么整个集群的可用性为99.7%,也就是说,每个月约宕机129.6分钟(按30天/月算),这是非常严重的问题。而解决可用性低的关键在于,根据实际场景,尽量采用可用性优先的AP模型。有人可能会觉得,这也太难了,难道没有线程的库或者方案来实现合适的AP模型?是的,的确没有。因为AP是一个动态模型,是基于业务场景特点妥协折中后设计实现的。不过我们可以借助BASE理论达成目的。在我看来,BASE理论是CAP理论中的AP的延申是对互联网大规模分布式系统的实践总结,强调可用性。几乎所有的互联网后台分布式系统都得到了BASE的支持,这个理论很重要,地位也很高。一旦掌握它,就能掌握绝大部分场景的分布式系统的架构技巧,设计出适合业务场景特点的、高可用性的分布式系统。BASE理论的核心就是基本可用(Basically Available)和最终一致性(Eventually Consistent)。也有人会提到软状态(Soft State).在我看来,软状态描述的是在实现服务可用时,系统数据的一种过度状态,也就是说不同节点间的数据副本存在短暂的不一致。那么基本可用以及最终一致性到底是什么呢?我们应该如何在实践中使用BASE理论提升系统的可用性呢?

实现基本可用的4板斧

在我看来,基本可用是指分布式系统在出现不可预知的故障时,允许损失部分功能的可用性,以保障核心功能的可用性。就像弹簧一样,遇到外界的压迫,它不是折断,而是变形伸缩,不断适应外力,实现基本的可用。

具体来说,你可以把基本可用理解为,当系统节点出现大规模故障的时候,比如专线的光纤被挖断、突发流量导致系统过载(出现了突发事件。服务被大量访问),可以通过服务降级,牺牲部分功能的可用性,以保障系统的核心功能可用。

以12306订票系统基本可用的设计为例,该订票系统在春运期间会因为开始售票后先到先得的缘故出现极其海量的请求峰值,如何解决这个问题呢?
我们可以在不同的事件出售不同区域的票,以错开访问请求,削弱请求峰值
比如,在春运期间,深圳出发的火车票在8点开售,北京出发的火车票在9点开售。这就是我们常说的流量削峰。另外,你可能已经发现了,在春运期间,自己提交的购票请求往往会在队列中等待处理,可能在几分钟或十几分钟后,才能被系统处理,然后响应处理结果,这就是我们熟悉的延迟响应。12306订票系统在出现超出系统处理能力的突然流量的情况下,会通过牺牲响应事件的可用性来保障核心功能的运行。通过流量削峰和延迟响应,系统是不是就实现了基本的可用呢?现在它不会再像最初的时候那样常常报404错误了吧?
再比如,你负责一个互联网系统,此时突然出现了网络热点事件,涌进来好多用户,产生了海量的突然流量,导致系统过载,大量图片因为网络超时无法显示。那么这个时候你可以通过哪些方法保障系统的基本可用呢?
相信你马上就想到体验降级,比如用小图片来替代原始图片,通过降低图片的清晰度和大小,来提升系统的处理能力。然后你还能想到过载保护,比如把接收到的请求放在指定的队列中排队处理,如果请求等待时间超时了(假设是100ms),则之解拒绝超时请求;如果队列满了,则清除队列中一定数量的排队请求,以保护系统不过载,实现系统的基本可用。你看,与12306的设计类似,只不过你是通过牺牲部分功能的可用性来保障互联网的核心功能运行的。说了这么多,主要是想强调:基本可用在本质上是一种妥协,即在出现节点故障或系统过载的时候,通过牺牲非核心
功能的可用性来保障核心功能的稳定运行。希望大家在后续的分布式系统的开发中,不仅能掌握流量削峰、延迟响应、体验降级、过载保护这四板斧,更能理解这4板斧背后的妥协中,从而灵活地处理不可预知的突然问题

最终一致性

在我看来,最终一致性是指系统中所有数据副本在经过一段时间的同步后最终达到一种一致的状态。也就是说,在数据一致性上,系统存在一个短暂的延迟。几乎所有的互联网系统采用的都是最终一致性,只有在确实无法使用最终一致性时,才使用强一致性或事务。比如,对于决定系统运行的敏感元数据,我们需要考虑采用强一致性;对于与钱有关的支付系统或金融系统的数据,我们需要考虑采用事务。你可以将强一致行理解为嘴仗一致性的特例,也就是说,你可以把强一致性看作不存在延迟的一致性。在实践中,你也可以这样思考:如果业务的某功能无法忍受一致性的延迟(比如分布式锁对应的数据),则可以考虑强一致性;如果业务功能能容忍短暂的一致性的延迟(比如QQ状态数据),则可以考虑最终一致性。

那么如何实现最终一致性呢?你首先要知道它以什么为准,因为这时实现最终一致性的关键。一般来说,在实际工程实践中有这样两个标准:

  • 1.以最新写入的数据为准,比如,AP模型的KV存储采用的就是这种方式
  • 2.以第一次写入的数据为准,如果你不希望存储的数据被更改,可以以它为准。
    那实现最终一致性的具体方式是什么呢?下面介绍几种常用的方式.
  • 1.读时修复。在读取数据时,检测到数据的不一致并进行修复,比如Cassandra的Read Repair实现,具体来说,在向Cassandra系统查询数据的时候,如果检测到不同节点的数据副本不一致,则系统会自动修复数据
  • 2.写时修复:在写入数据时,检测到数据的不一致并进行修复,比如Cassandra的Hinted Handoff实现,具体来说,在向Cassandra集群的节点之间远程写数据的时候,如果写失败就将数据缓存下来,然后定时重传,以修复数据的不一致性
  • 3.异步修复,这时最常用的方式,定时对账检测副本数据的一致性,若检测到不一致则进行修复

需要注意的是,因为写时修复不需要做数据一致性对比,性能消耗比较低,对系统运行影响也不大,所以推荐在实现最终一致性时优先选择这种方式。而读时修复和异步修复需要做数据一致性对比,性能消耗比较多,所以在开发实际系统时,建议尽量优化一致性对比的算法,以降低性能消耗,避免对系统运行造成影响。

另外,再补充一点,在实现最终一致性的时候,推荐同时实现自定义写一致性级别(比如All、Quorum、One、Any),让用户可以自主选择相应的一致性级别,比如可以通过设置一致性级别为All来实现强一致性。

现在,相比你已经了解了BASE理论的核心内容了吧?不过这只是理论层面的,那么在实践中,我们该如何使用BASE理论呢?

注意

BASE理论是对CAP中一致性和可用性权衡的结果,它来源于对大规模互联网分布式系统实践的总结,是基于CAP定理逐步演化而来的。它的核心思想是,如果非必需,不推荐实现事务或强一致性,鼓励优先考虑可用性和性能,根据业务的场景特点来实现非常弹性的基本可用,以及实现数据的最终一致性。

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

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

相关文章

IT大陆之:指定用户登入docker

这天,S老交给小k一个特殊的任务:以“nav”这个神秘身份,深入“my_dk”国度,探索其中的奥秘。小k心怀激动与忐忑,站在控制台前,深吸一口气,然后缓缓念出那串充满魔力的咒语:“sudo do…

OceanBase 助力同方智慧能源,打造安全可靠、高性能的能源数据架构

本文作者:丁泽斌,同方智慧能源数据库工程师 业务背景 作为同方股份有限公司旗下的领军企业,同方智慧能源集团矢志成为全球领先的综合智慧能源解决方案提供商。凭借中核集团和清华大学的科技实力,专注于向建筑、交通、工业、北方供…

一篇文章 学会Qt 样式表(qss)

QML 中风格和主题的设计可以通过配置文件选择现有几种中的一种,或者直接在控件定义时,指定其属性,如背景颜色或者字体大小。在QWidget框架中,则通过了一种叫做qss样式表的东西来进行描述,跟CSS逻辑上类似。 这个qss抽…

dolphinscheduler使用与测试文档

文章目录 dolphinscheduler使用与测试文档1. 安全中心(Security)1.1 队列管理(Queue manage)1.2 租户管理(Tenant Manage)3 用户管理(User Manage)1.4 告警组管理(Warning group manage)1.5 Workers分组管理(Worker group manage)1.6 令牌管理(Token manage)2. 监…

Word插件开发

VSTO是Visual Studio Tools for Office的简称,它是Microsoft Visual Studio的一个扩展,用于开发基于Microsoft Office平台的应用程序。VSTO提供了一套API和工具,使开发人员能够利用Visual Studio IDE来开发定制的Office解决方案。 在 Visual…

windows重置mysql root密码

在Windows操作系统中重置MySQL的root密码可以通过以下步骤完成。请注意,这些步骤可能因MySQL的版本以及你所使用的Windows版本略有不同。 步骤 1:停止MySQL服务 打开“运行”对话框,可以通过同时按下Windows键 R。输入services.msc并按回车…

JAVA Coding 规范

Coding 规范 文章目录 Coding 规范一.文件规范1.1 声明1.2 缩进1.3 空行1.4 空格1.5 对齐1.6 小括号1.7 花括号1.8 代码长度 二.命名规范2.1 命名总则2.2 命名空间2.3 类与接口2.4 方法命名2.5 属性命名2.6 常量命名2.7 变量命名 三.语句规范3.1 语句总则3.2 循环语句3.3 Switc…

快速入门Web开发(中)后端开发(有重点)

你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github gitee 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 想看更多 那就点个关注吧 我会尽力带来有趣的内容 CSDN 图片导入做的不是很好,因此如果有没有…

python 装饰器

欢迎访问我的博客首页。 装饰器 1. 函数装饰函数1.1 基础装饰器1.2 装饰器工厂 2. 函数装饰类3. 类装饰函数4. 类装饰类5. 参考 1. 函数装饰函数 用函数装饰函数的装饰器。 1.1 基础装饰器 下面定义一个名为 decorator 的装饰器。functools.wraps 用于还原函数名。 import fu…

“python+”潮汐、风驱动循环、风暴潮等海洋水动力模拟

ADCIRC是新一代海洋水动力计算模型,它采用了非结构三角形网格广义波动连续方程的设计,在提高计算精确度的同时还减小了计算时间。被广泛应用于:模拟潮汐和风驱动的循环、预测风暴潮和洪水和近岸海上作业等。 除此之外,ADCIRC也是…

Maven的基础使用

1 Maven概述 引入案例:idea创建javaWeb项目,如何打包并发布tomcat上去,以便于客户端访问? 方案一:DOS命令完成打包,操作性不方便,代码频繁修改,频繁使用命令打包一阶段可以打包&am…

IDEA 中的奇技淫巧

IDEA 中的奇技淫巧 书签 在使用ctrlalt方向键跳转时,或者追踪代码时,经常遇到的情况是层级太多,找不到代码的初始位置,入口。可以通过书签的形式去打上一个标记,后续可以直接跳转到书签位置。 标记书签:c…

day84 json中实现简单验证码

项目中的问题: 1 修改JS或CSS后,页面不能及时更新? 把浏览器-->"开发者工具"-->"网络"-->选中"禁用缓存" 2 如何把HTML页面转为JSP页面 将jsp页面中的<% page contentType"text/html;charse…

matlab code转C计算结果不一样原因?

在MATLAB中自动转换为C代码&#xff0c;并在Visual Studio 2022中运行时&#xff0c;如果发现计算结果不一致&#xff0c;可能有以下几种原因&#xff1a; 数值精度问题&#xff1a;MATLAB默认使用双精度浮点数进行计算&#xff08;double&#xff09;&#xff0c;而C语言中的浮…

面试:Redis(缓存穿透、缓存击穿、缓存雪崩、双写一致、Redis的持久化、Redis的过期策略、Redis的数据淘汰策略、Redis的分布式锁、Redis的集群方案、Redis网络模型)

目录 一、缓存穿透 1、解决方案一&#xff1a; 2、解决方案二&#xff1a; 二、缓存击穿 1、解决方案一&#xff1a; 2、解决方案二&#xff1a; 三、缓存雪崩 1、解决方案一&#xff1a; 2、解决方案二&#xff1a; 3、解决方案三&#xff1a; 4、解决方案四&#…

python常用库函数

Python标准库 0内置函数模块 一部分常用的的内置函数。 函数说明abs返回一个数的绝对值&#xff0c;例如&#xff1a;abs(-1.3)会返回1.3。bin把一个整数转换成以0b开头的二进制字符串&#xff0c;例如&#xff1a;bin(123)会返回0b1111011。chr将Unicode编码转换成对应的字…

C#窗体控件ColorDialog

介绍 可以获取颜色&#xff0c;然后对其他控件的颜色属性进行设置。 构造方式 直接把ColorDialog控件拖动到Form窗口。 常用属性 AllowFullOpen 可以控制是否使用自定义颜色&#xff0c;true表示可使用&#xff0c;否&#xff0c;表示不可使用。 AnyColor 如果为tr…

使用Spel表达式

使用Spel表达式 前两天在完成一个需求的时候需要读取对象中某注解内的表达式来进行解析&#xff0c;其实两个反射可以解决这个问题。突然想到spring中spel表达式不就是用来解析表达式的吗&#xff1f;干脆用spel表达式来进行解析吧。 先说明一下我这种场景使用的是模板表达式 /…

Unity 问题之 开发应用在设备上运行闪屏花屏问题的分析处理

Unity 问题之 开发应用在设备上运行闪屏花屏问题的分析处理 目录 Unity 问题之 开发应用在设备上运行闪屏花屏问题的分析处理 一、简单介绍 二、问题现象 三、问题分析 四、使用空后处理&#xff0c;解决闪屏花屏的显示问题 五、空后处理完整代码 一、简单介绍 Unity 在…

面试:Redis

目录 一、缓存穿透 1、解决方案一&#xff1a; 2、解决方案二&#xff1a; 二、缓存击穿 1、解决方案一&#xff1a; 2、解决方案二&#xff1a; 三、缓存雪崩 1、解决方案一&#xff1a; 2、解决方案二&#xff1a; 3、解决方案三&#xff1a; 4、解决方案四&#x…