1.基本概念
高并发的通用方法:缓存(利用高速存储提升查询速度)+异步(利用消息队列将额外操作剔除出主流程)+横向扩展
横向扩展栗子:将数据库配置成1写多读,为读请求提供不同的从库
因为将一个节点横向扩充成多个节点后,需要一个能够将请求均均衡的分配到不同节点上=负载均衡(负载均衡器作为流量的入口)
常见的负载均衡组件:Nginx
2.负载均衡服务器种类
负载均衡的含义:将访问的请求均衡的分配到多个处理节点上,减少单个节点请求量,提升整体系统的性能+屏蔽细节,业务方无感知
分类=代理类的负载均衡服务+客户端负载均衡服务
2.1代理类的负载均衡服务(router层,将大量请求梳理后分发)
LVS在OSI网络模型中的第四层,四层负载
Nginx运行在OSI网络模型中的第七层,七层负载
LVS(大流量的请求分发,分发到不同的Nginx机器上)+Nginx(URL 服务维度的请求分发)联合使用
LVS=在网络栈的四层做请求包的转发,转发后客户端和后端服务直接建立连接,后续响应不经过LVS服务器(与实际处理服务的服务器直连)(比Nginx性能更高)
但是其在第四层,不能针对URL进行更细致的转发
同时没有探活的机制
Nginx配置上更灵活,可以感知后端服务是否出现问题
2.2客户端负载均衡服务(inrouter层,disf)
部署在客户端进程中,提供多种选择节点的策略,同时还要结合服务注册与发现
3.常见的负载均衡策略
负载均衡策略:静态策略(不考虑服务运行状况)+动态策略(依赖一些特性进行负载均衡)
3.1轮训 RR
每次记录下请求序号,通过序号将其分配到对应节点
存在的问题:请求平均分配到服务节点上,但是不能根据实际情况进行配置
解决:加权轮训
3.2其他轮训算法
Nginx 提供了 ip_hash 和 url_hash 算法
LVS 提供了按照请求的源地址和目的地址做 Hash 的策略
Dubbo 也提供了随机选取策略以及一致性 Hash 的策略
3.3动态策略(更贴合实际)
在负载均衡服务器上会收集对后端服务的调用信息(活跃连接数、调用的响应时间...)
Dubbo 提供的 LeastAcive 策略,就是优先选择活跃连接数最少的服务
Spring Cloud 全家桶中的 Ribbon 提供了 WeightedResponseTimeRule 是使用响应时间给每个服务节点计算一个权重,然后依据这个权重,来给调用方分配服务节点
4.如何监测节点是否故障
对于inrouter层,可以通过服务节点定期先注册中心发送心跳包进行
如何保证router层服务节点可用
淘宝开源的 Nginx 模块nginx_upstream_check_module了,这个模块可以让 Nginx 定期地探测后端服务的一个指定的接口,然后根据返回的状态码来判断服务是否还存活
当探测不存活的次数达到一定阈值时,就自动将这个后端服务从负载均衡服务器中摘除
server 192.168.1.1:8080;
server 192.168.1.2:8080;
check interval=3000 rise=2 fall=5 timeout=1000 type=http default_down=true;
//检测间隔为3秒,检测超时时间是1秒,使用http协议。
//如果连续失败次数达到5次就认为服务不可用;如果连续成功次数达到2次,则认为服务可用。后端服务刚启动时状态是不可用的
check_http_send "GET /health_check HTTP/1.0\r\n\r\n"; //检测URL
check_http_expect_alive http_2xx; //检测返回状态码为200时认为检测成功
}
每个服务需要实现/health_check,并返回响应的状态码
通过将服务的状态码进行变更,进行Nginx的上下线
odin上线时,节点会等到所有服务请求结束后重启服务器并部署(猜的)
5.总结
LVS+Nginx都是负载均衡,功能和作用不一样
优先使用动态的分配策略(轮训)
可以在Nginx中引入nginx_upstream_check_module,Nginx保证可以探活