架构设计之自动恢复

x33g5p2x  于2021-12-26 转载在 其他  
字(2.2k)|赞(0)|评价(0)|浏览(374)

一 点睛

当程序出现异常影响执行流程时,如果每次都人工来恢复,则会导致恢复不及时。只有提前预见异常情况进行自动恢复,才可能尽量减少异常对服务的影响。

自动恢复主要包括下面两方面

  • 服务恢复
  • 流量迁移

二 服务恢复

1 服务重启

有时进程在运行时会异常退出,场景场景如下:

程序运行时异常没有捕获,导致程序意外退出,或者程序崩溃,异常退出。

有些程序因为内存泄漏,在后台运行时间长了,占用内存过多,最终被系统杀死。

由于人为的误操作,导致进程被杀死。

还有很多原因导致进程无故消失。

使用监控类工具,除了可以监控进程的运行状态,还可以恢复服务。

有时遇到程序假死,也需要重启。如何判定进程假死呢?我们可以让进程自己上报当前状态,如果监控进程在策略范围内没有收到上报状态消息,则认为是假死,然后就可以制定具体的重启策略。

重启是一种有效的短期恢复方法。但同时要监控好执行次数,如果频繁执行,那么也要查看具体原因。

2 异常重试

分布式系统中有很多网络请求,在执行网络请求时,由于网络不稳定,或者其它节点不可用,或者遇到依赖的第三方超时返回,在遇到超时返回时,可以进行异常重试。如果在重试的过程中返回成功了,则通过这次重试,让原本返回异常的请求能够返回正确的结果。重试能够减低上游调用服务结果的整体超时率和错误率。

对于通过轮询来获取数据的场景,重试的效果会比较好。

在重试过程中要注意,防止重试增加后端的负载。过多的重试可能会让后端负载,导致全部的服务都受到影响。

在后端过载时,要停止重试。

常用的做法是客户端和后端服务协商超时重试的次数。可以从后端返回包中获取重试的时间间隔,或者按照指数量级加大超时重试间隔,还可以统计连续超时的次数,当超时次数达到阈值时,停止重试,直接返回失败。

重试可以弥补服务偶尔性的失败,但当服务真的不可用时,应该尽快停止重试,让后端服务尽快恢复。

3 对账修复

对于一些有数据存储的业务,我们要保证多个副本数据的一致性。有时候写数据方比较多,有的环节出问题了,会导致数据不能一致。此时可以从最终结果出发,利用一个单独的程序来比对副本和最终结果是否一致,如果出现不一致,马上修改,这也是一种自动修复的常用手段。

对账修改除了在后端服务中有广泛的应用,在一些前端表现类业务的代码中,对账修复也可以用于捕获问题场景,同时弥补用户体验。

通常对账修复是对已有的一套逻辑再做一套异构的逻辑,用来验证已有逻辑是否正确,并且先紧急修复,然后再慢慢查看已有逻辑 的问题。

既然出现了异常,就证明程序中有不符合预期的行为,要及早发现和修复。通过对账逻辑修复服务只是起到保险的作用,决定不能成为常态。

三 流量迁移

当服务运行的环境出现问题时,流量迁移可以把服务尽快迁移到正常环境。流量迁移一般用于下面场景

a 本身运行的服务器有问题

这种情况在业务规模变大后出现的概率会增加。一台机器一天出故障的概率的机会很小,但1000台机器一天出故障的概率就很大。从根本上解决问题,就是要让机器出现故障的时候,把流量切换到正常的服务上。

b 某些地理区域的服务得不到保障

由于业务的发展,业务跨的地域广阔,用户的网络质量千差万别,各种因素造成设备不可用。当发生这些意外情况时,都要有有效的技术手段把用户流量调度到可用的服务上来。

1 流量迁移方式

按照业务所负责的功能不同,迁移的方式也有些差别,大致有以下几种方式。

a DNS 方式

在域名访问系统中,当业务服务器出现了故障需要迁移时,通过修改 DNS,去除故障服务器,加入新增的服务器,实现把流量从故障机迁移到运行状态良好的服务器中的目的。

修改 DNS 实现流量迁移的缺点是不够及时,在日常流量迁移过程中,很少使用修改 DNS 的方式。

b VIP 方式

VIP 即虚拟 IP 地址。原理是用户侧看到的是一个独立的 IP 地址,但这个 IP 地址后面可以挂载众多的内网 IP 地址,而且当更换机器硬件资源的时候,对外的虚拟 IP 地址可以保持不变,相当于一个一直可用的外网 IP 地址。在需要流量迁移的时候,修改虚拟 IP 地址对应的后端实体 IP 地址即可,更新速度快,无延迟,立即生效。

由于DNS方式有更新不及时的缺点,所以目前 DNS 服务器中配置的 IP 地址都不是机器的实体 IP地址,而是 VIP,通过 VIP 增加 VIP 层来实现实体机快速迁移。

在日常流量迁移的过程中,经常使用 VIP 方式。

c 反向代理方式

当流量到达应用服务之后,还可以通过修改应用服务的 proxy 层的路由来实现流量切换的目的。例如,可以通过 Nginx 的反向代理功能完成流量分发。

在日常流量迁移过程中,很少使用这种方式,因为修改配置文件还有其他 nginx 相关重要信息,容易改错,而且如果后端服务器很多,那么写到 Nginx 配置文件中的 IP 地址会很长。

d 客户端选择方式

客户端也可以主动做流量迁移。例如,在客户端登录时,从服务器拉取路由表,客户端模拟发包进行测速,选择速度最优的服务器接入。

在大型互联网公司经常使用这种方式。

e 存活检测方式

这种方式主要用在后端服务中,定期检测调用服务的服务质量。服务调用方选择最好的服务器进行请求。

这种方式是使用最广泛的一种。

2 业务逻辑

一般对于无状态的服务,使用上面的处理方式就能够马上把流量迁走,但有些服务是有状态的,需要在新的服务器上创建缓存。如果是这种方式的流量迁移,那么最粗暴的方式是把用户踢下线,让用户重新登录。但为了给用户最好的体验,通常都是实现一些迁移数据的逻辑,然后无感知,实现业务的无缝切换。

相关文章