高可用设计

负载均衡与反向代理

外网DNS 应该用来实现用GSLB(全局负载均衡)进行流量调度,如将用户分配到离他最近的服务器上以提升体验。

内网DNS,可以实现简单的轮询负载均衡。可以考虑选择Nginx。

为了提升整体吞吐量,会在DNS和Nginx之间引入接入层,如使用LVS(软件负载均衡器),F5(硬件负载均衡器)可以做四层负载均衡。

请问什么是七层负载均衡或什么是四层负载均衡?

nginx的使用点

  • upstream配置
  • 负载均衡算法
  • 失败重试
  • 健康检查
  • demo

隔离术

线程隔离

主要是指线程池隔离,

进程隔离

业务拆分,将系统拆分为多个子系统来实现物理隔离。通过进程隔离使得某一个子系统出现问题时不会影响到其他子系统。

集群隔离

服务分组,不同分组内的实例对应不同的业务,防止当某一个分组出现问题时,不会影响到其他分组。

机房隔离

随着对系统可用性的要求,会进行多机房部署,每个机房的服务都有自己的服务分组,本机房的服务只应该调用本机房的服务,不进行跨机房调用。

读写隔离

通过主从模式将读和写集群分离,读服务只从从机器中读取数据,

快慢隔离

动静隔离

静态资源与动态资源隔离,例如:js/css等静态资源放到cdn中加载。

爬虫隔离

在负载均衡层面将爬虫(或恶意IP)路由到单独的集群,使用openresty,采用IP+cookie的方式,在用户浏览器种植标识用户身份的唯一cookie。访问服务前先种植cookie,访问服务器时验证cookie,如果没有或者不正确,则可以考虑分流到固定分组,或者提示输入验证码后访问。

热点隔离

  • 1.可以提前预知的热点,如秒杀,抢购等,做成独立的系统或服务进行隔离,保证不影响主流程。
  • 2.突发事件,热点用缓存+队列模式削峰填谷,消息队列的持久化。

资源隔离

环境隔离

测试环境,预发布环境/灰度环境、正式环境

压测隔离

真实数据、压测数据隔离

AB测试

缓存隔离

查询隔离

系统保护术

缓存

提升系统访问速度和增大系统处理能力,可谓是提高并发流量的银弹。

降级

当服务出问题或者影响到很新流程的性能,需要暂时屏蔽掉,待高峰过去或者问题解决后再打开的场景。

限流

通过对并发访问/请求进行限速或者一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级。

常见的限流策略:

  • 1.限制总并发数(比如数据库连接池,线程池)
  • 2.限制瞬间并发数(Nginx的limit_conn模块,用来限制瞬间并发连接数)
  • 3.限制时间窗口内的平均速率(Nginx的limit_req模块)
  • 4.限制远程接口调用速率 -5. 限制MQ的消费速率
  • 6.根据网络连接数、网络流量、cpu或内存负载等来限流。

限流的实现

限流算法

令牌桶、漏桶

应用级限流

  • 限流总并发/连接/请求数
  • 限流总资源数
  • 限流某个接口的总并发/请求数
  • 限流某个接口的时间窗请求数
  • 平滑限流某个接口的请求数

分布式限流

  • Redis+Lua:实现某个时间窗内某个接口的请求数限流,实现了该功能后可以改造为限流总并发/请求数和限制资源数。
  • Nginx+Lua

接入层限流

接入层通常指请求流量的入口,该层的主要目的有:负载均衡、非法请求过滤、请求聚合、缓存、降级、限流、A/B测试、服务质量监控等。

Nginx的自带模块

  • ngx_http_limit_conn_module
  • ngx_http_limit_req_module

OpenResty提供的lua限流模块

  • lua_resty_limit_traffic

节流

降级

降级预案

  • 一般:比如,有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级。
  • 警告:有些服务在一段时间内成功率有波动,可以自动降级或者人工降级。
  • 错误:比如:可用率低于90%,或者数据库连接池用完了,或者访问量突然增加到系统承受的最大阀值,可以根据情况自动降级或者人工降级。
  • 严重错误:需要人工降级。

超时与重试机制

回滚机制

压测与预案

猜你喜欢

转载自my.oschina.net/u/3421984/blog/1795604