分布式系统------概述

来源:互联网 发布:linux设置ftp目录权限 编辑:程序博客网 时间:2024/06/01 08:26

今天来聊聊分布式系统常常提及的一些基本概念

ACID

数据库事务满足的4个特性,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

原子性:一个事务最终只能有2个状态,

  • 全部成功执行
  • 全部不执行

一致性事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。某些维护一致性的责任由应用程序开发人员承担,他们必须确保应用程序已强制所有已知的完整性约束。例如,当开发用于转帐的应用程序时,应避免在转帐过程中任意移动小数点。 

隔离性:并发的情况下,并发的事务是相互隔离的,并发的事务不能相互干扰

在标准sql规范中,定义了四种事务隔离级别,未授权读取、授权读取、可重复读取、串行化

下图中,事务A将数据从1增加到10,事务C将数据从11增加到20,事务B在此期间读取数据,不同隔离级别,其获取的结果各不相同。

未授权读取:也叫读未提交,一个事务正在处理某个数据,但事务尚未完成,尚未提交,与此同时,另一个事务能够访问这个数据。如下图所示,事务B可以读取到1~20的任意一个值

授权读取:读以提交,只能读取已经提交的数据。所以下图,事务B中只能读取到1/10/20,但是不能读取到中间数据。注意,在同一个事务期间,其读到的值可能是不同的1/10/20。

可重复读取:保证在一个事务处理过程中,多次读取同一个数据时,其值都和事务开始时刻是一致的。这个不会出现授权读取那种一个事务处理中获取数据的结果不同的情况。但是如果在不同的时间段,执行事务B,获取的值,可能会不同,第一次执行事务B,始终获取到1,第二次可能始终获取到20。

串行化:最严格的事务隔离。即要求所有事务都被串行执行,只能一个接一个执行,不能并行执行。



持久性:事务一旦提交,对数据的变更应该是永久的。即使发生系统崩溃或宕机,只要数据库能够重启,应该恢复到事务成功结束时的状态。

悲观锁和乐观锁

参考:http://www.cnblogs.com/wang-meng/p/5506943.html


异常

服务器宕机:一般服务器宕机,将丢失内存数据,所以需要保存一些系统必需数据到固定磁盘

网络异常:设计分布式系统和单机最大的不同就是有网络,一个基本原则就是,网络永远是不靠谱的,只有收到对方回复才能确定发送成功。

磁盘故障:磁盘损坏和磁盘数据错误,前者要求分布式系统需要对数据做分布式备份,一份数据需要在其它N多服务器上做数据备份。儿对于后者则需要采用校验和来确定。


超时

分布式系统,一个远程操作的结果有3种状态,success、failed、timeout。对于timeout不能简单的认为success或failed,需要根据具体情况做具体处理。


CAP理论

Consistency(一致性):即数据一致性,简单的说,就是数据复制到了N台机器,如果有更新,要N机器的数据是一起更新的。
Availability(可用性):好的响应性能,一个请求服务器应该在有限的时间内给出响应,可用性不好表现为响应时间严重加大、直接给出错误结果或者没有响应。
Partition tolerance(分区容错性):也叫分区容忍性。一个分布式系统,多个节点可能分布在不同的机架或不同的机房。简单地可理解为是节点的可扩展性。

定理:任何分布式系统只可同时满足二点,没法三者兼顾。


一致性

分布式系统,一致性的要求是非常复杂的。

强一致性:假如A用户写入数据,需要保证A、B、C用户在后续不同服务器的读操作均读到最新值。

弱一致性:假如A用户写入数据,不需要保证A、B、C用户在后续不同服务器的读操作均读到最新值。

最终一致性:

  1. 读写一致性:针对用户A要保证后续读要读到最新数据
  2. 会话一致性:保证本次会话后续读读到最新数据
  3. 单调读一致性:如果A读到某个值,要保证A后续读取不能读到较新的值
  4. 单调写一致性:A的写操作顺序完成,要保证不同节点副本写操作也是顺序完成

一个分布式系统,我们一般会保证其A和P,而C,我们一般保证其为最终一致性,至于是哪种最终一致性,需要根据业务特性来设计。


衡量指标

性能、可用性、一致性、扩展性。


数据分布

哈希分布,一致性哈希,由于哈希破坏了数据的有序性,不能支持顺序扫描,如Amazon的Dynamo。

顺序分布,数据分布在分布式表格系统比较常见,如google的bigtable。


复制

强同步协议:只有主和备都同时写完之后,才会给客户端返回success。一致性保证强。

异步复制:只要主写完,就返回给客户端success,其它备由主后台运行复制可能会丢失数据。

复制协议:

  • 主副本的复制协议,主节点可读可写、备节点可读不可写。
  • 基于写多个存储节点的复制协议,比如Dynamo,N副本数量、W写副本数量、R读副本数量,NWR协议不再区分主备,只要R+W>N,可以保证读到的副本中至少一个包含最新的数据,不过由于多个W,其写入顺序会不一致,可能导致读取数据时出现冲突,不建议使用。

仔细分析,就会发现这里有个矛盾体,一致性和可用性,如果采用强同步机制,保证了一致性,但是一旦网络故障或备机宕机,写操作堵塞,可用性无法保证,如果采用异步复制,丢失数据的可能性增大,一致性保证不了,所以二者只能取其一,设计时需要折中处理。


故障

故障检测,最常用的手段是心跳包或租约机制


0 0