在分布式环境下,有几个问题是普遍关心的,我们称之为设计策略:
如何检测当前节点还活着?
如何保障高可用?
容错处理
负载均衡
一、心跳检测
没有检测到心跳的时候,不代表节点死亡,可能是忙碌中。
通过下面两种方式来检测:
- 周期检测心跳机制
- 累计失效检测机制
周期检测心跳机制
Server端每间隔 t 秒向Node集群发起监测请求,设定超时时间,如果超过超时时间,则判断“死亡”。
累计失效检测机制
在周期检测心跳机制的基础上,统计一定周期内节点的返回情况(包括超时及正确返回),以此计算节点的“死亡”概率。另外,对于宣告“濒临死亡”的节点可以发起有限次数的重试,以作进一步判断。
通过周期检测心跳机制、累计失效检测机制可以帮助判断节点是否“死亡”,如果判断“死亡”,可以把该节点踢出集群
二、高可用设计
系统高可用性的常用设计模式包括三种:主备(Master-SLave)、互备(Active-Active)和集群(Cluster)模式。
1.主备模式
当主机宕机时,备机接管主机的一切工作
2.互备模式
互备模式指两台主机同时运行各自的服务工作且相互监测情况
3.集群模式
多个节点在运行,同时可以通过主控节点分担服务请求
三、容错性
容错的处理是保障分布式环境下相应系统的高可用或者健壮性,典型的案例就是对于缓存穿透问题的解决方案
我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据 库然后再缓存查询结果返回。这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,这样缓存就失去了意义,在流量大时,或者有人恶意攻击
如频繁发起为id为“-1”的条件进行查询,可能DB就挂掉了。
那这种问题有什么好办法解决呢?
一个比较巧妙的方法是,可以将这个不存在的key预先设定一个值。比如,key=“null”。在返回这个null值的时候, 我们的应用就可以认为这是不存在的key,那我们的应用就可以决定是否继续等待访问,还是放弃掉这次操作。如果继续等待访问,过一个时间轮询点后,再次请求这个key,如果取到的值不再是null,则可以认为这时候key有值 了,从而避免了透传到数据库,把大量的类似请求挡在了缓存之中。