分布式设计与开发

#0 系列目录#web

#1 分布式介绍# 分布式可繁也能够简,最简单的分布式就是你们最经常使用的,在负载均衡服务器后加一堆web服务器,而后在上面搞一个缓存服务器来保存临时状态,后面共享一个数据库,其实不少号称分布式专家的人也就停留于此,大体结构以下图所示:

输入图片说明

这种环境下真正进行分布式的只是web server而已,而且web server之间没有任何联系,因此结构和实现都很是简单。

有些状况下,对分布式的需求就没这么简单,在每一个环节上都有分布式的需求,好比Load Balance、DB、Cache和文件等等,而且当分布式节点之间有关联时,还得考虑之间的通信,另外,节点很是多的时候,得有监控和管理来支撑。这样看起来,分布式是一个很是庞大的体系,只不过你能够根据具体需求进行适当地裁剪。按照最完备的分布式体系来看,能够由如下模块组成:

输入图片说明

分布式任务处理服务:负责具体的业务逻辑处理

分布式节点注册和查询:负责管理全部分布式节点的命名和物理信息的注册与查询,是节点之间联系的桥梁

分布式DB:分布式结构化数据存取

分布式Cache:分布式缓存数据(非持久化)存取

分布式文件:分布式文件存取

网络通讯:节点之间的网络数据通讯

监控管理:搜集、监控和诊断全部节点运行状态

分布式编程语言:用于分布式环境下的专有编程语言,好比Elang、Scala

分布式算法:为解决分布式环境下一些特有问题的算法,好比解决一致性问题的Paxos算法

所以,若要深刻研究云计算和分布式,就得深刻研究以上领域,而这些领域每一块的水都很深,都须要很底层的知识和技术来支撑,因此说,对于想提高技术的开发者来讲,以分布式来做为切入点是很是好的,能够以此为线索,探索计算机世界的各个角落。

#2 几种必须了解的分布式算法# 分布式设计与开发中有些疑难问题必须借助一些算法才能解决,好比分布式环境一致性问题,感受如下分布式算法是必须了解的(随着学习深刻有待添加):

  • Paxos算法
  • 一致性Hash算法

##2.1 Paxos算法##

  1. 问题描述

分布式中有这么一个疑难问题,客户端向一个分布式集群的服务端发出一系列更新数据的消息,因为分布式集群中的各个服务端节点是互为同步数据的,因此运行完客户端这系列消息指令后各服务端节点的数据应该是一致的,但因为网络或其余缘由,各个服务端节点接收到消息的序列可能不一致,最后致使各节点的数据不一致。举一个实例来讲明这个问题,下面是客户端与服务端的结构图:

输入图片说明

当client一、client二、client3分别发出消息指令A、B、C时,Server1~4因为网络问题,接收到的消息序列就可能各不相同,这样就可能因为消息序列的不一样致使Server1~4上的数据不一致。对于这么一个问题,在分布式环境中很难经过像单机里处理同步问题那么简单,而Paxos算法就是一种处理相似于以上数据不一致问题的方案

  1. 算法自己

透过Paxos算法的各个步骤和约束,其实它就是一个分布式的选举算法,其目的就是要在一堆消息中经过选举,使得消息的接收者或者执行者能达成一致,按照一致的消息顺序来执行。其实,以最简单的想法来看,为了达到大伙执行相同序列的指令,彻底能够经过串行来作,好比在分布式环境前加上一个FIFO队列来接收全部指令,而后全部服务节点按照队列里的顺序来执行。这个方法固然能够解决一致性问题,但它不符合分布式特性,若是这个队列down掉或是不堪重负这么办?而Paxos的高明之处就在于容许各个client互不影响地向服务端发指令,大伙按照选举的方式达成一致,这种方式具备分布式特性,容错性更好

说到这个选举算法自己,能够联想一下现实社会中的选举,通常说来都是得票者最多者获胜,而Paxos算法是序列号更高者获胜,而且当尝试提交指令者被拒绝时(说明它的指令所占有的序列号不是最高),它会从新以一个更好的序列参与再次选举,经过各个提交者不断参与选举的方式,达到选出大伙公认的一个序列的目的。也正是由于有这个不断参与选举的过程,因此Paxos规定了三种角色(proposer,acceptor,和 learner)和两个阶段(accept和learn),另一个国内的哥们写了个不错的PPT,还经过动画描述了paxos运行的过程。不过仍是那句话不要一开始就陷入算法的细节中,必定要多想一想设计这些游戏规则的初衷是什么。

Paxos算法的最大优势在于它的限制比较少,它容许各个角色在各个阶段的失败和重复执行,这也是分布式环境下常有的事情,只要大伙按照规矩办事便可,算法的自己保障了在错误发生时仍然获得一致的结果

  1. 算法的实现

Paxos的实现有不少版本,最有名的就是google chubby ,不过看不了源码。开源的实现可见libpaxos。另外,ZooKeeper 也基于paxos解决数据一致性问题,也能够看看它是若是实现paxos的。

  1. 适用场景
  • database replication, log replication等, 如bdb的数据复制就是使用paxos兼容的算法。Paxos最大的用途就是保持多个节点数据的一致性

  • naming service, 如大型系统内部一般存在多个接口服务相互调用。

(1)一般的实现是将服务的ip/hostname写死在配置中,当service发生故障时候,经过手工更改配置文件或者修改DNS指向的方法来解决。缺点是可维护性差,内部的单元越多,故障率越大。

(2)LVS双机冗余的方式,缺点是全部单元须要双倍的资源投入。

经过Paxos算法来管理全部的naming服务,则可保证high available分配可用的service给client。象ZooKeeper还提供watch功能,即watch的对象发生了改变会自动发notification, 这样全部的client就可使用一致的,高可用的接口。

  • config配置管理

(1)一般手工修改配置文件的方法,这样容易出错,也须要人工干预才能生效,因此节点的状态没法同时达到一致。

(2)大规模的应用都会实现本身的配置服务,好比用http web服务来实现配置中心化。它的缺点是更新后全部client没法当即得知,各节点加载的顺序没法保证,形成系统中的配置不是同一状态

这里列举了一些常见的Paxos应用场合,对于相似上述的场合,若是用其它解决方案,一方面不能提供自动的高可用性方案,同时也远远没有Paxos实现简单及优雅。

##2.2 一致性Hash算法##

  1. 问题描述

分布式经常用Hash算法来分布数据,当数据节点不变化时是很是好的,但当数据节点有增长或减小时,因为须要调整Hash算法里的模,致使全部数据得从新按照新的模分布到各个节点中去。若是数据量庞大,这样的工做经常是很难完成的。一致性Hash算法是基于Hash算法的优化,经过一些映射规则解决以上问题

  1. 算法自己

实际上,在其余设计和开发领域咱们也能够借鉴一致性Hash的思路,当一个映射或规则致使有难以维护的问题时,能够考虑更一步抽象这些映射或规则,经过规则的变化使得最终数据的不变。一致性hash实际就是把之前点映射改成区段映射,使得数据节点变动后其余数据节点变更尽量小。这个思路在操做系统对于存储问题上体现不少,好比操做系统为了更优化地利用存储空间,区分了段、页等不一样纬度,加了不少映射规则,目的就是要经过灵活的规则避免物理变更的代价。

  1. 算法实现

一致性Hash算法自己比较简单,不过能够根据实际状况有不少改进的版本,其目的无非是两点:

  • 节点变更后其余节点受影响尽量小
  • 节点变更后数据从新分配尽量均衡

实现这个算法就技术自己来讲没多少难度和工做量,须要作的是创建起你所设计的映射关系,无需借助什么框架或工具,sourceforge上却是有个项目libconhash,能够参考一下。

分布式环境中大多数服务是容许部分失败,也容许数据不一致,但有些最基础的服务是须要高可靠性,高一致性的,这些服务是其余分布式服务运转的基础,好比naming service、分布式lock等,这些分布式的基础服务有如下要求:

  • 高可用性
  • 高一致性
  • 高性能

对于这种有些挑战CAP原则的服务该如何设计,是一个挑战,也是一个不错的研究课题,Apache的ZooKeeper也许给了咱们一个不错的答案。ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务, 它暴露了一个简单的原语集,分布式应用程序能够基于它实现同步服务,配置维护和命名服务等。

相关文章
相关标签/搜索