顾名思义:让大家工作平均一点
好一点的负载均衡:某个节点“病”了,可以暂时不给分配;等“病”好后继续分配工作。
DNS:一个域名配置两个IP,轮训解析
接入层:F5硬件(10W);lvs、keepalived (linux虚拟服务)
nginx(3W):反向代理
网关GetWay(Tomcat 1K,Netty): 业务上进行认证鉴权的服务,不做业务处理,然后转发给后端系统,负载均衡实际由服务调用中间件完成
中间件Redis集群:根据slot路由到对应的节点
RPC: Dubbo,Robbin: 根据从注册中心获取的ServerIP轮询
分库分表:动态数据源自定义路由郭泽,或者使用Mycat中间件,根据数据配置路由规则
1)可用性:任何一台机器挂了,服务受不受影响
2)扩展性:能否通过增加机器,扩充系统的性能
3)反向代理:请求是否均匀分摊到后端的操作单元执行
逻辑:一个域名可以配置多个IP地址;你ping的时候轮询返回。
优点:
1)零成本,配置即可
2)部署简单:多部署几个server就行
3)负载均衡:变成了多机,但负载基本是均衡的
缺点:
1)非高可用:DNS服务器不监控WebServer,挂掉一个就影响服务可用性
2)扩容非实时:DNS解析有一个生效周期,阿里云是10min
3)暴露了太多IP地址
java servlet需要运行在Tomcat容器中,Tomcat性能直接局限webServer的性能。
经验值:1K并发,大概就这么个数量级,实际情况需要压测
假如1W并发,就要部署10个tomcat,并且要10个外网IP?
此时的架构图如上:
1)站点层与浏览器层之间加入了一个反向代理层,利用高性能的nginx来做反向代理
2)nginx将http请求分发给后端多个web-server
优点:
1)DNS-server不需要动
2)负载均衡:通过nginx来保证
3)只暴露少量外网ip,nginx->tomcat之间使用内网访问
4)扩容实时:nginx内部可控,随时增加web-server随时实时扩容
5)能够保证站点层的可用性:任何一台tomcat挂了,nginx可以将流量迁移到其他tomcat
缺点:
1)时延增加+架构更复杂了:中间多加了一个反向代理层
2)反向代理层成了单点,非高可用:tomcat挂了不影响服务,nginx挂了怎么办?
1)做两台nginx组成一个集群,分别部署上keepalived,设置成相同的虚IP,保证nginx的高可用
2)当一台nginx挂了,keepalived能够探测到,并将流量自动迁移到另一台nginx上,整个过程对调用方透明
优点:
1)解决了高可用的问题
缺点:
1)资源利用率只有50%
2)nginx仍然是接入单点,如果接入吞吐量超过的nginx的性能上限怎么办,例如qps达到了50000咧?
nginx毕竟是软件,性能比tomcat好,但总有个上限,超出了上限,还是扛不住。
lvs实施在操作系统层面;f5的性能又更好了,它实施在硬件层面,每秒可以抗10w。
DNS 可以扩展子集群能力,多个入口。水平可以无限制扩展下去
KeepAlived 探测服务可用性,实现高可用
lvs:linux virtual server,类似docker技术,一台机器上可以扩展多个nginx。当然你也可以自己部署多个nginx在多台服务器上
nginx做反向代理
云服务:阿里云:SLB
常用有:轮训,Hash,权重
根据是否可以动态修改分为:动态和静态
Nginx就支持这三种方式,且属于静态,参考:
Nginx多套环境配置及常见路由策略_wd520521的博客-CSDN博客_nginx路由策略
服务间RPC的调用是由RPC框架实现
为什么要动态调整权重?
没有资源谁了算?
有了数据后怎么调整?
什么是过载保护?
为什么需要过载保护:
如何进行过载保护?
END