CAP原理

定义

在一个分布式系统(指系统中的节点互相连接并共享数据)中,当涉及读写操作时,只能保证一致性 (Consistency)、可用性 (Availability)、分区容错性 (Partition Tolerance)三者中的两个,另外一个必须被牺牲。

  • 一致性:CAP中的C和ACID 中的C不是一个含义,ACID 中的C是指数据库中的数据满足一定的约束条件。而CAP中的C是指线性一致性,即:客户端向系统写入什么,那么读出来的也会是什么。也就是要保证客户端读取到的数据一定是上次写入的最新数据。

  • 可用性:指系统中的部分节点出现故障后,系统能否还能对外提供完全可用的服务;

  • 分区容错性:指是否允许系统中的节点之间无法通信,也就是无法互相连接;

适用场景

那么什么样的分布式系统是节点之间互联并共享数据呢?

典型的场景就是数据库的主从集群,一个数据库集群有一个主,多个从,主从之间会进行数据复制。所以适用于CAP原理。

那么如果我现在是一个Redis的集群,集群中每台机器存储不同的数据,集群中每台机器不需要复制和传递数据,那么就不属于CAP原理的讨论范围。同理,如果是A,B两个不同的业务系统,比如招行账号A给工行账号B转账100元,由于招行和工行是两个不同的业务系统,业务上隔离,且他们之间也没有共享的数据,从而也不属于CAP原理的讨论范围。

场景方案选择

  • 传统数据库主从集群:如果当前是一个现在是一个主从复制的数据库集群,同一条数据会在主从数据库上都存储,那么当存在主从数据库之间网络断开时,我们确实只能要么选择A放弃C,要么选择C放弃A。选择A放弃C,就是客户端读取到的可能不是最新的数据,但是系统持续可用;选择C放弃A,就是让系统服务不可用,客户端自然就不会认为数据不一致了。

  • 分布式数据库,如阿里的OceanBase,这种数据库也是一个主从的集群,但是主从节点往往使用Paxos/Raft等副本一致性协议,做到整个数据库系统,在部分节点发生故障时,也能在很短的时间内自动重新选主,选出一个新的主从集群的数据库系统。在重新选主的过程中,系统不可用,相当于放弃了A,而一旦选出新的主之后,系统又继续可用,且数据对外是线性一致的。相比传统的数据库主从集群,分布式数据库由于可以在遇到网络分区导致数据库主从节点之间无法互联时,可以快速选出新的主,然后快速恢复,所以架构设计上和用户体验上,要好很多。但是系统设计的复杂度也非常高。

分布式事务

通过上面的分析,我们知道CAP中的数据一致性,本质上是为了维护同一个数据的不同副本之间的一致性。而更多的时候,我们要解决的是不同业务系统之间的数据一致性,即数据之间总是应该满足规定的业务规则。典型的场景比如有跨行转账、订单和减库存。这种场景,由于没有数据共享的特征,所以不适用于CAP。比如A银行的账户给B银行的账户转账100元,那么转账前后,两个账户的钱加起来应该不变。也就是A扣款了,B就必须加款。那么这种场景如何解决呢?一般的做法是采用分布式事务,常见的分布式事务的解决方案有:2PC\3PC、TCC、基于分布式MQ+本地消息、分布式MQ事务消息、Sagas。

使用优惠口令「dotnet123

????到手仅¥89,限前200

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

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

相关文章

大学生开题报告php,php毕业设计开题报告

php毕业设计开题报告该频道涵盖有关于开题报告和毕业设计的论文范例,免费教你怎么写php毕业设计论文提供相关参考资料。一、研究背景1 基于英语新课程标准的要求。《英语课程标准》指出:必须正视学生外语学习基础和发展要求的差异,遵循外语学习的客观规律…

服务器应用服务为何卡顿?原来是内存耗尽惹的祸!

做过运维的朋友们都可能会遇到:服务器应用程序运行慢的问题,最终各部门找上门,。今天在这我跟大家分享一个案例及其解决办法。以前我跟很多朋友们也为这样的事情苦恼过,我的服务器内存可是64G啊,这都不够它吃的。后来我…

matlab 传感器的迟滞,MATLAB PI迟滞模型问题

之前我用matlab进行迟滞模型建模,误差非常大,我之前怀疑是自己的参数辨识出问题了,所以我用论文中的阈值向量和权重向量进行建模,输入数据也是用论文数据,但是出来的拟合的线误差非常大,和文献中相差太大。…

(2)MongoDB副本集自动故障转移原理(含客户端)

前文我们搭建MongoDB三成员副本集,了解集群基本特性,今天我们围绕下图聊一聊背后的细节。默认搭建的副本集均在主节点读写,辅助节点冗余部署,形成高可用和备份,具备自动故障转移能力。集群心跳保活集群每个节点以周期性…

matlab如何使用cu文件,Matlab编译cuda的.cu文件

matlab函数,大体首先是用nvcc命令生成.o文件,然后用mex链接对应库文件,生成动态链接库(.mexw64等)。测试环境:1) Windows x64 matlab cuda 5.5 vs20122) Ubuntu 12.04 amd64 server matlab gcc cuda 5.5windows用户需要根据…

C++map容器-查找和统计

map查找和统计 功能描述&#xff1a; 对map容器进行查找数据以及统计数据 函数原型&#xff1a; 代码如下&#xff1a; #include <iostream> using namespace std; #include <map> //map容器 查找和统计void test01() {//查找map<int, int >m;m.insert(p…

C++map容器-插入和删除

map插入和删除 功能描述&#xff1a; map容器进行插入数据和删除数据 函数原型&#xff1a; 代码如下&#xff1a; #include <iostream> using namespace std; #include <map>//map容器 插入和删除 void printMap(map<int, int> &m) {for (map<in…

你需要了解的 JIT Debugging

如果你还不清楚什么是转储文件&#xff0c;不知道什么时候需要转储文件&#xff0c;请参考转储文件系列文章的第一篇 —— 转储文件知多少。前言 我在 你需要知道的 N 种抓取 dump 的工具 的工具 这篇文章里&#xff0c;向大家介绍了几款可以抓取转储文件的工具及其简单用法。不…

超越“迁移”的思考:应用程序该如何被Kubernetes接管?

传统虚拟机&#xff08;VM&#xff09;的可扩展性差强人意&#xff0c;但Kubernetes可以快速&#xff0c;无缝地扩展正在运行的服务。Kubernetes将容器、集群以及广泛的抽象配置方法引入桌面&#xff0c;用于提升部署和变更管理体验&#xff0c;从而使人们对Kubernetes关注更多…

C++string容器-字符串拼接

string字符串拼接 功能描述&#xff1a; 实现在字符串末尾拼接字符串 函数原型&#xff1a; 代码如下&#xff1a; #include <iostream> using namespace std; #include <cstring>//string字符串拼接 void test01() {string str1 "我";str1 "爱…

如何运用领域驱动设计 - 存储库

概述在上一篇文章<如何运用领域驱动设计 - 聚合>中&#xff0c;我们已经了解过领域驱动设计中一个很核心的对象-聚合。在现实场景中&#xff0c;我们往往需要将聚合持久化到某个地方&#xff0c;或者是从某个地方创建出聚合。此时就会使得领域对象与我们的基础架构产生紧…

C++string容器-字符串查找和替换

string查找和替换 功能描述&#xff1a; 查找&#xff1a;查找指定字符串是否存在 替换&#xff1a;在指定的位置替换字符串 函数原型&#xff1a; rfind 和find 的区别&#xff1a; rfind从右往左查找 find从左往右查找 查找案列代码如下&#xff1a; #include <iostrea…

如何运用领域驱动设计 - 工作单元

概述在上一篇 《如何运用领域驱动设计 - 存储库》 的文章中&#xff0c;我们讲述了有关仓储的概念和使用规范。仓储为聚合提供了持久化到本地的功能&#xff0c;但是在持久化的过程中&#xff0c;有时一个聚合根中的各个领域对象会分散到不同的数据库表里面&#xff1b;又或者是…

C++string容器-字符串比较

string字符串比较 功能描述: 字符串之间的比较 比较方式&#xff1a; 通常用来比较两个字符串是否相等 函数原型&#xff1a; 代码如下&#xff1a; #include <iostream> using namespace std; #include <cstring> //string字符串比较void test01() {string…

国产自主研发编程语言火了,同行十二年,不知Python是木兰?

1月17号有媒体称&#xff0c;一款面向智能物联网和编程教育的号称自主研发语言横空出世&#xff0c;名为【Mulan 】。消息一出&#xff0c;引起了众多争议。但有知乎网友发现&#xff0c;下载的程序包解包后——是个 Python&#xff1f;何为木兰&#xff1f;1月17号&#xff0c…

C++string容器-字符存取

string中单个字符存取方式有两种 代码如下&#xff1a; #include <iostream> using namespace std; #include <cstring>//string 字符存取 void test01() {string str "hello";cout << "str " << str << endl;for (int i…

有了容器为什么kubernetes还需要Pod?

简介容器并不是软件开发的银弹&#xff0c;没有任何一种技术能解决软件开发中的所有问题当我们采用容器化技术的时候&#xff0c;摒弃了传统的物理机或者虚拟机的部署方式&#xff0c;以一种更加轻快&#xff0c;便捷的方式来部署我们的应用。到容器化的进阶&#xff0c;再加上…

C++string容器-插入和删除

string插入和删除 功能描述&#xff1a; 对string字符串进行插入和删除字符操作 函数原型&#xff1a; #include <iostream> using namespace std; #include <cstring>//字符串 插入和删除 void test01() {string str "hello";str.insert(1, "…

.NET绘制旋转太极图

前言我之前发了一篇《 用.NET写“算命”程序》的文章&#xff0c;但有人纷纷提出了质疑&#xff0c;认为没有“科学”&#xff08; mi xin&#xff09;依据????。所谓“太极生两仪&#xff0c;两仪生四象&#xff0c;四象生八卦&#xff0c;八卦定吉凶&#xff0c;吉凶生大…

.NET CORE(C#) WPF 抽屉式菜单

.NET CORE(C#) WPF 抽屉式菜单阅读导航本文背景代码实现本文参考源码1. 本文背景使用简单动画实现抽屉式菜单2. 代码实现使用 .NET CORE 3.1 创建名为 “AnimatedColorfulMenu” 的WPF模板项目&#xff0c;添加1个Nuget库&#xff1a;MaterialDesignThemes&#xff0c;版本为最…