负载均衡与反向代理
外网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%,或者数据库连接池用完了,或者访问量突然增加到系统承受的最大阀值,可以根据情况自动降级或者人工降级。
- 严重错误:需要人工降级。