浅谈分布式CAP定律、BASE理论

第一节 分布式架构设计理论与Zookeeper环境搭建

1. 分布式架构设计理论

学习Zookeeper之前,我们需要掌握一些分布式系统基础知识:了解分布式系统的概念、原理。

配置管理 域名服务 分布式同步 发布订阅

1. 分布式架构介绍

1.1 什么是分布式

《分布式系统原理和范型》一书中是这样定义分布式系统的:“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像是单个相关系统”。

  • 分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。

image.png

1.2 分布式与集群的区别

  • 集群: 多个服务器做同一个事情

image.png

  • 分布式: 多个服务器做不同的事情

image.png

1.3 分布式系统特性

分布式系统:

  • 一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统这是分布式系统.
  • 在不同的硬件,不同的软件,不同的网络,不同的计算机上,仅仅通过消息来进行通讯与协调, 这是他的特点,更细致的看这些特点又可以有:分布性、对等性、并发性、缺乏全局时钟、故障随时会发生。

image.png

1.4 分布式系统面临的问题

  1. 通信异常

image.png

  1. 网络分区

image.png

  1. 节点故障

image.png

  1. 三态

image.png

  1. 重发

image.png

2. 分布式理论

2.1 数据一致性

2.1.1 什么是分布式数据一致性

分布式数据一致性,指的是数据在多份副本中存储时,各副本中的数据是一致的。

image.png

2.1.2 副本一致性

分布式系统当中,数据往往会有多个副本。多个副本就需要保证数据的一致性。这就带来了同步的问题,因为网络延迟(节点故障、并发操作)等因素, 我们几乎没有办法保证可以同时更新所有机器当中的包括备份所有数据. 就会有数据不一致的情况.

image.png

总得来说,我们无法找到一种能够满足分布式系统中数据一致性解决方案。因此,如何既保证数据的一致性,同时又不影响系统运行的性能,是每一个分布式系统都需要重点考虑和权衡的。于是,一致性级别由此诞生.

2.1.3 一致性分类

image.png

1) 强一致性
这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,(任何读操作都会返回最新的写操作的结果)用户体验好,但实现起来往往对系统的性能影响大。强一致性很难实现,并且实现强一致性可能需要牺牲系统的可用性和性能。

2) 弱一致性
这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入的值,也不承诺多久之后数据能够达到一致,但会尽可能地保证到某个时间级别(比如秒级别)后,数据能够达到一致状态。

3) 最终一致性
最终一致性也是弱一致性的一种,它无法保证数据更新后,所有后续的访问都能看到最新数值,而是需要一个时间,在这个时间之后可以保证这一点(就是在一段时间后,节点间的数据会最终达到一致状态),而在这个时间内,数据也许是不一致的,这个系统无法保证强一致性的时间片段被称为「不一致窗口」。不一致窗口的时间长短取决于很多因素,比如备份数据的个数、网络传输延迟速度、系统负载等。

最终一致性在实际应用中又有多种变种:

  • 因果一致性
    如果进程A通知进程B它已更新了一个数据项,那么进程B的后续访问将返回更新后的值。与进程A无因果关系的进程C的访问遵守一般的最终一致性规则.

image.png

  • 读己之所写 一致性
    当进程A自己更新一个数据项之后,它总是访问到更新过的值,绝不会看到旧值。这是因果一致性模型的一个特例.

image.png

  • 会话一致性
    会话一致性是一种最终一致性模型,强调在单个会话期间的一致性。在同一个会话中,操作的顺序和结果必须保证一致。然而,在不同的会话之间,操作的顺序和结果可能是无序的。

    image.png

  • 单调读一致性
    如果一个进程已经读取到一个特定值,那么该进程不会读取到该值以前的任何值。换句话说,如果一个进程在读取了一个数据项的某个值之后,再次读取该数据项,它要么读取到相同的值,要么读取到一个更新的值。

    image.png

  • 单调写一致性

    系统保证对同一个进程的写操作串行化。

    image.png

  • 一致性模型图

image.png

2.2 CAP定理

2.2.1 CAP定理介绍

CAP 定理(CAP theorem)又被称作布鲁尔定理(Brewer’s theorem),是加州大学伯克利分校的计算机科学家埃里克·布鲁尔(Eric Brewer)在 2000 年的 ACM PODC 上提出的一个猜想。对于设计分布式系统的架构师来说,CAP 是必须掌握的理论。

在一个分布式系统中,当涉及读写操作时,只能保证一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance)三者中的两个,另外一个必须被牺牲。

image.png

选项具体意义
一致性(Consistency)所有节点访问时都是同一份最新的数据副本
可用性(Availability)每次请求都能获取到非错的响应,但是不保证获取的数据为最新数据
分区容错性(Partition tolerance)分布式系统在遇到任何网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务,除非整个网络环境都发生了故障
  1. 一致性(C-Consistency)
    这里指的是强一致性

    image.png

    • 客户端向G1写入数据v1,并等待响应
    • 此时,G1服务器的数据为v1,而G2服务器的数据为v0,两者不一致
    • 接着,在返回响应给客户端之前,G2服务器会自动同步G1服务器的数据,使得G2服务器的数据也是v1
    • 一致性保证了不管向哪台服务器(比如这边向G1)写入数据,其他的服务器(G2)能实时同步数据
    • G2已经同步了G1的数据,会告诉G1,我已经同步了
    • G1接收了所有同步服务器的已同步的报告,才将“写入成功”信息响应给client
    • client再发起请求,读取G2的数据
    • 此时得到的响应是v1,即使client读取数据到G2
  2. 可用性(A-Availability)
    系统中非故障节点收到的每个请求都必须有响应. 在可用性系统中,如果我们的客户端向服务器发送请求,并且服务器未崩溃,则服务器必须最终响应客户端,不允许服务器忽略客户的请求.

  3. 分区容错性(P-Partition tolerance)
    允许网络丢失从一个节点发送到另一个节点的任意多条消息,即不同步. 也就是说,G1和G2发送给对方的任何消息都是可以放弃的,也就是说G1和G2可能因为各种意外情况,导致无法成功进行同步,分布式系统要能容忍这种情况。

    image.png

2.2.2 CAP三者不可能同时满足论证

假设确实存在三者能同时满足的系统

  1. 那么我们要做的第一件事就是分区我们的系统,由于满足分区容错性,也就是说可能因为通信不佳等情况,G1和G2之间是没有同步

image.png

  1. 接下来,我们的客户端将v1写入G1,但G1和G2之间是不同步的,所以如下G1是v1数据,G2是v0数据。

image.png

  1. 由于要满足可用性,即一定要返回数据,所以G1必须在数据没有同步给G2的前提下返回数据给client,如下

image.png

  • 接下去,client请求的是G2服务器,由于G2服务器的数据是v0,所以client得到的数据是v0image.png

    结论:很明显,G1返回的是v1数据,G2返回的是v0数据,两者不一致。其余情况也有类似推导,也就是说CAP三者不能同时出现。

    image.png

2.2.3 CAP三者如何权衡

三选二利弊如何

  • CA (Consistency + Availability):强一致性和高可用性,放弃分区容错性。在这种情况下,系统能够保证所有节点之间的数据一致性,并且一旦某个节点出现故障或网络分区,整个系统将无法提供服务。这种模型适用于一些对一致性要求非常高、容忍服务不可用的场景,如金融交易系统。image.png

  • CP (consistency + partition tolerance):强一致性和分区容错性,牺牲可用性。在这种情况下,系统能够保证数据的一致性,并且在面对网络分区时仍然可以正常运行,但是可能会导致某些节点无法提供服务。这种模型适用于对一致性要求高、可以容忍服务不可用的场景,如数据库系统。

    image.png

  • AP (availability + partition tolerance):可用性和分区容错性,可能牺牲一致性。在这种情况下,系统能够保证在面对网络分区时仍然能够提供服务,并且允许节点之间的数据出现一定的不一致性。这种模型适用于对可用性要求高、可以容忍一定的数据不一致的场景,如大规模分布式存储系统。

    image.png

如何进行三选二

放弃了一致性,满足分区容错,那么节点之间就有可能失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会容易导致全局数据不一致性。对于互联网应用来说,机器数量庞大,节点分散,网络故障再正常不过了,那么此时就是保障AP,放弃C的场景,而从实际中理解,像网站这种偶尔没有一致性是能接受的,但不能访问问题就非常大了。

image.png

对于银行来说,就是必须保证强一致性,也就是说C必须存在,那么就只用CA和CP两种情况,当保障强一致性和可用性(CA),那么一旦出现通信故障,系统将完全不可用。另一方面,如果保障了强一致性和分区容错(CP),那么就具备了部分可用性。实际究竟应该选择什么,是需要通过业务场景进行权衡的(并不是所有情况都是CP好于CA,只能查看信息但不能更新信息有时候还不如直接拒绝服务)

image.png

2.3 BASE理论

BASE 是指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)。它的核心思想是即使无法做到强一致性(CAP 就是强一致性),但应用可以采用适合的方式达到最终一致性。

  • BA指的是基本业务可用性,支持分区失败;
  • S表示柔性状态,也就是允许短时间内不同步;
  • E表示最终一致性,数据最终是一致的,但是实时是不一致的。

Basically Available(基本可用)
什么是基本可用呢?假设系统,出现了不可预知的故障,但还是能用,相比较正常的系统而言:

  • 响应时间上的损失:正常情况下的搜索引擎 0.5 秒即返回给用户结果,而基本可用的搜索引擎可以在 1 秒返回结果。

  • 功能上的损失:在一个电商网站上,正常情况下,用户可以顺利完成每一笔订单,但是到了大促期间,为了保护购物系统的稳定性,部分消费者可能会被引导到一个降级页面

    image.png

Soft state(软状态)
什么是软状态呢?相对于原子性而言,要求多个节点的数据副本都是一致的,这是一种 “硬状态”。
软状态指的是:允许系统中的数据存在中间状态,并认为该状态不会影响系统的整体可用性,即允许系统在多个不同节点的数据副本存在数据延时。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

构建异步高并发服务器:Netty与Spring Boot的完美结合

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 ChatGPT体验地址 文章目录 前言IONetty1. 引入依赖2. 服务端4. 客户端结果 总结引导类-Bootstarp和ServerBootstrap连接-NioSocketChannel事件组-EventLoopGroup和NioEventLoopGroup 送书…

COMSOL接触(高度非线性)仿真常见报错及解决方法总结

前言 由于COMSOL采用隐式求解器,相较于使用显式求解器的Dyna、Abaqus等软件。要在COMSOL中实现结构接触这一高度非线性问题难度较大,报错时有发生。究其原因,是当物体之间相互接触时,物体受到的应力、运动路径会发生突变&#xff…

LabVIEW高精度微小电容测量

LabVIEW高精度微小电容测量 在电子工程和科研领域,精确测量微小电容值是一项有一定要求的任务,尤其在涉及到高精度和低成本时。设计了一种基于LabVIEW高精度微小电容测量系统,旨在提供一个既经济又高效的解决方案。 该系统的核心在于使用FD…

C语言中的内存函数你知道多少呢?

目录 ​编辑 1. memcpy的使用和模拟实现 1.1函数介绍 ​编辑 1.2函数的使用 1.3模拟实现 2. memmove的使用和模拟实现 2.1函数介绍 2.2函数的使用 2.3模拟实现 3. memset函数的使用 3.1函数介绍 3.2函数的使用 ​编辑 4. memcmp函数的使用 4.1函数介绍 4.2函数…

Python循环语句——range语句

一、引言 在Python编程中,range函数是一个内置函数,用于生成一个不可变的数字序列。它常被用于循环结构,如for循环,来遍历一系列的数字。尽管其使用非常基础,但range的强大之处在于其提供了灵活性,可以创建…

【2024.2.5练习】砍竹子(25分)

题目描述 题目分析 考虑题目是否满足贪心。每次施展魔法会使一段连续的竹子高度变为一半左右的平方根。根据样例,似乎每次让最高的竹子变短就能得到最优解。 假设魔法一次只能对一根竹子使用,永远不出现连续相同高度的竹子,那么显然无论使用…

接口幂等性

接口幂等性 如何实现幂等性实现方式一:数据库唯一主键实现方式二:Token机制实现方式三:数据库乐观锁实现方式四、加分布式锁 如何实现幂等性 其实实现幂等性的方案有不少,但是呢,这就得需要你根据不同的业务场景去选择…

Stable Diffusion 模型下载:Disney Pixar Cartoon Type A(迪士尼皮克斯动画片A类)

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 目前还没有一个好的皮克斯迪士尼风格的卡通模型,所以我决定自己制作一个。这是将皮克斯风格模型与我自己的Loras合并在一起,创建一个通用的…

oracle 启动命令以及ORA-01033问题处理、删除归档日志

1 启动数据库:startup 2 关闭数据库:Shutdown immediate 3 查看监听状态:lsnrctl status 4 启动监听:lsnrctl start 5 停止监听:lsnrctl stop 常见问题 1、在服务器重启后会出现,Oracle ORA-01033: ORAC…

渗透测试-信息打点与架构分析细节梳理

渗透测试-信息打点与架构分析细节梳理 为了保障信息安全,我在正文中会去除除靶场环境的其他任何可能的敏感信息 什么是网站架构 网站架构包括网站的方方面面,下面是常见的内容: 前端(Front-End): 使用Reac…

DAY14之二叉树理论基础及递归遍历和迭代遍历

理论基础 满二叉树 满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。 如图所示: 这棵二叉树为满二叉树,也可以说深度为k,有2^k-1个节点的二叉…

Pymysql之Connection中常用API

Connection中常用API 1、open() :检测数据库是否连接。 connect.open:如果数据库连接返回Trhe,否则返回False。 2、ping(reconnectTrue) connect.ping(reconnectTrue):如果reconnectTrue表示连接断开后,重新进行连接。 import…

春节假期如何高效管理Shopee虾皮本土店?技巧都给你整理好了!

EasyBoss ERP 对于中国人最重要的春节即将来临,但对于运营Shopee、TikTok Shop等平台的卖家而言,他们的客户可不会过春节。为了不影响店铺的业绩,很多卖家在春节期间都还是照常运营店铺,但又不想错过和家人团圆的机会怎么办&…

《Java程序设计》实验报告(一)之Java语言基础

实验内容及步骤: 编写”hello world”应用程序。(1)代码: public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } (2)运行…

惟客数据地产经营分析解决方案-构建数字化经营体系,提高精细化管理能力

惟客数据地产经营分析解决方案以拉通数据底座,以管理行为、量化考核、预警机制为核心,强化对经营风险的识别和解决,以终为始,通过高频高价值场景的应用适配,支撑企业在数字化时代中不断创新、转型,提升企业…

使用Pillow来生成简单的红包封面

Pillow库(Python Imaging Library的后继)是一个强大而灵活的图像处理库,适用于Python。Pillow 库(有时也称 PIL 库) 是 Python 图像处理的基础库,它是一个免费开源的第三方库,由一群 Python 社区…

SSL协议是什么?关于SSL和TLS的常见问题解答

SSL(安全套接字层)及其后继者TLS(传输层安全)是用于在联网计算机之间建立经过身份验证和加密的链接的协议。尽管SSL协议在 1999年已经随着TLS 1.0的发布而被弃用,但我们仍将这些相关技术称为“SSL”或“SSL/TLS”。那么…

VM 虚拟机和容器技术之间有什么区别?

随着云计算技术的不断发展,虚拟机和容器技术作为两种常见的虚拟化技术,被广泛应用于云计算领域。虽然虚拟机和容器技术都是虚拟化技术,但它们之间存在一些重要的区别。本文将详细介绍虚拟机和容器技术的区别,以便读者更好地了解这…

2.7:二叉树创建、先中后遍历、各个节点度的个数、深度

1.二叉树的创建、先中后遍历、各个节点度的个数、深度 程序代码&#xff1a; 1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 typedef char datatype;5 typedef struct node6 {7 datatype data;8 struct node *lchild;9 struct…

如何使用数据恢复软件恢复已删除的数据

本教程介绍如何使用奇客数据恢复软件有效地从各种存储系统中恢复已删除的数据&#xff1a; 您是否曾经不小心从系统中删除了数周或数月的工作成果&#xff1f; 如果是这样&#xff0c;那么请从您并不孤单这一事实中找到安慰。这种严重且后果严重的判断错误在世界各地的计算机…