分布式.负载均衡

负载均衡

顾名思义:让大家工作平均一点

好一点的负载均衡:某个节点“病”了,可以暂时不给分配;等“病”好后继续分配工作。

分类机制

DNS:一个域名配置两个IP,轮训解析

接入层:F5硬件(10W);lvs、keepalived (linux虚拟服务)

  • 硬件和操作系统层面 进行负载均衡
  • lvs:Linux Virtual Server,使用集群技术,实现在linux操作系统层面的一个高性能、高可用、负载均衡服务器。(用lvs可以在1台机器虚拟出多个Nginx,否则补充多个Nginx需要多台机器,类似Docker Centos镜像)
  • keepalived:一款用来检测服务状态存活性的软件,常用来做高可用
  • f5:一个高性能、高可用、负载均衡的硬件设备

nginx(3W):反向代理

网关GetWay(Tomcat 1K,Netty): 业务上进行认证鉴权的服务,不做业务处理,然后转发给后端系统,负载均衡实际由服务调用中间件完成

中间件Redis集群:根据slot路由到对应的节点

RPC: Dubbo,Robbin: 根据从注册中心获取的ServerIP轮询

分库分表:动态数据源自定义路由郭泽,或者使用Mycat中间件,根据数据配置路由规则

衡量指标

1)可用性:任何一台机器挂了,服务受不受影响

2)扩展性:能否通过增加机器,扩充系统的性能

3)反向代理:请求是否均匀分摊到后端的操作单元执行

单机架构

分布式.负载均衡_第1张图片

DNS

逻辑:一个域名可以配置多个IP地址;你ping的时候轮询返回。

分布式.负载均衡_第2张图片

优点:

1)零成本,配置即可

2)部署简单:多部署几个server就行

3)负载均衡:变成了多机,但负载基本是均衡的

缺点:

1)非高可用:DNS服务器不监控WebServer,挂掉一个就影响服务可用性

2)扩容非实时:DNS解析有一个生效周期,阿里云是10min

3)暴露了太多IP地址

Tomcat

java servlet需要运行在Tomcat容器中,Tomcat性能直接局限webServer的性能。

经验值:1K并发,大概就这么个数量级,实际情况需要压测

假如1W并发,就要部署10个tomcat,并且要10个外网IP?

 分布式.负载均衡_第3张图片

Nginx 

分布式.负载均衡_第4张图片

此时的架构图如上:

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挂了怎么办?

 keepalived

分布式.负载均衡_第5张图片

1)做两台nginx组成一个集群,分别部署上keepalived,设置成相同的虚IP,保证nginx的高可用

2)当一台nginx挂了,keepalived能够探测到,并将流量自动迁移到另一台nginx上,整个过程对调用方透明

优点:

1)解决了高可用的问题

缺点:

1)资源利用率只有50%

2)nginx仍然是接入单点,如果接入吞吐量超过的nginx的性能上限怎么办,例如qps达到了50000咧?

nginx毕竟是软件,性能比tomcat好,但总有个上限,超出了上限,还是扛不住。

 lvs/f5

lvs实施在操作系统层面;f5的性能又更好了,它实施在硬件层面,每秒可以抗10w。

分布式.负载均衡_第6张图片

 负载均衡总结

DNS 可以扩展子集群能力,多个入口。水平可以无限制扩展下去

KeepAlived 探测服务可用性,实现高可用

lvs:linux virtual server,类似docker技术,一台机器上可以扩展多个nginx。当然你也可以自己部署多个nginx在多台服务器上

nginx做反向代理

云服务:阿里云:SLB

负载均衡策略

常用有:轮训,Hash,权重

根据是否可以动态修改分为:动态和静态

Nginx就支持这三种方式,且属于静态,参考:

Nginx多套环境配置及常见路由策略_wd520521的博客-CSDN博客_nginx路由策略

服务间RPC的调用是由RPC框架实现

动态调整权重

为什么要动态调整权重?

  • 任务处理需要资源不平均
  • A服务接了一个生成1GExcel请求;B服务接的是1M的请求

没有资源谁了算?

  • A和B服务 哪个行,哪个不行 谁了算?
  • 调用方
  • 方法1:按照调用超时计算,一个请求没超时+1,超时10
  • 方法2:按照处理时间算,计算处理时间,然后我转发给处理时间短的服务

有了数据后怎么调整?

  • 需要手动修改Dubbo或者Robbin代码实现

过载保护

什么是过载保护?

  • 当A和B服务都满载情况下, 暂时丢弃一些请求

为什么需要过载保护:

  • 如果过载服务可能挂掉,不可恢复,处理能力直线下降

如何进行过载保护?

  • 方法1:简单粗暴,超过请求直接丢弃
  • 方法2:根据动态权重方法,增加负载判断逻辑
  • 方法3:Apollo就可以根据请求量来保护

END

你可能感兴趣的:(分布式,分布式,负载均衡,java)