到底什么是分布式系统?你须要了解这些

摘要:什么是分布式系统?为何要用分布式系统?分布式系统如何分布?这些你知道吗?

小引

分布式系统是一个古老而宽泛的话题,而近几年由于 “大数据” 概念的兴起,又焕发出了新的青春与活力。本文将会经过对以下几个问题展开谈一下分布式系统:git

什么是分布式系统?算法

为何要用分布式系统?sql

分布式系统设计推演数据库

CAP定理是什么?segmentfault

分布式系统如何进行分布?安全

分布式应用一般使用的架构类型哪些?服务器

分布式系统的优缺点有哪些?网络

  1. 什么是分布式系统?

简单的来讲,一个分布式系统是一组计算机系统一块儿工做,在终端用户看来,就像一台计算机在工做同样架构

这组一块儿工做的计算机,拥有共享的状态,他们同时运行,独立机器的故障不会影响整个系统的正常运行。异步

咱们如今举个例子,传统的数据库是存储在一台机器的文件系统上的。每当咱们取出或者插入信息的时候,咱们直接和那台机器进行交互。

那么如今咱们把这个传统的数据库设计成分布式数据库。假设咱们使用了三台机器来构建这台分布式数据库,咱们追求的结果是,在机器1上插入一条记录,须要在机器3上能够返回那条记录,固然了,机器1和2也要可以返回这条记录

  1. 为何要用分布式系统?

管理分布式系统是一个很是复杂的话题,里面充满了陷阱和地雷。部署维护和调试分布式系统也是很是头疼的一件事情,那为何还要去作呢?

分布式系统最大的好处就是可以让你横向的扩展系统。

之前面提到的单一数据库为例,可以处理更多流量的惟一方式就是升级数据库运行的硬件,这就是纵向扩展。

纵向扩展的是有局限性的。当到了必定程度之后,咱们会发现即便最好的硬件,也不可以知足当前流量的需求

横向扩展是指经过增长更多的机器来提高整个系统的性能,而不是靠升级单台计算机的硬件

从价格上来讲,横向扩展相比纵向扩展更容易控制。

最根本的问题是纵向扩展有很强的局限性,达到最新硬件的能力之后,仍是没法知足中等或者大型工做负载的技术要求。

横向扩展则没有这个限制,它没有上限,每当性能降低的时候,你就须要增长一台机器,这样理论上讲能够达到无限大的工做负载支持

除此以外,在容错和低延迟上也有不少优点容错性是指你的分布式系统的某个节点出现错误之后,并不会致使整个系统的瘫痪。而单机系统出错之后,可能会致使整个系统的崩溃。

低延迟是经过在不一样的物理位置部署不一样的机器,经过就近获取的原则下降访问的延迟时间。

上面讨论了分布式系统的种种好处,可是咱们必需要清楚设计和运行分布式系统并不是易事。

  1. 分布式系统设计推演

咱们先讲一个场景,咱们现有的网络应用变得愈来愈流行,服务的人数也愈来愈多,致使咱们的应用程序每秒收到的请求,远远超过可以正常处理的数量。这会致使应用程序性能降低明显,用户也会注意到这一点。

那咱们下面就来扩展一下咱们的应用程序来知足更高的要求。通常来讲咱们读取信息的频率要远远超过插入或者修改的频率

下面咱们使用主从复制策略来实现扩展系统。咱们能够建立两个新的数据库服务器,他们与主服务器同步。用户业务对这两个新的数据库只能读取。每次当向主数据库插入和修改信息时,都会异步的通知副本数据库进行更新变化

在这一步上咱们已经有了三倍于原来系统读取数据的性能支持。可是这里有一个问题,在数据库事务的设计当中,咱们遵循ACID原则。可是在咱们同时对其余两个数据库进行数据更新的时候,咱们有一个时间窗口失去了一致性原则。若是在这个时间窗口内对两个新的数据库进行查询,可能查不到数据。这个时候若是同步这三个数据库的数据,就会影响写操做的性能

这是咱们在设计分布式系统的时候,不得不承受的一些代价

上面的主从复制策略解决了用户读取性能方面的需求,可是当数据量达到必定程度,一台机子上没法存放的时候,咱们须要扩展写操做性能。要解决这样的问题,咱们可使用分区技术。分区技术是指根据特定的算法,好比用户名a到z做为不一样的分区,分别指向不一样的数据库写入,每一个写入数据库会有若干读取的从数据库进行同步提高读取性能。

固然,这样使得整套系统变得更加复杂。最重要的难点是分区算法。大家试想一下,若是c开头的用户名比其余开头的用户名要多不少,这会致使c区的数据量很是庞大,相应地,对于c区的请求也会远远大于其余区。此时c区成为热点。要避免热点,须要对c区进行拆分。此时要进行共享数据就会变得很是昂贵,甚至可能致使停机

若是一切都很理想,那咱们就拥有了 n倍的写入流量,n是分区的数目

固然这里也存在一个陷阱,咱们进行数据分区之后,致使除了分区键之外的查询都变得很是低效,尤为是对于sql语句如join查询就变得很是之糟糕,致使一些复杂的查询根本没法使用。

这里有一个思考题:

如何选择更好的分区策略算法?

  1. CAP定理是什么?

这个定理是指一个分布式系统不能同时具备一致性,可用性和分区容忍性

一致性Consistency: 依次读写的是什么就是什么。

可用性Availability: 整个系统不会崩溃, 每一个非故障节点总会有一个相应。

分区容忍Partition tolerant: 尽管有分区,系统仍能继续运行并保持其一致性和可用性。

对于任何分布式系统来讲,分区容忍是一个给定的条件,若是没有这一点,就不可能作到一致性和可用性。试想若是两个节点连接断掉了,他们如何可以作到既可用又一致?

最后你只能选择在网络分区状况下,你的系统要么强一致,要么高可用

实践代表大多数应用程序更看重可用性。这个考量的主要缘由是在不得不一样步机器里实现强于一致性是时,网络延迟会成为一个问题

这类因素使得应用程序一般会选择提供高可用性的解决方案。

此时采用的是最弱的一致性模型来解决的,这种模型保证了若是没有对某个项目进行新的更新,最终对该项目的全部访问都会返回最新的值

这些系统提供了BASE属性,这是相对于传统数据库的ACID来说的。 也就是( Basically available)基本上是可用的,系统总会返回一个响应。

( Soft state)软状态, 系统能够随着时间的推移而变化,甚至在没有输入的状况下也能够变化, 如保持最终的一致性的同步。

( Eventual consistency)最终的一致性, 在没有输入的状况下,数据早晚会传播到每个节点上,从而变得一致。

追求高可用的分布式数据库例子有Cassandra看重强一致性的数据库,有HBase, Redis, Zookeeper。

  1. 分布式系统如何进行分布?

咱们来看一下分布系统进行分布的经常使用方式:

  1. 哈希

哈希方式把不一样的值进行哈希运算,映射到不一样的机器或者节点上。这种方式在扩展的时候比较困难,由于数据分散在多个机器上很容易出现分布不均的状况,常见的哈希对象有ip,url,id等。

  1. 数据范围

按数据范围分布,好比ID在1~100的在机器a上,ID在100~200的在机器b上,诸如此类。这种分布方法数据比较均匀。若是某个节点处理能力有限,能够直接分裂这个节点。

维护数据分布的这些原数据,若是量很是大的话,可能会出现单点瓶颈。

所以必定要严格控制元数据量

  1. 数据量

按数据量来分布数据,是以较为固定的大小将数据划分为若干的数据块,再把不一样的数据块分布到不一样的服务器上。

以数据量来进行分布的这些数据,也须要被记录下来做为元数据来管理。

当集群规模很大时,元数据的量也会变大。

  1. 副本与数据分布

这种方式是指把数据给分散到多个服务器上。若是其中一台出现问题,请求就会被转到其余服务器上。其原理是多个机器互为副本,这是比较理想的实现负载分压的方式

  1. 一致性哈希

一致性哈希。经过哈希域构造哈希环,在增长机器时,变更的是其附近的节点,分摊的是附近节点的压力,其元数据的维护和按数量分布的维护方式一致。

咱们如今来看一下使用以上方式进行分布的例子:

GFS, HDFS: 按数据量分布。

Map reduce: 按GFS数据分布作本地化。

BigTable, HBase按数据范围分布。

Pnuts: 按哈希方式或者数据范围分布。

Dynamo, Cassndra: 按一致性哈希分布。

Mola, Armor, BigPipe: 按哈希方式分布。

Doris: 按哈希方式和按数据量分布进行组合。

  1. 分布式应用一般使用的架构类型哪些?

6.1 客户端服务器

在这个类型中,分布式系统架构有一个服务器做为共享资源。好比打印机数据库或者网络服务器。它有多个客户机,这些客户机决定什么时候使用共享资源,如何使用和显示改变数据,并将其送回服务器,像git这样的代码仓,这是一个很好的例子

6.2 三层架构

这种架构把系统分为表现层,逻辑层和数据层,这简化了应用程序的部署,大部分早期的网络应用都是三层的

6.3 多层架构

上面的三层架构是多层架构的一种特殊形式

通常会把上面的三层进行更详细的划分,好比说以业务的形式进行分层

6.4 点对点架构

在这种架构中,没有专门的机器提供服务或管理网络资源。而是将责任统一分配给全部的机器,成为对等机,对等机既能够做为客户机,也能够做为服务器。这种架构的例子,包括bittorrent和区块链。

6.5 以数据库为中心

这种架构是指用一个共享的数据库,使分布式的各个节点在不须要任何形式直接通讯的状况下,进行协同工做的架构。

  1. 分布式系统的优缺点有哪些?

7.1分布式系统的优势

  1. 分布式系统中的全部节点都是相互链接的。因此节点能够很容易地与其余节点共享数据
  2. 更多的节点能够很容易地添加到分布式系统中,便可以根据须要进行扩展
  3. 一个节点的故障不会致使整个分布式系统的失败。其余节点仍然能够相互通讯。
  4. 硬件资源能够与多个节点共享,而不是只限于一个节点。

7.2分布式系统的缺点

  1. 在分布式系统中很难提供足够的安全,由于节点以及链接都须要安全。
  2. 一些消息和数据在从一个节点转移到另外一个节点时,可能会在网络中丢失
  3. 与单用户系统相比,链接到分布式系统的数据库是至关复杂和难以处理的
  4. 若是分布式系统的全部节点都试图同时发送数据,网络中可能会出现过载现象

小结

最后谈一下分布式系统与集群的关联。个人观点是这二者并非对立的。

由于分布式系统是经过多个节点的集群来完成一个任务,让外界看起来是跟一套系统做为一个总体打交道。

一套分布式系统能够有多个集群,这些集群能够业务进行划分,也能够物理区域进行划分。每个集群能够做为这个分布式系统的一个节点。

这些集群节点组成的分布式系统,又能够做为单个的节点与其余的节点组成一个集群。

点击关注,第一时间了解华为云新鲜技术~

相关文章
相关标签/搜索