【分布式系统设计】基础概念

在设计分布式系统时,通常要考虑到 数据的一致性(consistency)系统的可用性(availability)、以及分区容忍性( partition tolerance)。即CAP定理

概念

我们知道,分布式系统有多个节点。

数据一致性是指, 对每个节点,在同一时刻,读写的数据是相同的。

举例:用户User1的账户余额是100,在节点Node1我们更改了User1的账户余额,改成了200,此时在节点Node1读User1余额一定是200。如果保证了一致性,那么

在节点Node2、Node3等其他节点,读到User1的余额都是200。

系统的可用性:即使分布式系统中的一个节点挂掉了,对于请求,依然能够响应。

分区容忍性:即使系统中出现了 一个节点与其他节点无法通信的情况,系统依然能够工作。

举例:分布式系统中两节点间无法传递数据或数据丢失,此时这个分布式系统依然可以工作。

通过了解以上概念,我们知道,分区容忍性是要保证的。当系统中的出现节点Node1和Node2无法同步数据的情况时,数据一致性和可用性是无法同时保证的,需要

有取舍。

保证数据的一致性以及分区容忍性(CP):所有节点数据一致,当 出现 一个节点与其他节点失去联系,此时系统服务不可用。

保证系统的可用性以及分区容忍性(AP):即便出现一个节点与其他节点无法通信的情况,该节点也提供服务,此时不保证改节点的数据与其他节点的数据一致;

当该节点可以通信时,同步数据。

举例

假设我们的服务是博客系统。

最初系统服务的访问量并不大,单个服务节点足以支撑。

随着用户数量的发展,单个节点支撑不住了,于是考虑做水平扩展。我们的服务节点由一个扩展到了两个,并且,每个服务节点都保存一份数据。由于我们有两个服务

节点,所以在这两个节点前,增加了Load Balancer用于做调度,如图1

                  

                             图1

对于读请求不做描述。

对于写请求,过程如下

1. 请求到达Load Balancer

2. Load Balancer做判断,将请求分配给某一个节点,如Node1

3. Node1执行写操作。如果此时返回处理结果给客户端,那么 假如有相同的请求,但是落到了Node2时,数据时不一致的,所以我们要做数据同步。我们先做

一个假设,数据同步一定成功且耗时很短很短

我们可以有两种方式同步。

第一种,直到Node2的数据同步了,Node1才返回。第二种,Node1执行同步数据操作,不等待同步完成,立即返回结果。

现在假设Node1和Node2的通信断开了,如图2

          

                          图2

无论以上哪种同步方式都行不通,那么我们要做出抉择,是要保证数据的一致性好,还是保证可用性。因为我们的服务是博客服务,即便数据暂时性地不一致也是可以

忍受的,并且,如果长时间用户得不到内容会导致用户流失,所以我们倾向保证可用性。即 修改第三部处理,当Node1和Node2的通信断开时,暂时不做数据同步,

直接返回结果。

这种处理方式,当通信断开时,Node1和Node2的数据在处理写请求后是不一致的。

现在假设Node1和Node2的数据同步过程会耗时会很长。我们依旧倾向保证可用性。因为第一种同步方法会让用户等待较长的时间,我们采用第二种同步方法。

第二种方法,会保证经过一段时间后,数据是一致的。这是所谓的最终一致性

下面,我们再考虑这样的问题,依旧假设Node1和Node2的数据同步过程会耗时很长。来了一个写请求,Load balancer将其分配给了Node1;很快又来了一个写请求,Load Balancer将其分配给了Node2。此时数据该怎么同步呢?假如修改的都是同一个文章ID所对应的内容呢?

可以考虑将Node1 和 Node2 的同步请求加入到一个公共的队列中。即 节点在进行写操作后,将同步操作加入到公共队列中,然后 节点返回结果给用户。

我们可以实时地消费这个队列,也可以定时地消费这个队列。

消费这个队列时,将数据写到Node1和Node2中,如图3

              

                                 图3

这个方案依旧不够好,因为多写了一次数据。

假如写数据的操作很耗时,为了避免多写一次,我们也可以在Node1和Node2上设置缓存(偏向可用性),即写时 不写数据而是写缓存。但设置缓存又会引发Node1

与Node2缓存不一致的情况发生(需要处理数据一致性)。

好了,偏向可用性的讨论先到此为止。

假设我们做的系统不是博客系统是交易系统

我们的系统需要的是强一致性。即无论从Node1还是Node2读写数据,得到的结果都是一样的。因为是交易系统,所以需要做到的是数据是强一致性的,即每时每刻

数据一致。

假设写请求到了Node1,此时Node1需要写数据并将数据同步到Node2。假如Node1与Node2的通信断开了,那么我们应该给用户返回一个请等待的页面。此时数据既没有

写入Node1也没有写入Node2。

假如通信没断开的话,怎样保证写入了Node1数据,也会写入Node2数据呢?

可以使用两段提交的算法。两段提交需要 一个协调者,比如Node3,而所有待更新节点数据作为参与者。

第一阶段,请求阶段:协调者Node3 请求 Node1和Node2是否对User1的账户进行更新,参与者Node1 回复可以更新,参与者Node2 回复不可以更新(比如正在有

读操作)

第二阶段,提交阶段:只有所有参与者都同意才会提交事务。Node3根据Node1和Node2的回复,做出是否提交事务的判断,不提交。

参考

http://ksat.me/a-plain-english-introduction-to-cap-theorem/

https://stackoverflow.com/questions/12346326/cap-theorem-availability-and-partition-tolerance

http://www.importnew.com/20633.html

原文地址:https://www.cnblogs.com/ifkite/p/8151210.html

时间: 2024-08-30 14:20:43

【分布式系统设计】基础概念的相关文章

WCF分布式开发步步为赢(1):WCF分布式框架基础概念

众所周知,系统间的低耦合一直是大型企业应用系统集成追寻的目标,SOA面向服务架构的出现为我们的如何利用现有企业系统资源进行企业ERP系统设计和实现提供了重要的参考原则.SOA如此炙手可热,各大厂商都推出了自己的中间件产品,比如Oracle Fusion和 SAP NetWeaver,IBM.BEA等企业也推出了自己基于SOA的解决方案.基于J2EE平台的SOA架构设计中的一个重要概念就是EJB企业服务总线,作用是实现各个系统的数据交互.而.NET平台上,WCF就是微软为各个系统的数据交互提供通讯

分布式学习——基础概念篇

概述 最近这段时间一直在看分布式有关的东西,但是关于分布式自己还是不能很好的理解,所以本文对分布式基础概念进行下学习. 分布式处理 首先先了解一下分布式处理,分布式处理和集中式处理正好是相反的的体系架构,集中传输集中到式处理顾名思义就是将所有的信息都一个统一的信息中心进行处理:分布式处理就是将不同地点的,或具有不同功能的,或拥有不同数据的多台计算机利用通信网络连接起来,让各个计算机各自承担同一个工作任务的不同部分,在控制中心的管理下,同时运行,共同完成同一个工作任务. 提到分布式处理就不能不提到

分布式块设备drbd基础概念及、原理及其主从模式配置

一.drbd基础 1.drbd基础概念 drbd(全称为Distributed Replicated Block Device,简称drbd)分布式块设备复制,说白了就是在不同节点上两个相同大小的设备块级别之间的数据同步镜像.drbd是由内核模块和相关脚本而构成,用以构建高可用性的集群.在高可用(HA)解决方案中使用drbd的功能,可以代替使用一个共享盘阵存储设备.因为数据同时存在于本地主机和远程主机上,在遇到需要切换的时候,远程主机只需要使用它上面的那份备份数据,就可以继续提供服务了. 2.d

分布式强化学习基础概念(Distributional RL )

分布式强化学习基础概念(Distributional RL) from: https://mtomassoli.github.io/2017/12/08/distributional_rl/ 1. Q-learning 在 Q-learning 中,我们想要优化如下的 loss: Distributional RL 的主要思想是:to work directly with the full distribution of the return rather than with its expec

5分钟搞懂分布式基础概念

01.分布式基础概念 1.微服务 拒绝大型单体应用,基于业务边界进行服务微化拆分,各个服务独立部署运行 2.集群.分布式.节点 集群 是一种物理形态 将几台服务器集中在一起,实现同一业务 分布式 是一种工作方式 若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统 将不同的业务分布在不同的地方 节点 集群中的一个服务器 3.远程调用 分布式系统中,各个服务可能处于不同主机,但是服务之间不可避免的需要互相调用,我们称为远程调用. SpringCloud中使用HTTP+JSON的方式完成远程

01. SpringCloud实战项目-五分钟搞懂分布式基础概念

SpringCloud实战项目全套学习教程连载中 PassJava 学习教程 简介 PassJava-Learning项目是PassJava(佳必过)项目的学习教程.对架构.业务.技术要点进行讲解. PassJava 是一款Java面试刷题的开源系统,可以用零碎时间利用小程序查看常见面试题,夯实Java基础. PassJava 项目可以教会你如何搭建SpringBoot项目,Spring Cloud项目 采用流行的技术,如 SpringBoot.MyBatis.Redis. MySql. Mon

分布式事务—基础篇

1.基础概念 1.1.什么是事务 什么是事务?举个生活中的例子:你去小卖铺买东西,“一手交钱,一手交货”就是一个事务的例子,交钱和交货必须全部成功,事务才算成功,任一个活动失败,事务将撤销所有已成功的活动. 明白上述例子,再来看事务的定义: 事务可以看做是一次大的活动,它由不同的小活动组成,这些活动要么全部成功,要么全部失败. 1.2.本地事务 在计算机系统中,更多的是通过关系型数据库来控制事务,这是利用数据库本身的事务特性来实现的,因此叫数据库事务,由于应用主要靠关系数据库来控制事务,而数据库

关系型数据库常用基础概念知识归纳

声明:我的文章都是只挑主要的写,次要细节太多,归纳就没意义了,同时归纳主要是给自己看的, 而且基本都是凭自己的一些记忆和理解即时写的.不一定对和全(但大多是一些需要理解的概念),请各位看管见谅! 数据库设计篇 1.范式 A.1范式,原子性,即列不可分 B.2范式,完全依赖,即有个主键唯一区分 C.3范式,不能传递依赖,即表中不能还有其他表的非主键信息 2.模型 A.概念模型,即ER图等 B.逻辑模型,即建逻辑表 C.物理模型,即生成物理表 事务 1.四大特性, A.原子,要么..要么.. B.隔

分布式系统设计系列 -- 基本原理及高可用策略

转自:http://blog.csdn.net/gugemichael/article/details/36688043 ==> 分布式系统中的概念==> 分布式系统与单节点的不同==> 分布式系统特性==> 分布式系统设计策略==> 分布式系统设计实践 [分布式系统中的概念] 三元组 其实,分布式系统说白了,就是很多机器组成的集群,靠彼此之间的网络通信,担当的角色可能不同,共同完成同一个事情的系统.如果按"实体"来划分的话,就是如下这几种:       

LVS 实验笔记1 一些基础概念

基础概念 rsync 同步软件 效率不高 inotify 通知 三种集群: LB: load balance 提高服务器的并发能力 HA: 高可用 high availability不会因为一台服务器宕机导致服务不可用 HP:high perfomence  高性能计算集群 并行处理集群 分布式文件系统 将大任务切割为小任务,分别进行处理 health check:健康检查 NFS:net filesystem 共享存储设备 DAS:直接附加存储 块级别交换数据 直接连到多态主机,性能好,但是要