分布式系统基础

所谓分布式系统简单来说就是通过一些手段将计算能力以及存储能力分散到多台服务器上面,随之带来了一些问题涉及数据分布、数据复制、一致性、容错等。

分布式系统面临的第一个问题就是数据分布,即将数据均匀地分布到多个存储节点。另外,为了保证可靠性和可用性,需要将数据复制多个副本,这就带来了多个副本之间的数据一致性问题

分布式系统中的服务器故障率很高,要求系统能够在软件层面实现自动容错。比如当存储节点出现故障时,系统能够自动检测出来,并将原有的数据和服务迁移到集群中其他正常工作的节点。

一些概念

性能

主要指系统的吞吐能力以及系统的响应时间。

其中,系统的吞吐能力指系统在某一段时间可以处理的请求总数,通常用每秒处理的读操作数(QPS,Query Per Second)或者写操作数(TPS,Transaction Per Second)来衡量;

系统的响应延迟,指从某个请求发出到接收到返回结果消耗的时间,通常用平均延时或者tp99以上请求的最大延时来衡量。
这两个指标往往是矛盾的,追求高吞吐的系统,往往很难做到低延迟;追求低延迟的系统,吞吐量也会受到限制。因此,设计系统时需要权衡这两个指标。

可扩展性

系统的可扩展性(scalability)指系统通过扩展集群服务器规模来提高系统存储容量、计算量和性能的能力。随着业务的发展,对底层存储系统的性能需求不断增加,比较好的方式就是通过自动增加服务器提高系统的能力。理想的系统实现了“线性可扩展”,也就是说,随着集群规模的增加,系统的整体性能与服务器数量呈线性关系。

可用性

系统的可用性(availability)是指系统在面对各种异常时可以提供正常服务的能力。系统的可用性可以用系统停服务或者服务与预期不符的时间与正常服务的时间的比例来衡量,例如某系统的可用性为4个9(99.99%),相当于系统一年服务不可用的时间不能超过365×24×60*(1-99.99%)=52.56分钟。系统可用性往往体现了系统的整体代码质量以及容错能力。

比较通用的标准

系统多不可靠,多长时间坏一次;一旦坏了,恢复服务的时间需要多长

系统可用性系统可用性

 

 

分区容错

理解为在存在网络分区的情况下,仍然可以接受请求(满足一致性和可用性)。这里的网络分区是指由于某种原因,网络被分成若干个孤立的区域,而区域之间互不相通。

CAP定理

它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

一致性(Consistency)(等同于所有节点访问同一份最新的数据副本,通常指强一致性

可用性(Availability)(对数据更新具备高可用性)

容忍网络分区(Partition tolerance)(Partition Tolerance的意思是,在网络中断,消息丢失的情况下,系统照样能够工作。以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。)

实例分析

关系型数据库设计选择了C(一致性)与A(可用性),NoSQL数据库设计则不同。其中,HBase选择了C(一致性)与P(分区可容忍性),Cassandra选择了A(可用性)与P(分区可容忍性)。

面对的挑战

在分布式存储系统中,往往将一台服务器或者服务器上运行的一个进程称为一个节点,节点与节点之间通过网络互联。于自动容错。然而,服务器节点是不可靠的,网络也是不可靠的。

服务器宕机

引发服务器宕机的原因可能是内存错误、服务器停电等。服务器宕机可能随时发生,当发生宕机时,节点无法正常工作,称为“不可用”(unavailable)。服务器重启后,节点将失去所有的内存信息,那么带来的问题:我们是否需要恢复内存信息,是否需要做持久化,如何做持久化,持久化带来的性能损失是否可以容忍。

网络异常

引发网络异常的原因可能是消息丢失、消息乱序或者网络包数据错误。有一种特殊的网络异常称为“网络分区”,即集群的所有节点被划分为多个区域,每个区域内部可以正常通信,但是区域之间无法通信。例如,某分布式系统部署在两个数据中心,由于网络调整,导致数据中心之间无法通信,但是,数据中心内部可以正常通信。

设计容错系统的一个基本原则是:网络永远是不可靠的,任何一个消息只有收到对方的回复后才可以认为发送成功,系统设计时总是假设网络将会出现异常并采取相应的处理措施。

磁盘故障

包括磁盘损坏和磁盘数据错误。磁盘损坏时,将会丢失存储在上面的数据,因而,分布式存储系统需要考虑将数据存储到多台服务器,即使其中一台服务器磁盘出现故障,也能从其他服务器上恢复数据。对于磁盘数据错误,往往可以采用校验和(checksum)机制来解决,这样的机制既可以在操作系统层面实现,又可以在上层的分布式存储系统层面实现。

三种状态

“成功”、“失败”、“超时”(未知状态),也称为分布式存储系统的三态。设计分布式存储系统时可以将操作设计为“幂等”的,也就是说,操作执行一次与执行多次的结果相同,例如,覆盖写就是一种常见的幂等操作。如果采用这种设计,当出现失败和超时时,都可以采用相同的处理方式,即一直重试直到成功。

一致性

由于异常的存在,分布式存储系统设计时往往会将数据冗余存储多份,每一份称为一个副本(replica/copy)。这样,当某一个节点出现故障时,可以从其他副本上读到数据。可以这么认为,副本是分布式存储系统容错技术的重要手段。由于多个副本的存在,如何保证副本之间的一致性是整个分布式系统的理论核心

可以从两个角度理解一致性:1)用户,或者说是客户端,即客户端读写操作是否符合某种特性;2)存储系统,即存储系统的多个副本之间是否一致,更新的顺序是否相同。

假设以下场景:

  • 客户端A:客户端A主要实现从存储系统write和read操作。
  • 客户端B和客户端C:客户端B和C是独立于A,并且B和C也相互独立的,它们同时也实现对存储系统的write和read操作

从客户端的角度来看,一致性包含如下三种情况:

  1. 强一致性:假如A先写入了一个值到存储系统,存储系统保证后续A,B,C的读取操作都将返回最新值。当然,如果写入操作“超时”,那么成功或者失败都是可能的,客户端A不应该做任何假设。

  2. 弱一致性:假如A先写入了一个值到存储系统,存储系统不能保证后续A,B,C的读取操作是否能够读取到最新值。

  3. 最终一致性:最终一致性是弱一致性的一种特例。假如A首先写入一个值到存储系统,存储系统保证如果后续没有写操作更新同样的值,A,B,C的读取操作“最终”都会读取到A写入的最新值。“最终”一致性有一个“不一致窗口”的概念,它特指从A写入值,到后续A,B,C读取到最新值的这段时间。“不一致性窗口”的大小依赖于以下的几个因素:交互延迟,系统的负载,以及复制协议要求同步的副本数。

协议

分布式系统中有两个重要的协议,包括Paxos选举协议以及两阶段提交协议。

  1. Paxos协议用于多个节点之间达成一致,往往用于实现主节点选举以及分布式锁。
  2. 两阶段提交协议用于保证跨多个节点操作的原子性,这些操作要么全部成功,要么全部失败。

猜你喜欢

转载自fxbull.iteye.com/blog/2292391