概述

分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间通过网络消息传递进行通信和协调的系统。

一个标准的分布式系统都会有如下几个特征:

  • 分布性,分布式系统中的多台计算机在空间上随意分布,同时,机器的分布情况也会随时变动。
  • 对等性,分布式系统中的计算机没有主/从之分。(个人理解对等下性是相对于 client 来说的,client 在请求一个服务的时候来看,接受请求的计算机并没有主/从之分)。副本是分布式系统当中对数据服务冗余的一种方式。为了提高服务可用性,会对数据和服务进行副本处理。数据副本是指在不同的节点上持久化同一份数据,。服务副本是指多个节点提供同样的服务,每个节点都能处理外部的请求。
  • 并发性,分布式系统当中的多个节点会并发操作一些资源,如果准确且高效的协调分布式并发操作也是很大的挑战。
  • 缺乏全局时钟,分布式系统当中很难定义两个事件谁先谁后,原因是因为缺乏一个全局的时钟序列控制。
  • 故障总是发生,组成分布式系统的任何计算机都有可能发生故障。任何在设计阶段考虑到的异常情况,一定会在系统实际运行中发生,并且,在系统实际运行过程中还会遇到很多在设计时未能考虑到的异常。

分布式环境的各种问题:

  • 通信异常,分布式系统之间的交互必然是通过网络,而网络是一个不可靠的交互方式,会经常出现通信异常的情况。
  • 网络分区,由于网络发生问题,导致分布式系统当中部分节点之间的网络延迟不断增大,最终导致组成分布式的所有节点,只有部分节点之间能够进行正常通信,而另外一些节点则不能,这个情况称为网络分区。

分布式系统每一次请求的三态:

  • 成功
  • 失败
  • 超时

衡量分布式系统的指标:

  • 性能
  • 可用性
  • 扩展性
  • 一致性

分布式系统原理

数据分布方式

哈希方式

优点是简单,如何哈希的算法比较好数据分布均匀。缺点是扩展性不高,一旦集群扩展,大部分数据都需要重新迁移分布。

哈希算法当中如果某数据特征值的数据不均,容易出现数据倾斜,导致某台服务器数据分布过多,导致性能问题。

哈希扩展性差的问题,可以换个思路来优化下,哈希不再是简单的将哈希值与机器数量做触发取模映射,而是将对应关系作为元数据有专门的元数据服务器管理。访问数据时,先计算哈希值并且查询元数据服务器,获取该哈希值对应的机器。同时哈希值取模个数往往大于机器个数,这样同一台机器上负责多个哈希值。在集群扩容的时候,将部分余数分配给新加入的机器并且迁移对应的数据到新机器上,从而降低扩容成本。

按数据范围分布

将数据按照特征值的值域范围划分为不同的区间,使得集群中每台服务器处理不同区间的数据。

例如用户 id 的值域范围是 [1, 100),集群有 3 台服务器,将用户 id 的值域分为三个区间 [1, 33), [33. 90), [90, 100) 分布由 3 台服务器负责处理。

数据区间的数据大小和区间大小是没有关系的。上面例子当中值域的大小不太相同,但是数据的大小实际上比较接近。在工程上,为了数据迁移等负载均衡方便,往往利用动态划分区间技术,使得每个区间中服务的数据尽量一样多。当某个区间的数据量较大时,通过将区间分裂的方式拆分为两个区间,使得每个区间维持在一个固定的阈值下。

要使用专门的服务器在内存中维护数据分布信息, 称这种数据的分布信息为一种元信息。对于大规模的集群,由于元信息的规模非常庞大,单台计算机无法独立维护,需要使用多台机器作为元信息服务器。

实际工程中,一般也不按照某一维度划分数据范围,而是使用全部数据划分范围,从而避免数 据倾斜的问题。

优点是灵活根据数据量具体情况拆分原有数据区间,拆分后的数据区间可以迁移到其他机器。扩容时候非常方便无限制。缺点是需要维护大量复杂的元数据。数据增长很大后,元数据服务器容易称为瓶颈。

按数据量分布

数据量分布数据与具体的数据特征无关,而是将数据视为一个顺序增长的文件,并将这个文件按照某一较为固定的大小划分为若干数据块(chunk),不同的数据块分布到不同的服务器上。也需要元数据服务器来管理元数据。

由于与具体数据特征无关,按数据量分布数据的方式一般没有数据倾斜的问题,数据总是被均匀切分并分布到集群中。

优缺点与按数据范围分布类似。

一致性哈希

使用一致性哈希的方式需要将节点在一致性哈希环上的位置作为元信息加以管理,其元信息的 量通常比按数据范围分布数据和按数据量分布数据的元信息量要小很多。

副本与数据分布

分布式系统容错、提高可用性的基本手段就是使用副本。对于数据副本的分布方式主要影响系统的可扩展性。

一种基本的数据副本策略是以机器为单位,若干机器互为副本,副本机器之间的数据完全相同。其优点是非常简单,其缺点是恢复数据的效率不高、可扩 展性也不高。

更合适的做法不是以机器作为副本单位,而是将数据拆为较合理的数据段,以数据段为单位作 为副本。实践中,常常使得每个数据段的大小尽量相等且控制在一定的大小以内。

一旦将数据分为数据段,则可以以数据段为单位管理副本,从而副本与机器不再硬相关,每台 机器都可以负责一定数据段的副本。

工程中,完全按照数据段建立副本会引起需要管理的元数据的开销增大,副本维护的难度也相 应增大。一种折中的做法是将某些数据段组成一个数据段分组,按数据段分组为粒度进行副本管理。 这样做可以将副本粒度控制在一个较为合适的范围内。

【参考资料】

  1. 从Paxos到Zookeeper
  2. 分布式系统原理介绍

—EOF—