浅谈负载均衡

简介: 高并发下的负载均衡

1、 前言

负载均衡,英文:Load Balance,其含义是请求分发到多个粒度单元上进行执行操作,例如各种服务器、应用服务、中台服务、数据服务等,从而达到共同完成某项任务的目的。为了拓宽网络设备和服务器的带宽、增加吞吐量、加强网络请求处理能力、提高网络的灵活性和高可用性,负载均衡是一种廉价、有效、透明的方法,它为服务的高并发做了一次缓冲,让单个服务的压力瞬间减少,实现了服务的高可用,避免服务因为压力而面临宕机的危险。

2、负载均衡

2.1 基于网络的负载均衡

大家都知道,OSI 模型有 7 层结构,每层都可以有几个子层。OSI 的 7 层从上到下分别是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层:

在这七层结构中,高层次都是依赖于低层次的。层次越高,使用起来越方便。

根据负载均衡技术实现在 OSI 七层模型的不同层次,是可以给负载均衡分类的。

常见的实现方式中,主要可以在应用层、传输层、网络层和数据传输层做文章。所以,工作在应用层的负载均衡,我们通常称之为七层负载均衡、工作在传输层的我们称之为四层负载均衡。我们一个个来看看:

七层负载均衡

七层负载均衡工作在 OSI 模型的应用层,应用层协议较多,常用 http、dns、ftp 等。七层负载就可以基于这些协议来负载。这些应用层协议中会包含很多有意义的内容。比如同一个 Web 服务器的负载均衡,除了根据 IP 加 port 进行负载外,还可根据 URL 来决定是否要进行负载均衡。

四层负载均衡

四层负载均衡工作在 OSI 模型的传输层,由于在传输层,只有 TCP/UDP 协议,这两种协议中除了包含源 IP、目标 IP 以外,还包含源端口及目的端口。四层负载均衡服务器在接受到客户端请求后,以后通过修改数据包的地址信息(IP+端口号)将流量转发到应用服务器。

2.2 负载均衡工具

负载均衡的工具,常见的有 Nginx、k8s、Ribbon、Feign、HAProxy 等。

Nginx

Nginx 主要用来作七层负载均衡,反向代理 http、https 的协议链接,同时也提供了 IMAP/POP3/SMTP 的服务。

upstream proxy_demo_aaa {
  server {{DEMO_SERVER_NODE1}} weight=5;
  server {{DEMO_SERVER_NODE2}} weight=6;
}

location ~ ^/demo-aaa/api(.*)$ {
  proxy_pass http://proxy_demo_aaa/api$1$is_args$args;
}

k8s

k8s 的负载均衡是基于 kube-proxy,其服务发现基于 kube-dns,最后由于每个 Service 对应的 pod 可以是多个,所以可以基于 kube-proxy 实现负载均衡,kube-proxy 进程其实就是一个智能的软件负载均衡器,他负责把 service 的请求转发到后端的某个 pod 实例。

Ribbon

Ribbon 是一个为客户端提供负载均衡功能的服务,它内部提供了一个叫做 ILoadBalance 的接口代表负载均衡器的操作,比如有添加服务器、选择服务器、获取所有的服务器列表、获取可用的服务器列表等等。

常见的,使用 RestTemplate 进行服务提供者、服务消费者之间的通信,只需为 RestTemplate 配置类添加@LoadBalanced 注解即可。

@Bean
@LoadBalanced
  public RestTemplate restTemplate() {
  return new RestTemplate();
}

Feign

Feign 是一个声明式负载均衡客户端使用 Feign 能让编写 WebService 的客户端更加简单,它的使用方法是定义一个接口,然后在上面添加注解,同时也支持 JAX-RS 标准的注解。Feign 也支持可拔插式的编码器和解码器。

@FeignClient(name = "provider-service", configuration = {Feign4HttpConfiguration.class, FeignLogConfiguration.class}, fallback = CustomerClientImpl.class)
public interface CustomerClient {

    @PostMapping("/save")
    String save();

    @GetMapping("/api/user/getUserInfo")
    Response<Object> getUserInfo();
}

HAProxy

HAProxy 是一个使用 C 语言编写的自由、开放源代码软件,其提供高可用性、负载均衡,以及基于 TCP 和 HTTP 的应用程序代理的功能。

2.3 负载均衡算法

常见的几种负载均衡的算法有:随机、轮询、最少链接、Hash、加权、重试等。

随机:即请求随机分配到各台服务器上,这是默认的策略机制。

轮询:将所有请求,依次分发到每台服务器上,适合服务器硬件相同的场景,服务请求数相同。

最少链接:将本次请求分配到请求数最少的服务上,这种可以根据服务器当前的请求处理情况,动态分配。

Hash:根据 IP 地址进行 Hash 计算,得到 IP 地址,这种可以将来自同一 IP 地址的请求,同一会话期内,转发到同一服务器;实现会话粘滞。但目标服务器宕机后,会话也会随之丢失。

加权:在上面几种算法基础上,进行一定的加权比例分配。

重试:这种策略一般都会有,就是在调用失败后,进行二次重试机制。

当然,还有其他的动态的算法规则:最快模式、观察模式、动态性能分配等。

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
1天前
|
弹性计算 运维 负载均衡
负载均衡介绍
阿里云负载均衡SLB介绍
11 1
|
7月前
|
负载均衡 网络协议 算法
对负载均衡的全面理解
对负载均衡的全面理解
52 1
|
负载均衡 算法 网络协议
|
缓存 负载均衡 算法
负载均衡浅谈
在互联网尤其是移动互联网行业中一旦用户量达到一定数量级别之后,会面对高并发和海量数据的挑战,面对这种挑战必须提升系统整体的性能,可以采用垂直扩展和水平扩展两种方式。负载均衡是一种水平扩展的方式,它是建立在现有网络结构之上,它提供了一种有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
171 0
负载均衡浅谈
|
弹性计算 负载均衡 Linux
集群及负载均衡
对比基于反向代理的负载均衡与阿里云的负载均衡服务
|
负载均衡 前端开发 应用服务中间件
负载均衡的介绍 | 学习笔记
快速学习负载均衡的介绍
99 0
负载均衡的介绍 | 学习笔记
|
负载均衡 Java 应用服务中间件
负载均衡介绍|学习笔记
快速学习负载均衡介绍
67 0
负载均衡介绍|学习笔记
|
缓存 负载均衡 网络协议
负载均衡是什么?
负载均衡知识介绍
245 1
|
弹性计算 负载均衡 算法
记一次负载均衡的配置和使用
负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。 负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。
134 0
记一次负载均衡的配置和使用
|
域名解析 缓存 负载均衡
简单聊聊负载均衡的那些事
负载均衡(Load balance,LB),是一种计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。
194 1
简单聊聊负载均衡的那些事

相关实验场景

更多