25提升系统横向扩展能力(负载均衡)

322 阅读4分钟

1.基本概念

高并发的通用方法:缓存(利用高速存储提升查询速度)+异步(利用消息队列将额外操作剔除出主流程)+横向扩展

横向扩展栗子:将数据库配置成1写多读,为读请求提供不同的从库

因为将一个节点横向扩充成多个节点后,需要一个能够将请求均均衡的分配到不同节点上=负载均衡(负载均衡器作为流量的入口)

常见的负载均衡组件:Nginx

2.负载均衡服务器种类

负载均衡的含义:将访问的请求均衡的分配到多个处理节点上,减少单个节点请求量,提升整体系统的性能+屏蔽细节,业务方无感知

分类=代理类的负载均衡服务+客户端负载均衡服务

2.1代理类的负载均衡服务(router层,将大量请求梳理后分发)

LVS在OSI网络模型中的第四层,四层负载

Nginx运行在OSI网络模型中的第七层,七层负载

LVS(大流量的请求分发,分发到不同的Nginx机器上)+Nginx(URL 服务维度的请求分发)联合使用

LVS=在网络栈的四层做请求包的转发,转发后客户端和后端服务直接建立连接,后续响应不经过LVS服务器(与实际处理服务的服务器直连)(比Nginx性能更高)

但是其在第四层,不能针对URL进行更细致的转发

同时没有探活的机制

Nginx配置上更灵活,可以感知后端服务是否出现问题

image.png

2.2客户端负载均衡服务(inrouter层,disf)

部署在客户端进程中,提供多种选择节点的策略,同时还要结合服务注册与发现

image.png

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保证可以探活