分布式系统定义
分布式系统是一个软件组件分布在不同的计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。
可能遇到的问题
(1)通信异常。光纤、路由器或是DNS服务器等各种通信设备都可能发生故障,这些故障将导致节点之间无法顺利完成一次网络通信。另外,节点之间消息的丢失和延时也是需要考虑的问题(单机内存访问延时在纳秒数量级,通常10ns左右,而正常的一次网络通信的延迟在0.1-1ms左右,相当于内存访问延时的100倍)。
(2)节点故障。分布式系统的服务器节点出现宕机或僵死等现象。
(3)网络分区(脑裂)。分区间的机器无法进行网络通信,即整个网络被分成了很多个孤立的区域。需要注意的是,组成一个分布式系统的每个节点的加入和退出都可以看作是一个特殊的网络分区。
分布式事务
分布式事务是指事务的参与者,支持事务的服务器,资源服务器以及事务管理器分别位于分布式系统的不同节点之上。
通常一个分布式事务中会涉及对多个数据源或业务系统的操作。
搭建稳定可靠的分布式系统,如何处理分布式事务是无法避开的话题。
在单机的数据库上事务需要满足ACID的特性,而多机的分布式事务依然需要满足。
理论:CAP、BASE、ACID
CAP
任何一个分布式系统最多只能满足强一致性、可用性、分区容错性中的两项。
- 强一致性(Consistensy):任意时刻,从所有节点获取的数据都是一样的。同一时间点,你在节点A中获取到的值与在节点B中获取到的值应该都是一样的。(注意这里的一致性和关系型数据库需满足的ACID里的一致性不一样,一个是数据的一致性,一个是操作的一致性,细细品味)
- 可用性(Availability):对于客户端的请求能够在限定时间内完成。
- 分区容错性(Partition tolerance):只要是分布式系统,就不可避免出现网络分区的现象。分区容错性就是在系统出现网络分区时仍然保证提供满足一致性和可用性的服务,这一点对于分布式系统来说是必不可少的。
BASE
BASE理论则是在CAP理论上更进一步,分区容错性是必须满足的,然后在一致性和可用性之间进行权衡。
- 基本可用(Basically Available):在大多数时间内系统处于可用状态,允许偶尔的失败。
- 软状态(Soft Stat):即使没有数据更新,系统的状态也可能会变化,系统处于有状态和无状态的一种中间状态。
- 最终一致性(Eventual consistency):在有数据更新之后,最终会达到一致性的状态。
ACID
关系型数据库必须满足ACID特性。
- 原子性(Atomcity):一个事务要么全部执行,要么全部不执行。
- 一致性(Consistency):事务从开始到结束,数据库始终保持一致性的状态。
- 隔离性(Isolation):多个事务的执行互不影响。
- 持续性(Duration):事务在执行成功之后对数据的更新落入磁盘,这种更新是持久的。
一致性模型分类
-
强一致性:同一时间点,你在节点A中获取到的值与在节点B中获取到的值应该都是一样的是。
-
弱一致性:不能满足强一致性的情形都可以称为弱一致性。
一致性协议
一致性协议要解决的是在可能发生机器宕机或网络异常的分布式系统中,快速且正确地在集群内部对某个数据的值达成一致,并且保证不论发生何种异常,都不会破坏整个系统的一致性。
三种常见分布式一致性协议:
- 二阶段提交协议(2PC)
- 三阶段提交协议(3PC)
- Paxos算法
- Raft算法
大数据分片与路由
传统关系型数据库系统为了支持更多的数据,往往采用纵向扩展的方式,通过改善单机硬件资源来解决问题(发展下去就是大型主机)。而目前主流的大数据存储与计算系统采用横向扩展的方式来支持系统可扩展性,即通过增加机器数量来获得水平扩展能力。
因此,对于待存储处理的海量数据,则需要进行数据分片(Shard/Partition)来将数据切分并分配到各个机器中去,数据分片后,如何能找到某条记录的存储位置就称为数据路由(Routing)。
为了保证数据的可用性,当某个机器故障后依然可以获取数据,我们需要对分片进行复制,通常一个分片有多个副本。同时,多副本的还可以提高读操作的并发性,任何一个副本都可以响应客户端的读操作。
分片与路由抽象模型
图片展示了一个抽象的数据分片与路由通用模型,可以将其看作是一个二级映射关系。第一级是key-partion映射,将数据记录映射到数据分片,即一个分片包含多条记录;第二级映射是partion-machine映射,其将数据分片映射到物理机器上,即一台物理机容纳多个数据分片。
两种常见分片方式
- 哈希分片
- 范围分片
哈希分片与范围分片策略都可以映射到那个抽象模型上来。哈希分片与范围分片的区别就是,哈希分片只能根据某个记录的主键(key)获得记录内容,而无法指定主键范围一次性读取多条满足条件的记录。
副本更新策略
- 同时更新:所有副本同时接收更新请求。
- 主从式更新:所有对数据的更新操作都得先提交到主副本,再由主副本通知从副本进行数据更新。
- 任意节点更新:数据更新请求可能发送给多副本中的任意一个节点,再由这个节点来负责通知其他副本进行数据更新。
幂等性
反复执行同一操作与只执行一次操作的效果相同。