一、分布式系统定义
《分布式系统 概述与设计》 一书中将分布式系统定义为:硬件或软件组件分布在联网的计算机上,组件之间通过传递消息进行通讯和动作协调的系统。
以上定义过于拗口,为了便于理解,我把分布系统的需要关注的重点加粗,口语化翻译如下:
分布式系统是由多个节点组成的系统,节点间通过相互通讯与协作对外提供透明且独立的服务。
- 思考题:按照以上定义哪些不是分布式系统: nginx 负载 、mysql 、zookeeper 、qconf 、k8s 、rabbitmq 、es、tidb?
我的理解,欢迎讨论:nginx多节点之间不需要通讯,所以不是分布式系统;qconf仅是客户端所以也不是分布式系统;mysql主节点只能单机(主主需要外部业务系统配合),所以也不是分布式系统。
为了方便后续的讨论,我们定义一个功能极简的系统XBox,Xbox的功能很简单,提供了一个变量的读写。支持两个指令:
GET :获取值,无参数
SET X : 设置值,参数为需要设置的值
二、分布式系统的特性
2.1 时间不确定性
主要体现在两个方面
多节点之间的消息延迟无法忽略;
多节点的物理时间无法做到完全一致;
如下图,A同时向B和C发送的SET 1指令,B在收到后给A和C同时发送SET 2指令,由于A和C之间的网络抖动可能导致C先收到SET 2指令; 另外,A和C收到SET2的时间可能同时也可能有先后,并没有一个物理时钟可以定义出先后顺序。
2.2 三态
对于单机系统,一条指令的执行,要么成功,要么失败,不会出现第三种情况。
但是分布式系统因为存在网络传输存在超时或中断,所以,可能会存在第三种状态:不确定成功或者失败。
2.3 可扩展
单机系统遇到瓶性能瓶颈的时候,通常会通过增加硬件的方式扩展升级。但是单机的扩展存在极限,但是硬件的性能总是会有瓶颈,提升配置的成本也会越来越高。
分布式系统通过多个节点,把大的计算拆分为小的计算,把大的存储拆分为小的存储来达到可以扩展的目的
三、深入理解CAP
CAP是分布式最基础的理论之一。跟很多同学聊过对CAP的理解,有不少同学仅仅停留在表面,似懂非懂。希望看完本文能够理解CAP真正的含义。
首先,先详细解释一下CAP三个字母的含义,我把关键性的地方加粗:
一致性(consistency)是指分布式系统在同一个时刻,客户端读到的内容都必须保持一致。
ps:并不需要分布式系统内所有节点的内容一致。一致性是一个对外的概念。 比如XBox系统,A节点记录了一个所有节点共识的值X=4,和一个即将要改变的值X=5。B节点记录了一个所有节点共识的值X=4,和一个即将要改变的值X=6。虽然A\B节点不一致,但是对外都返回X=4,所以是满足一致性的。
可用性(Availability),可用性就是指服务必须返回正常的数据,对应到http就是,服务不能返回500+。
ps:可用性可以对外的概念
分区容错性(Partition Tolerance)是指允许多个(或两组或几组)节点之间是的内部通讯中断或者通讯异常。并不是说客户端到某一个节点之间的容错。
ps:分区容错性是对内的概念。ABC三个节点中AB在一个机房,C在另外一个机房。机房间网络中断了,就产生了两个分区;但是ABC正常,客户端Client1能访问到ABC,客户端Client2与ABC网络中断,不叫分区。
本文的一致性都讲的是强一致
回到CAP原理本身定义:CAP三个特性不能同时满足。
做个简单的证明:
XBox如果具备可用性和一致性,那么
可用性要求三个节点不论在什么情况下都不能拒绝访问,必须给客户端返回X的值。
一致性,要求返回给客户端的值要完全一样。
那么,满足这两个要求的前提就是三个节点的网络不能中断通讯,也就是不能容忍分区。
同理可以证明其他两种情况。
思考题:一个不需要信息交互的多节点系统,是不是能同时满足CAP?
我的理解,不需要信息交互的系统,无状态,也就不存在一致性的讨论了,接受反驳
对于分布式系统而言,分区容错是本身特性,是天然需要满足的。分布式系统需要在可用性和一致性之前做取舍。
分区容错性 ≈ 多态 : 因为多态是分布式系统的特性,所以分布式系统必然需要允许分区的出现。