分布式系统设计策略

在分布式环境下,有几个问题是普遍关心的,我们称之为设计策略:

如何检测当前节点还活着?
如何保障高可用?
容错处理
负载均衡

一、心跳检测

没有检测到心跳的时候,不代表节点死亡,可能是忙碌中。

通过下面两种方式来检测:

  • 周期检测心跳机制
  • 累计失效检测机制

周期检测心跳机制

Server端每间隔 t 秒向Node集群发起监测请求,设定超时时间,如果超过超时时间,则判断“死亡”。

累计失效检测机制

在周期检测心跳机制的基础上,统计一定周期内节点的返回情况(包括超时及正确返回),以此计算节点的“死亡”概率。另外,对于宣告“濒临死亡”的节点可以发起有限次数的重试,以作进一步判断。

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

二、高可用设计

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

1.主备模式

当主机宕机时,备机接管主机的一切工作

2.互备模式

互备模式指两台主机同时运行各自的服务工作且相互监测情况

3.集群模式

多个节点在运行,同时可以通过主控节点分担服务请求

三、容错性

容错的处理是保障分布式环境下相应系统的高可用或者健壮性,典型的案例就是对于缓存穿透问题的解决方案

我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据 库然后再缓存查询结果返回。这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,这样缓存就失去了意义,在流量大时,或者有人恶意攻击

如频繁发起为id为“-1”的条件进行查询,可能DB就挂掉了。

那这种问题有什么好办法解决呢?

一个比较巧妙的方法是,可以将这个不存在的key预先设定一个值。比如,key=“null”。在返回这个null值的时候, 我们的应用就可以认为这是不存在的key,那我们的应用就可以决定是否继续等待访问,还是放弃掉这次操作。如果继续等待访问,过一个时间轮询点后,再次请求这个key,如果取到的值不再是null,则可以认为这时候key有值 了,从而避免了透传到数据库,把大量的类似请求挡在了缓存之中。

四、负载均衡

Author: iMine
Link: https://imine141.github.io/2020/08/07/%E5%88%86%E5%B8%83%E5%BC%8F/%E5%88%86%E5%B8%83%E5%BC%8F%E7%90%86%E8%AE%BA/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%E7%AD%96%E7%95%A5/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.