分布式系统简述
在分布式系统里,最重要的事情,就是如何选择或设计适合的分布式算法,来解决一致性和可用性相关的问题
什么是分布式系统?
分布式系统是若干独立计算机的集合,这计算机对用户来说就像单个相关系统。
主要为了解决传统单体服务架构带来的各种问题,代码数量庞大,迭代测试维护困难,可能因为一处改动测试不到位造成整个服务瘫痪等问题,分布式系统就是将一个大的服务拆分成几十个甚至上百个微小的服务。如果把单体架构服务器比做篮子,那代码就是鸡蛋,不要让所有鸡蛋别装在一个篮子里,也方便大家分工开发,代码不在一个项目里,也不会冲突,最主要的是项目自己维护,多好,耦合性低,防止单点故障。
分布式系统有什么优缺点?
使用分布式就是为了解决传统架构各种问题,多人在一个下开发维护难,也不好控制容错能力。拆分成微服务问题就好办多了。主要从 4 个方面简单说下。
1、系统可用性提升
一个系统全年可用时间在 99.999%,5 个 9 的服务可用率在设计合理的分布式系统中并不是一个触不可及的数字。
传统的集中式计算或集中式存储在遇见单点故障时很容易造成整个服务不可用,分布式下的服务体系,单台机器有故障,不致于造成整个服务不可用。
2、系统并发能力提升
请求通过 Nginx 负载均衡被分发到不同的服务器上,运行同样代码的服务器可以有 1 台或 N 台,通常情况下会根据实际用户访问量随时增加机器,无论是数据库或者服务,都可以做到随时水平扩展。
比如双 11 活动,平时订单少 50 台机器就够了,到了 11 订单量剧增,服务器增加到 100 台,每台机器之间相互独立,互不影响。
3、系统容错能力提升
同一组服务分别部署在北京上海杭州,杭州的机房突发断电或者火灾,杭州机房的流量会被自动分发到北京和上海的机房,不影响用户使用。
4、低延迟
参考上一个图,北京的用户请求自动分发到北京,上海的用户请求被分发到上海,服务器会根据用户的 IP 选择距离自己最近的机房,降低网络延迟。
凡事具有两面性,分布式服务带来很多好处的同时肯定还会带来麻烦,主要从 3 方面考虑。
-
分布式服务依赖网络
服务器间通讯依赖网络,不可靠网络包括网络延时,丢包、中断、异步,一个完整的服务请求依赖一连串服务调用,任意一个服务节点网络出现问题,都可能造成本次请求失败。 -
维护成本高
传统单体式服务只需要维护一个站点就可以。
分布式服务系统被拆分成若干个小服务,服务从 1 变为几十个上百个服务后,增加运维成本。 -
一致性,可用性,分区容错性无法同时满足
这个是最主要的,这三种特性就是平时说的 CAP 定理,在分布式系统中,这三种特性最多只能满足两种,无法同时满足,需要根据实际情况去调整牺牲掉其中哪个。
关于 CAP,可以继续聊聊
CAP理论
CAP 理论是一个很好的思考框架,它对分布式系统的特性做了高度抽象,形成了三个指标:
- 一致性(Consistency)
- 可用性(Availability)
- 分区容错性(Partition Tolerance)
一致性
一致性说的是客户端的每次读操作,不管访问哪个节点,要么读到的都是同一份最新的数据,要么读取失败。 一致性强调的不是数据完整,而是各节点间的数据一致。也就是说,在客户端看来, 集群和单机在数据一致性上是一样的。
可用性
可用性说的是任何来自客户端的请求,不管访问哪个节点,都能得到响应数据,但不保证是 同一份最新数据。但不保证数据一致性
比如名字路由系统,如果仅仅因为发生了分布故障,节点中的 数据会不一致,集群就拒绝写入新的路由信息,之后,当客户端查询相关路由信息时,系统 就一直返回给客户端出错信息,那么相关的服务都将因为获取不到指定路由信息而不可用、 瘫痪,这可以说是灾难性的故障了。
分区容错性
当节点间出现任意数量的消息丢失或高延迟的时候,系统仍然可 以继续提供服务。也就是说,分布式系统在告诉访问本系统的客户端:不管我的内部出现什 么样的数据同步问题,我会一直运行,提供服务。这个指标,强调的是集群对分区故障的容 错能力。
因为分布式系统与单机系统不同,它涉及到多节点间的通讯和交互,节点间的分区故障是必 然发生的,所以我要提醒你,在分布式系统中分区容错性是必须要考虑的。
如何使用 CAP 理论
CAP 不可能三角说的是对于一个分布式系统而言,一致性(Consistency)、可用性 (Availability)、分区容错性(Partition Tolerance)3 个指标不可兼得,只能在 3 个指 标中选择 2 个。
我们都知道,只要有网络交互就一定会有延迟和数据丢失,而这种状况我们必须接受,还必 须保证系统不能挂掉。所以就像我上面提到的,节点间的分区故障是必然发生的。也就是 说,分区容错性(P)是前提,是必须要保证的。 现在就只剩下一致性(C)和可用性(A)可以选择了:要么选择一致性,保证数据绝对一 致;要么选择可用性,保证服务可用。
当选择了一致性(C)的时候,如果因为消息丢失、延迟过高发生了网络分区,部分节点 无法保证特定信息是最新的,那么这个时候,当集群节点接收到来自客户端的写请求时,因为无法保证所有节点都是最新信息,所以系统将返回写失败错误,也就是说集群 拒绝新数据写入。 当选择了可用性(A)的时候,系统将始终处理客户端的查询,返回特定信息,如果发生 了网络分区,一些节点将无法返回最新的特定信息,它们将返回自己当前的相对新的信息。
这里我想强调一点,大部分人对 CAP 理论有个误解,认为无论在什么情况下,分布式系统 都只能在 C 和 A 中选择 1 个。 其实,在不存在网络分区的情况下,也就是分布式系统正常运行时(这也是系统在绝大部分时候所处的状态),就是说在不需要 P 时,C 和 A 能够 同时保证。只有当发生分区故障的时候,也就是说需要 P 时,才会在 C 和 A 之间做出选 择。而且如果各节点数据不一致,影响到了系统运行或业务运行(也就是说会有负面的影 响),推荐选择 C,否则选 A。
CA 模型,在分布式系统中不存在。因为舍弃 P,意味着舍弃分布式系统,就比如单机版 关系型数据库 MySQL,如果 MySQL 要考虑主备或集群部署时,它必须考虑 P。 CP 模型,采用 CP 模型的分布式系统,一旦因为消息丢失、延迟过高发生了网络分区, 就影响用户的体验和业务的可用性。因为为了防止数据不一致,集群将拒绝新数据的写 入,典型的应用是 ZooKeeper,Etcd 和 HBase。 AP 模型,采用 AP 模型的分布式系统,实现了服务的高可用。用户访问系统的时候,都 能得到响应数据,不会出现响应错误,但当出现分区故障时,相同的读操作,访问不同 的节点,得到响应数据可能不一样。典型应用就比如 Cassandra 和 DynamoDB。