什么是分布式
分布式系统是一个硬件或者软件组件分布在不同的网络计算机上,彼此之间通过消息传递进行通信和协调的系统。
分布式特点
分布性
分布式系统中的多台机器会在空间上随意分配,同时,机器的分布情况也会随时变动
对等性
分布式系统的计算机没有主从之分,即没有控制整个系统的主机,也没有被控制的从机,组成分布式系统的机器节点都是对等。副本是分布式系统最常见的概念,即分布式系统对数据和服务会提供一种冗余方式。
并发性
分布式系统中的多个节点并发操作共享资源。
缺乏全局时钟
故障总会发生
分布式系统中常见问题
通信异常
- 在分布式系统各节点之间需要通过网络进行通信,网络通信都会伴随着未知风险,网络光纤、路由器或是DNS硬件故障都会导致通信异常
- 分布式节点之间通信延迟
脑裂
当网络异常发生时,导致分布式系统中只有部分节点能够正常通信,我们俗称脑裂。
三态
分布式系统中每一次请求与响应都会出现以下三种状态:
- 成功
- 失败
-
超时
超时出现的情况有哪些?- 由于网路原因,请求消息没有被成功的发送到接收方,而是在发送过程中就出现了消息丢失的现象
- 请求消息被接收方成功接收,并进行了处理,但是在将响应反馈给发送方的过程中出现了异常导致消息丢失
节点故障
分布式系统中的机器节点出现宕机或者“僵死”的现象
分布式事务
数据库的事务特性
- 原子性
事务是一个原子操作单元,要么全部执行成功,要么全部不执行。 - 一致性
事务的执行不能破坏数据库数据的完整性和一致性,一个事务的执行之前和之后,数据库都必须处于一致性状态。也就是事务的执行结果必须使数据库从一个一致性状态到另外一个一致性状态。 - 持久性
事务一旦提交,它对数据库的数据状态的变更就是永久性的。 - 隔离性
不同的事务并发操作相同的数据时,每个事务都是相互隔离的。事务的隔离级别包括:
- 读未提交
如果有一个事务正在处理某一数据,并对其进行了更新操作,但是事务尚未提交,此时允许另外一个事务访问该数据。 - 读已提交
事务A和B同时操作某一数据,但是事务A只能获取事务B已提交的数据。 - 可重复读
在事务执行过程中,多次读取同一个数据时,其值都和事务开始时刻是一致的。 - 串行化
事务只能一个一个的执行,不能并发执行。
脏读、幻读、不可重复读理解:
- 脏读:指一个事务中访问到了另外一个事务未提交的数据
- 不可重复读:指在一个事务内根据同一个条件对数据进行多次查询,但是结果却不一致。产生的原因是其他事务对该数据就行了修改。
- 幻读:指同一个事务内多次查询返回的结果集不一样。比如同一个事务A内第一次查询时候有n条记录,但是第二次同等条件下查询却又n+1条记录,这就好像产生了幻觉。发生幻读的原因也是另外一个事务新增、删除或者修改了第一个事务结果集里面的数据。
事务隔离级别对比:
隔离级别 脏读 幻读 不可重复读 读未提交 存在 存在 不可以 读已提交 不存在 存在 不可以 可重复读 不存在 存在 可以 串行化 不存在 不存在 可以
分布式事务理论
CAP理论
CAP理论告诉我们:一个分布式系统中不可能同时满足一致性(C:Consistency)、可用性(A:Availability)和分区容错性(P:Partition tolerance),最多只能同时满足其中两项。
- 一致性:指数据在多个副本之间是否能够保持一致的特性。
- 可用性:指系统提供的服务必须一直处于可用状态。
- 分区容错性:分布式系统在遇到任何网络分区故障时,仍然能够保证对外提供满足一致性和可用性的服务,除非整个网络环境发生了故障。
CAP理论应用
放弃CAP理论 | 说明 |
---|---|
放弃C | 放弃一致性指是放弃数据的强一致性,保留数据的最终一致性。这样的系统无法保证数据的实时一致性,但能确保数据终态一致性。 |
放弃A | 在一段时间内系统无法对外提供服务,即系统不可用。 |
放弃P | 如果希望系统避免出现分区容错性问题,一种较为简单的做法是将所有的数据都放在一个分布式节点上。这样的做法虽然无法100%保证系统不出错,但至少不会碰到由于分区容错带来的负面影响。 |
BASE理论
BASE理论是 Basically Available(基本可用)、Soft State(软状态)和 Eventually Consistent(最终一致性)的简称。其核心思想是即使无法做到强一致性,但是每个应用都可以根据自身的特点,采用适当方式使系统达到最终一致性。
- 基本可用
- 允许响应时间上的损失。
- 允许部分功能上的损失,比如说降级。
- 弱状态
允许不同节点之间的数据同步有延迟 - 最终一致性
强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致性状态,而不需要实时保持一致性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。