Load Balancer
前言
一致性哈希和load balancer系统设计中有一定关连,系统设计中可以一起提。一致性哈希在另外一篇文章中写,本文不提。
Load balancer可以把请求分配到合适的worker上去处理。 Load balancer 并不是路由到某个具体的api,所以概览上load balancer 和api gateway是不一样的。LB和reverse proxy概念上也是不一样的。
Load Balancer
Typically a load balancer sits between the client and the server accepting incoming network and application traffic and distributing the traffic across multiple backend servers using various algorithms.
A load balancer reduces individual server load and prevents any one application server from becoming a single point of failure.
Load Balancer的优点
- Preventing requests from going to unhealthy servers 防止请求指向不健康的服务器
- Preventing overloading resources 防止某个资源过载,这里的资源可以是CPU,内存等
- Helping to eliminate a single point of failure 帮助消除单点失败
LB的实现
- 可以是物理方式:硬件
- 可以是软件:Nginx, HAProxy等
- AWS有Elastic Load Balancing ELB
LB的额外优点
- SSL termination
负责加密解密https请求,后端的server不需要做这些操作 - Session persistence
发布cookie并路由某一个客户的请求一直到同一台server,因为我们的某一台woker的session
LB Single Point Failure
为了预防LB的单点失败,我们经常需要配置多台LB 通过 active-passive 或者active-active模式
Active-passive
一台lb是active的,其他passive。通过heatbeats 心跳来检测LBs是否可请求,如果active的LB的heatbeat不正常,就用Passive的lb接管active的ip地址并继续服务。
Active-active
所有的LBs都处理请求。 如果LB是直接面向外部的,DNS要知道所有的LB的地址。 如果LB是在内部的,内部应用的逻辑要知道所有的LB。
Load Balancer 可以帮助scaling
Load balancer可以帮助horizontal scaling通过添加过多的server或者resources。
对应的另外一种scaling是Vertical scaling,通过对这台server添加更多或者更贵的硬件。
Load Balancer的缺点
- 如果lb自己没有足够的资源,那么它可能成为系统的瓶颈
- 引用lb来解决Single point of Failure会让整个系统的复杂性提升
- 一个单一的LB也将可能是一个single point of failure,多个LB的话会导致更大的复杂性
Reverse Proxy 反向代理
反向代理是一个web server,统一了外部请求的接口,进入到反向代理后,会通过判断请求,指向到对应能处理请求的地址。比如一个request,proxy判断出它是请求图片资源,直接指向对应的图片地址,不走到对应的service进去处理。
优点:
- 增加安全性。 隐藏了后部的服务器地址,也可以添加黑名单ip地址,限制clinet的连接数等
- 增加自由性,和可扩展性。客户只能看到proxy IP, 意味着你可以随时增加更多proxy后部的services或者servers。
- SSL termination: 可以负责加密解密https
- 压缩: 可以负责压缩response
- 缓存: 可以缓存response下次直接返回
- 静态内容: 直接指向静态内容,不走其他service的路由
LB VS Reverse Proxy
- 有多台功能一直的服务器的话是要用LB
- 如果只有一个web server或者application server, 应该使用Reverse Proxy可以带来上述优点