1.分布式-理论

目录

一、什么是分布式系统

二、CAP理论

1.一致性Consisency

2.可用性(Availability)

3.分区容错性(Partition tolrance)

三、BASE理论

1.Basically Available(基本可用)

2.Soft state(软状态)

3.Eventually consistent(最终一致性)

四、什么是分布式事务

1.本地事务ACID

2.分布式事务

五、分布式事务解决方案

1.二阶段提交2PC

2.三阶段提交3PC

3.TCC(Try-Confirm-Cancel)

4.Saga

5.基于消息的最终一致性:

6.最大努力通知

7.事务补偿机制


一、什么是分布式系统

一个系统各组件分别部署在不同服务器,彼此通过网络通信和协调的系统。

  • 可以指多个不同组件分布在网络上互相协作,比如说电商网站
  • 也可以一个组件的多个副本组成集群,互相协作如同一个组件,比如数据存储服务中为了数据不丢失而采取的多个服务备份冗余,当数据修改时也需要通信来复制数据

分布式最早出现的目地首先是解决单点问题,避免单点故障,然后解决了性能问题。

二、CAP理论

CAP理论说的是在一个分布式计算机系统中,一致性,可用性和分区容错性这三种保证无法同时得到满足,最多满足两个。

1.一致性Consisency

一致性指"all nodes see the same data at the same time",即更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致。

2.可用性(Availability)

可用性指"Reads and writes always succeed",即服务一直可用,而且是正常响应时间。

对于可用性的衡量标准如下:

3.分区容错性(Partition tolrance)

分区容错性指"the system continues to operate despite arbitrary message l
ss or failure of part of the system",即分布式系统在遇到某节点或网络分区故障的
时候,仍然能够对外提供服务。分区容忍性分是布式系统具备的基本能力。

三、BASE理论

BASE(Basically Available、Soft state、Eventual consistency)是基于CAP理论逐步演化而来的,核心思想是即便不能达到强一致性(Strong consistency),也可以根据应用特点采用适当的方式来达到最终一致性(Eventual consistency)的效果。

两个对冲理念:ACID和BASE

  • ACID是传统数据库常用的设计理念,追求强一致性模型。
  • BASE支持的是大型分布式系统,提出通过牺牲强一致性获得高可用性。

1.Basically Available(基本可用)

基本可用本质是一种妥协,也就是出现节点故障或者系统过载时,通过牺牲非核心
功能的可用性,保障核心功能的稳定运行。

实现基本可用的几个策略:

  1. 流量削峰
  2. 延迟响应,异步处理
  3. 体验降级
  4. 过载保护熔断/限流
  5. 故障隔离

2.Soft state(软状态)

弱状态允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性,即允许系统在多个不同节点的数据副本存在数据延迟。

原子性是硬状态,要求多个节点的数据副本都是一致的。

3.Eventually consistent(最终一致性)

分布式系统不能一直是软状态,必须有个时间期限。在期限过后,应当保证所有副本保持数据
一致性。从而达到数据的最终一致性。这个时间期限取决于网络延时,系统负载,数据复制
方案设计等等因素。

四、什么是分布式事务

分布式事务是相对本地事务而言的,对于本地事务,利用数据库本身的事务机制,
就可以保证事务的ACID特性

1.本地事务ACID

ATOMICITY

原子性:一个事务中所有操作必须全部完成,要么全部不完成;

CONSISTENCY

一致性:在事务开始或结束时,数据库应该在一致状态;

ISOATION

隔离性:事务与事务之间不会互相影响,一个事务的中间状态不会被其他事务感知;

DURABILITY

持久性:一旦事务完成,就不能返回,事务对数据所做的变更完全保存在数据库中;

2.分布式事务

在分布式环境下,会涉及到多个数据库。分布式事务其实就是将对一个库事务的概念
扩大到了对多个库的事务。目的是为了保证分布式系统中的数据一致性。

分布式事务处理的关键是:

  1. 需要记录事务在任何节点所做的所有动作;
  2. 事务进行的所有操作要么全部提交,要么全部回滚;

五、分布式事务解决方案

1.二阶段提交2PC

这是最传统的分布式事务协议。它分为两个阶段:准备阶段和提交阶段。在准备阶段,事务协调者询问所有参与节点是否准备好提交事务;如果所有节点都回复“准备好”,则进入提交阶段,协调者命令所有节点提交事务;如果有任何节点无法准备,协调者命令所有节点回滚。

2PC缺点:

1.性能阻塞问题

执行过程中,所有参与节点都是事务阻塞性的,当参与者占有公共资源时,其他第三方节点访问公共资源就不得不处于阻塞状态,为了数据的一致性而牺牲了可用性,对性能影响较大,不适合高并发高性能场景

2.可靠性问题

2PC非常依赖协调者,当协调者发生故障时,尤其是第二阶段,那么所有的参与者就会都处于锁定事务资源的状态中,而无法继续完成事务操作(如果是协调者挂掉,可以重新选举一个协调者,但是无法解决因为协调者宕机导致的参与者处于阻塞状态的问题)

3.数据一致性问题

在阶段二中,当协调者向参与者发送commit请求之后,发生了局部网络异常或者在发送commit请求过程中协调者发生了故障,这回导致只有一部分参与者接受到了commit请求。而在这部分参与者接到commit请求之后就会执行commit操作。但是其他部分未接到commit请求的机器则无法执行事务提交。于是整个分布式系统便出现了数据不一致性的现象。

4.二阶段无法解决的问题

协调者在发出 commit 消息之后宕机,而唯一接收到这条消息的参与者同时也宕机了,那么即使协调者通过选举协议产生了新的协调者,这条事务的状态也是不确定的,没人知道事务是否被已经提交。

2.三阶段提交3PC

3PC,三阶段提交协议,是二阶段提交协议的改进版本。三阶段提交有两个改动点:

  1. 在协调者和参与者中都引入超时机制
  2. 为了解决2PC中协调者单点故障的问题,3PC引入了预提交阶段

所以3PC分为3个阶段:CanCommit 准备阶段、PreCommit 预提交阶段、DoCommit 提交阶段

3PC缺点

与2PC相比,3PC降低了阻塞范围,并且在等待超时后,协调者和参与者会中断事务,避免了协调者单点问题,阶段三中协调者出现问题时,参与者会继续提交事务。但数据不一致问题依然存在,当在参与者收到 preCommit 请求后等待 doCommit 指令时,此时如果协调者请求中断事务,而协调者因为网络问题无法与参与者正常通信,会导致参与者继续提交事务,造成数据不一致。

2PC和3PC都无法保证数据绝对的一致性,一般为了预防这种问题,可以添加一个报警,比如监控到事务异常的时候,通过脚本自动补偿差异的信息。

3.TCC(Try-Confirm-Cancel)

TCC模型将事务操作分为三个阶段:Try(预留资源)、Confirm(确认提交)和Cancel(取消释放)。在Try阶段,每个参与者尝试预留资源但不实际提交,如果所有参与者都能预留成功,则在Confirm阶段真正提交事务;否则,在Cancel阶段撤销之前的操作。

4.Saga

Saga通过一系列的短事务(也称为子事务)来模拟长事务,每个子事务都是可补偿的。如果某个子事务失败,Saga会执行之前所有子事务的补偿操作,从而达到事务的最终一致状态。

5.基于消息的最终一致性:

在这种模式下,服务之间通过消息队列异步通信,利用消息的发送与确认机制保证最终一致性。通常包括发布/订阅模型和事件驱动架构,如 Saga 也可以通过这种方式实现。

6.最大努力通知

最大努力通知也称为定期校对,是对MQ事务方案的进一步优化。它在事务主动方增加了消息校对的接口,如果事务被动方没有接收到主动方发送的消息,此时可以调用事务主动方提供的消息校对的接口主动获取。

最大努力通知,事务主动方尽最大努力(重试,轮询....)将事务发送给事务接收。被动方也可调用接口校对并消费。

7.事务补偿机制

通过业务层面的设计实现事务的补偿逻辑,允许服务在失败后通过反向操作恢复到一致状态,适用于对实时性要求不高的场景。

 

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

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

相关文章

【JavaSE】/*初识Java*/

目录 一、了解 Java 语言 二、Java 语言的重要性 2.1 使用程度 2.2 工作领域 三、Java 语言的特性 四、Java 的基础语法 五、可能遇到的错误 六、第一个 java 程序代码解析 七、Java 注释 八、Java 标识符 九、Java 关键字 一、了解 Java 语言 Java 是由 Sun Micr…

15. 三数之和(双指针+去重优化)

文章目录 前言一、题目描述二、代码原理1.暴力解法2.双指针优化 三.代码编写总结 前言 在本篇文章中,我们将会讲到leetcode中15. 三数之和,我们将会用到双指针的方式解决这道问题,同时注意掌握算法原理的去重操作。 一、题目描述 给你一个…

PHP高级教程

🐌博主主页:🐌​倔强的大蜗牛🐌​ 📚专栏分类:PHP 📚参考教程:菜鸟\编程网❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、PHP 多维数组 二、PHP date(&#…

免费获取!图论+灰色系统+混合优化算法程序代码!

前言 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。算法优化是指对算法的有关性能进行优化,如时间复杂度、空间复杂度、正确性、健壮性…

MongoDB聚合运算符:$toLower

MongoDB聚合运算符&#xff1a;$toLower 文章目录 MongoDB聚合运算符&#xff1a;$toLower语法使用举例角度的双曲正切 $toLower聚合运算符用于将字符串转换为小写。 语法 { $toLower: <expression> }<expression>为可被解析为字符串的表达式。如果参数解析为null…

安卓实现连接wesokcet

在build.gradle里引入依赖&#xff1a; implementation org.java-websocket:Java-WebSocket:1.5.2 在Androidmanifest.xml 文件里加入网络权限&#xff1a; <uses-permission android:name"android.permission.INTERNET" /> 代码&#xff1a; package com.x…

Vue与Java使用AES加密与解密

CBC模式&#xff08;通过偏移值进行加密&#xff0c;更具安全性&#xff09; 一、VUE&#xff1a; 1、安装 npm install crypto-js 2、编写公用js&#xff08;在common文件夹下创建一个crypto.js&#xff09; 注意&#xff1a;key最少要有16个字符&#xff0c;iv最少6个字符…

Java | Leetcode Java题解之第79题单词搜索

题目&#xff1a; 题解&#xff1a; class Solution {public boolean exist(char[][] board, String word) {char[] words word.toCharArray();for(int i 0; i < board.length; i) {for(int j 0; j < board[0].length; j) {if (dfs(board, words, i, j, 0)) return t…

Linux·基本指令

从本节开始将新开一个关于Linux操作系统的板块&#xff0c;其实Linux也没什么太神秘的&#xff0c;就是一个操作系统(OS)嘛&#xff0c;跟Windows操作系统是一个概念&#xff0c;只不过Windows中的大部分操作都是用光标点击来进行人机交互&#xff0c;但是Linux是通过输入命令行…

Symfony DomCrawler库在反爬虫应对中的应用

在当今信息爆炸的时代&#xff0c;互联网上的数据量巨大&#xff0c;但这也带来了一些问题&#xff0c;比如恶意爬虫可能会对网站造成严重的影响&#xff0c;导致资源浪费和服务不稳定。为了解决这个问题&#xff0c;许多网站采取了反爬虫策略。Symfony DomCrawler库是一个强大…

学历:敲门砖还是枷锁?

导言&#xff1a; 近日&#xff0c;“孔乙己文学”引发热议&#xff0c;其中一句“学历不仅是敲门砖&#xff0c;也是我下不来的高台&#xff0c;更是孔乙己脱不下的长衫”触动了许多人的心弦。关于学历究竟是敲门砖还是枷锁的讨论在社会中一直存在着&#xff0c;让我们…

fmt::arg的使用

来自&#xff1a; https://hackingcpp.com/cpp/libs/fmt.html #include <fmt/format.h> // literalsint main () { int i 2; double d 4.567; fmt::print("{x} {x}\n", fmt::arg("x",d)); fmt::print("{pi} * {0}\n", i, fmt::arg(&…

第27章 大数据系统测试

一、大数据概述 &#xff08;一&#xff09;定义 无法在一定时间内用常规的软件工具来进行捕捉、管理和处理的数据的集合 &#xff08;二&#xff09;特点 数据类型多样数据体量大处理速度高速价值密度低 二、大数据测试策略 &#xff08;一&#xff09;挑战 数据的多样…

态、势、感、知四种Transformer模型的融合

Transformer模型是一种机器学习模型&#xff0c;最初用于自然语言处理任务&#xff0c;如翻译和文本生成。它是由Google AI团队开发的&#xff0c;其设计突破了以往循环神经网络和卷积神经网络的限制。Transformer模型的核心是自注意力机制&#xff08;self-attention mechanis…

Java面试题:volatile

volatile (不稳定的) 修饰共享变量(类的成员变量,类的静态成员变量) volatile保证线程间的可见性 修饰共享变量,防止编译器等优化发生,让一个线程对共享变量的修改对另一个线程可见 static Boolean flag new Thread(修改flag; ) new Thread(while(flag){} )普通情况下,在J…

Linux运维工程师基础面试题整理(一)

Linux运维工程师基础面试题整理(一) 1. 什么是Linux?请说出常见的发行版本?2. Linux文件系统中的常见目录有哪些?4. 在Linux中,如何查看系统的运行状态和性能?5. lsof/ss/netstat三个命令作用与区别?6. 如何在Linux中查找文件?7. 如何将文件从本地上传到远程服务器?8…

今天遇到一个GPT解决不了的问题

问题描述 你好&#xff0c;postman的一个post请求&#xff0c;编辑器里面放了一个很长的json数据&#xff0c;报Tokenization is skipped for long lines for performance reasons. This can be configured via editor.maxTokenizationLineLength.&#xff0c;但是同样的数据&a…

C#算法之计数排序

算法释义&#xff1a;计数排序是一种非基于比较的排序算法&#xff0c;它不依赖于比较操作来确定元素的顺序&#xff0c;而是通过键值索引直接确定元素的输出位置。计数排序适用于一定范围内的整数排序。为什么说是一定范围之内呢&#xff1f;原因如下&#xff1a;计数排序的复…

住宅ip与数据中心ip代理的区别是什么

代理通常意味着“替代”。它是用户设备和目标服务器之间的中介&#xff0c;允许在不同的IP地址下上网。代理ip根据来源分类可分住宅ip与数据中心ip&#xff0c;二者之间区别是什么呢&#xff1f; 住宅ip是由互联网服务提供商(ISP)提供给家庭的IP地址。出于这个原因&#xff0c…

灾备建设中虚拟机备份自定义数据块大小应用

灾备建设中&#xff0c;传输备份数据时&#xff0c;自定义数据块大小可以帮助优化数据传输和存储效率。 确定数据块大小&#xff0c;首先&#xff0c;需要确定合适的数据块大小。这可以根据备份数据量和网络带宽来决定。通常情况下&#xff0c;较小的数据块可以更好地适应网络…