典型的分布式系统应用
搜索引擎,索引整个互联网(谷歌,百度)
新闻网站(新浪,网易,搜狐)
电子邮件
聊天通信(腾讯)
博客,微博,社会关系网络
有的这些互联网应用都有一个突出的特点:规模极其庞大
典型的分布式系统所面临的 问题以及处理方法
要保证一个分布式系统能够正常地运行是十分困难的,因此,有一个原则就是,如果集中的方式能够解决问题,千万不要使用分布式的方式去解决。理解一个分布式系统往往需要从以下的几个方面去着手:
1.可靠性
2.扩展性
3.安全性
4.一致性
分布式系统需要考虑可靠性
系统部分失效问题:由于分布式系统规模庞大,在其中的部分模块出现问题的时候,需要对这部分错误进行屏蔽,允许出现性能降级,但不能造成整个系统的不可用
数据可恢复问题:在某些节点出现错误的时候,需要将错误节点的工作立刻由其它正常节点接管
节点可恢复:节点会出现暂时的错误下线,但是需要具有可恢复的功能,重新加入到整个集群系统中
分布式系统的一致性
并发访问:
并发访问本质上是非确定性的,程序执行的结果在多次执行中会产生不同的结果,在这样的并发执行,或者在系统的某些模块出现错误的时候整个系统不应当出现外界可见的不一致性(如不同的客户端访问相同的数据的时候出现不同的结果的情况)
副本的一致性:
为了保证数据的可靠性,往往将数据存放在不同的节点上,这些节点都有可能在地理上分布。一致性的要求即相同的数据在不同的节点上要求完全一致。由于会出现各种错误情况,这在理论上是不可能的,需要理解在不同情况下的出错模型
分布式系统的安全性问题
只允许有访问权限的用户访问,没有权限的用户不应当进行数据的访问
数据加密方式存储在系统中会有密钥管理的问题
在分布式环境中会出现比单机环境中更多的安全性问题,例如会同时发生对多个机器个攻击,会出现合作攻击的情况.
分布式系统中的出错情况举例
单机编程与分布式编程的最大区别就在于在分布式环境下必须要处理各个组成部分出错的情况
下面就看一下在分布式环境下会出什么样的错误
系统的组成部分出现错误
系统的某一个或者几个模块出现错误,如某一部分的节点或者某一部分的网络停止工作
数据出现错误
数据包在通过各个路由器的时候发生丢弃(路由器内部缓存不够)
在接收端出现缓冲区满的情况而丢弃数据包
网络上的或者从磁盘读取的数据出现了错误的情况
分布式系统中出现错误的情况举例
网络错误也是一类最为常见的出错情况
网络断线:某一部分节点无法与系统中的其它节点发生联系
网络分区:系统由于网络的问题被分为多个部分,各个部分不能连通
网络不稳定:由于物理原因,或者由于配置原因,往往会发生网络时断时续的情况
网络数据传输的问题:数据可能出错,数据可能重传,数据传输不保证顺序,数据可能丢失,数据可能被分割传输
分布式系统缺乏统一的时钟
在分布式系统中,没有统一的时钟可以参考,时序可能会发生混乱,各个组成部分的本地时钟不同步,会打乱因果关系
由于异步环境下消息传输的时间没有上届,因此,消息无响应时,无法区分远程节点是出错,还是数据包在网络上丢失,或者实际延迟过长
分布式系统的时钟不一致性
计算机B收到消息的时间还早于计算机A发出消息的时间,这会造成因果性的错误
拜占庭错误
分布式系统中的错误不可预测,并且存在恶意的用户
拜占庭错误涵盖了最为广泛的错误情况,即在系统中的组成部分有可能出现任意的错误,包括出现故意的错误来阻止系统的正常运行
即使是在拜占庭错误的情况下,只要系统中具有足够多的正确节点,整个系统的正常节点相互合作,还是可以进行正常工作
拜占庭将军问题
拜占庭位于现在土耳其的伊斯坦布尔,是东罗马帝国的首都
由于当时拜占庭罗马帝国国土辽阔,为了防御目的,因此每个军队都分隔很远,将军与将军之间只能靠信差传消息
在战争的时候,拜占庭军队内所有将军和副官必需达成一致的共识,决定是否有赢的机会才去攻打敌人的阵营
军队可能有叛徒和敌军间谍,左右将军们的决定,扰乱军队整体的秩序。在进行共识时,结果并不代表大多数人的意见
这时候,在已知有成员谋反的情况下,其余忠诚的将军在不受叛徒的影响下如何达成一致的协议
拜占庭问题在分布式系统中的意义
在分布式计算上,不同的计算机透过讯息交换,尝试达成共识(即一致性)
系统上的成员计算机 可能因系统错误并交换错的讯息(并且会尝试进行共同破坏),导致影响最终的系统一致性
拜占庭将军问题就根据错误计算机的数量,寻找可能的解决办法
拜占庭问题的解:假设:N为计算机总数;F为有问题(坏的或者有恶意的)计算机总数。信息在计算机间互相交换后,各计算机列出所有得到的信息,以大多数的结果作为解决办法
在 N ≥ 3F + 1 的情况下一致性是可能解决。
系统遭受恶意攻击
除了上述的拜占庭错误之外,系统还会出现更为恶劣的情况,即网络的攻击者通过系统的漏洞,将恶意代码注入到系统的模块中。
这种情况会将一个正常工作的节点更改为异常节点,会最终阻止整个系统正常运行
我们是否能够构建完美的分布式系统?
什么叫完美?
CAP:数据是一致的,整个系统具有很高的可用性,并且,能够容忍网络的分区错误。
C: Consistency 一致性
A: Availability 可用性(指的是快速获取数据)
P: Tolerance of network Partition 分区容忍性(分布式)
10多年前,Eric Brewer教授指出了著名的CAP理论,后来Seth Gilbert 和 Nancy lynch两人证明了CAP理论的正确性。CAP理论告诉我们,一个分布式系统不可能满足一致性,可用性和分区容错性这三个需求,最多只能同时满足两个。
CAP定理
简要历史
Eric Brewer 1998年提出假设
2000年被学术界了解
2002年被证明
CAP三选二
1. 数据一致性(C)
所有的副本都是最新的
2. 系统高可用性(A)
系统总是可写
3. 容忍网络隔离(P)
允许网络通讯出现故障,不论是短暂延时或长时间故障
容忍网络隔离意味着系统横向扩展性增强
容忍网络隔离是必选项
图:
CAP定理图解 (CA)
CAP定理图解(AP)
CAP定理图解 (CP)
2012年重新认识CAP定理
CAP每个属性是一个范围
强一致性 -> 最终一致性
系统可用性从0%~100%,操作可用性选择(读或写)
网络隔离以系统不同部分的视角来看都是不一样的
C和A的选择灵活可变
C和A的选择决策在不同的应用、不同的操作、甚至系统不同时间,可以做出不同的选择。
网络隔离时:
牺牲某些可用性;
修复一致性、补偿不一致的损害、或控制风险