分布式系统设计策略

zjxbjh 2018-08-07

摘自 《深入分布式缓存:从原理到实践》

分布式系统本质是通过低廉的硬件攒在一起以获得更好地吞吐量、性能以及可用性等。分布式系统有一些通用的设计策略,也是在分布式环境下普遍关心的几个问题:

  • 如何检测你还活着?
  • 如何保障高可用
  • 容错处理
  • 重试机制
  • 负载均衡

1. 心跳检测

在分布式环境中,一般会有多个节点来分担任务的运行、计算或程序逻辑处理。通常采用 心跳检测 来判断节点是否可用。


分布式系统设计策略
 

如上图所示,Client请求Server,Server转发请求到具体的Node获取请求结果。Server需要与三个Node节点保持心跳连接,确保Node可以正常工作。

若Server没有收到Node3的心跳时,Server认为Node3失联。失联代表并不确定是否是Node3故障,有可能是Node3处于繁忙状态,导致调用检测超时;也有可能是Server与Node3之间链路出现故障或闪断。所以心跳不是万能的,收到心跳可以确认节点正常,但是收不到心跳却不能认为该节点已经宣告“死亡”。此时,可以通过一些方法帮助Server做决定:周期检测心跳机制、累计失效检测机制

周期检测心跳机制
Server端每间隔 t 秒向Node集群发起监测请求,设定超时时间,如果超过超时时间,则判断“死亡”。
累计失效检测机制
 在周期检测心跳机制的基础上,统计一定周期内节点的返回情况(包括超时及正确返回),以此计算节点的“死亡”概率。另外,对于宣告“濒临死亡”的节点可以发起有限次数的重试,以作进一步判断。

通过周期检测心跳机制、累计失效检测机制可以帮助判断节点是否“死亡”,如果判断“死亡”,可以把该节点踢出集群。

2. 高可用设计

系统高可用性的常用设计模式包括三种:主备(Master-Slave)模式、互备(Active-Active)模式和集群(Cluster)模式

1) 主备模式

主备模式就是Active-Standby模式,当主机宕机时,备机接管主机的一切工作,待主机恢复正常后,按使用者的设定以自动(热备)或手动(冷备)方式将服务切换到主机上运行。在数据库部分,习惯称之为MS模式,即Master/Slave模式,这在数据库高可用性方案中比较常用,但存在Master到Slave的数据延时风险,尤其是跨地域复制。如MySQL、Redis等就采用MS模式保证高可用。


分布式系统设计策略
 

2) 互备模式

互备模式指两台主机同时运行各自的服务工作且相互监测情况。在数据库高可用部分,常见的互备是MM模式,即Multi-Master模式,指一个系统存在多个master,每个master都具有read-write能力,需根据时间戳或业务逻辑合并版本。比如分布式版本管理系统Git,可以理解成Multi-Master的解决方案,具备最终一致性。

3) 集群模式

集群模式是指有多个节点在运行,同时可以通过主控节点分担服务请求。如Zookeeper。集群模式需要解决主控节点本身的高可用问题,一般采用主备模式。

如TFS(Taobao File System),它涉及到NameServer、DataServer两类节点。NameServer存放元数据,而具体的业务数据存放于DataServer。多个DataServer就是集群模式的运行状态,NameServer作为主控节点。为了保障NameServer的高可用,通过Heart Agent机制做心跳检测来负责NameServer的主备切换(主备模式)。



分布式系统设计策略
 
 

3. 容错性

 容错就是IT系统对于错误的包容能力,确切地说是容故障而非错误。容错的处理是保障分布式环境下相应系统的高可用或者健壮性。

以TFS为例,TFS集群需要容错(整个集群宕掉咋办?)、NameServer需要容错、DataServer也需要容错。NameServer主要管理了DataServer和Block之间的关系。如每个DataServer拥有哪些Block,每个Block存放在哪些DataServer上等。同时,NameServer采用了主备模式,主NameServer上的操作会重放(同步)到备NameServer,如果主NameServer出现问题,可以实时切换到备NameServer。另外NameServer和DataServer之间也会有定时的心跳机制,DataServer会把自己拥有的Block发送给NameServer,NameServer会根据这些信息重建DataServer和Block的关系。

另外,缓存失效雪崩问题也可以进行一定的容错处理,提升系统健壮性。比如,我们使用缓存通常都是先检查缓存是否存在,如果存在则直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回。因此,如果我们查询的某一些数据实际上不存在,就会造成每一次请求都查询DB,给数据库造成较大的压力。这种情况下,一个比较巧妙的方法是,将这个不存在的key预先设定一个值并存入缓存(过期时间不宜过长),避免大量请求透传到DB中。

4. 负载均衡

负载均衡集群:其关键在于使用多台集群服务器共同分担计算任务,把网络请求及计算分配到集群可用服务器上去,从而达到可用性及较好地用户体验。

分布式系统设计策略
 

负载均衡器有硬件解决方案,也有软件解决方案。硬件解决方案有著名的F5,软件有LVS、HAProxy、Nginx等。

以Nginx为例,负载均衡有如下几种策略:

  • 轮询:即Round Robin,根据Nginx配置文件中的顺序,依次把客户端的Web请求分发到不同的后端服务器
  • 最少链接:当前谁连接最少,分发给谁
  • 基于权重:配置Nginx把请求更多地分发到高配置的后端服务器上,把相对较少的请求分发到低配服务器

相关推荐