LVS介绍与配置

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: LVS介绍与配置

目录

LVS(Linux Virtual Server)

我会先写工作原理然后再写配置步骤,配置步骤不懂的可以再返回来看一下工作原理

1. 概述

1.1 LVS简介

LVS(Linux Virtual Server)是一种基于Linux操作系统的负载均衡解决方案。它通过将请求分发到多个后端服务器上,实现高可用性和可扩展性。LVS常用于网站、数据库等需要高并发访问的场景。

1.2 LVS架构

  • IPVS(IP Virtual Server): LVS的核心组件,负责实现负载均衡功能。
  • 调度器(Director): LVS中的负载均衡器,接收来自客户端的请求,并根据调度算法将请求转发到真实服务器。
  • 真实服务器(Real Server): 实际处理客户端请求的服务器。
  • 虚拟IP(VIP): 提供给客户端访问的IP地址,实际由调度器管理。

2. LVS工作模式

2.1 NAT模式(Network Address Translation)

  • 工作原理
  • 在NAT模式下,负载均衡器(调度器)接收客户端的请求,然后将请求转发给真实服务器,真实服务器处理请求后,将响应数据发送回负载均衡器,再由负载均衡器返回给客户端。负载均衡器充当了中间人的角色,类似于邮递员收集信件并分发给不同的地址,再将回复的信件送回给发件人。
  • 优缺点:
  • 优点: 适用于私有网络,配置简单。可以隐藏真实服务器的IP,增加安全性。
  • 缺点: 由于所有流量都经过负载均衡器,负载均衡器的性能和带宽成为瓶颈。
  • 配置步骤
  • 添加虚拟服务
  • 添加真实服务器
  • 设置真实服务器的网关

2.2 DR模式(Direct Routing)

  • 工作原理
  • 在DR模式下,客户端请求通过负载均衡器发送到真实服务器,但真实服务器的响应直接返回给客户端,而不经过负载均衡器。可以将其类比为一个快递公司的调度中心(负载均衡器),负责将快递单(请求)分配给不同的快递员(真实服务器),但快递员直接将快递(响应)送到客户手中。
  • 优缺点:
  • 优点: 高性能,因为响应数据不经过负载均衡器,减少了负载均衡器的负担,适合大流量场景。
  • 缺点: 网络配置复杂,要求负载均衡器和真实服务器在同一物理网络中。
  • 配置步骤
  • 添加虚拟服务
  • 添加真实服务器
  • 配置真实服务器的回环接口(lo)

2.3 TUN模式(IP Tunneling)

  • 工作原理: 在TUN模式下,客户端请求通过IP隧道(如GRE隧道)从负载均衡器发送到真实服务器,真实服务器处理请求后,直接将响应数据返回给客户端。这类似于通过地下通道(隧道)将信件送到目标地点,目标地点直接回复信件。
  • 优缺点:
  • 优点: 适用于跨网络负载均衡,负载均衡器和真实服务器可以在不同的物理网络中。
  • 缺点: 网络配置复杂,需要隧道支持,增加了网络管理的复杂性。
  • 配置步骤
  • 添加虚拟服务
  • 添加真实服务器
  • 配置真实服务器的隧道接口(tunl0)

3. LVS调度算法

3.1 轮询(Round Robin)

  • 简介: 将请求依次分发给每个真实服务器,循环进行。
  • 工作原理: 类似于轮流发牌,每个服务器依次收到一个请求。
  • 适用场景: 适用于负载较为均衡的场景。

3.2 最小连接数(Least Connections)

  • 简介: 将请求分发给当前连接数最少的服务器。
  • 工作原理: 类似于选择最空闲的售货员来处理顾客。
  • 适用场景: 适用于服务器处理时间差异较大的场景。

3.3 加权轮询(Weighted Round Robin)

  • 简介:根据服务器权重进行轮询,权重高的服务器分配更多的请求。
  • 工作原理: 类似于根据员工的工作能力分配任务,能力强的分配更多任务。
  • 适用场景: 适用于服务器性能差异较大的场景

3.4 加权最小连接数(Weighted Least Connections)

  • 简介: 将请求分发给当前连接数最少且权重最高的服务器。
  • 工作原理: 类似于在最空闲的售货员中选择最有经验的来处理顾客。
  • 适用场景: 适用于服务器性能和处理时间差异都较大的场景。

3.5 基于局部性的最少连接数(Locality-Based Least Connections)

  • 简介: 优先将请求分配给之前处理过相同客户端请求的服务器。
  • 工作原理: 类似于优先选择熟悉客户需求的售货员。
  • 适用场景: 适用于需要会话保持的场景,如购物车、在线交易等。

3.6 基于局部性的最少连接数(带复制)(Locality-Based Least Connections with Replication)

  • 简介: 在基于局部性的最少连接数基础上,考虑了服务器复制问题,防止某一服务器过载。
  • 工作原理: 类似于多个售货员同时处理同一客户的需求,但优先选择最空闲的。
  • 适用场景: 适用于大规模分布式系统。

3.7 目标地址散列(Destination Hashing)

  • 简介: 根据请求的目标地址计算哈希值,并将其分配到对应的服务器。
  • 工作原理: 类似于将邮件按邮政编码分发到不同的邮局。
  • 适用场景: 适用于固定的目标地址请求分配。

3.8 源地址散列(Source Hashing)

  • 简介: 根据请求的源地址计算哈希值,并将其分配到对应的服务器。
  • 工作原理: 类似于将邮件按发件人地址分发到不同的邮局。
  • 适用场景: 适用于固定的源地址请求分配。

4. LVS配置示例

4.1 NAT模式配置示例

节点 IP
LVS 192.168.200.170(public)
192.168.100.164(internal)
Nginx01 192.168.100.163
Nginx02 192.168.100.162

通过这个规划表大家就可以看出来,提供服务的Nginx是在一个内网里面,客户端不可能访问到的,接下来看需求

  • 需求:LVS有2个网卡,一个为对外提供服务的网卡,网段为192.168.200.0/24,另一个是连接内部真实服务器的IP段192.168.100.0/24,现在要求配置LVS,使得客户端访问192.168.200.170:80,然后LVS会根据轮询策略来将请求转发到对应的Nginx服务器上

4.1.1 安装LVS工具,开启内核转发模块

[root@oe01 ~]# yum install ipvsadm -y
[root@oe01 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@oe01 ~]# sysctl -p
net.ipv4.ip_forward = 1

安装就只需要安装这个包就可以了,不需要启动任何服务

4.1.2 关闭所有节点的防火墙,selinux

# 所有节点执行这些命令
[root@oe01 ~]# systemctl disable --now firewalld
[root@oe01 ~]# setenforce 0

4.1.3 配置LVS

# 1. 添加虚拟服务
[root@oe01 ~]# ipvsadm -A -t 192.168.200.170:80 -s rr
# 2. 添加真实服务器
[root@oe01 ~]# ipvsadm -a -t 192.168.200.170:80 -r 192.168.100.163:80 -m 
[root@oe01 ~]# ipvsadm -a -t 192.168.200.170:80 -r 192.168.100.162:80 -m
# 查看
[root@oe01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.200.170:80 rr
  -> 192.168.100.162:80           Masq    1      0          0         
  -> 192.168.100.163:80           Masq    1      0          0

这样LVS就配置好了,我们来解释一下参数

  • 第一步添加服务里面的参数解释
  • -A : 创建一个虚拟服务(service)
  • -t :指定协议为tcp 地址为192.168.200.170:80,这个就是对外提供服务的地址+端口,如果是UDP的话就是 -u
  • -s :指定工作模式为轮询,rr就是轮询
  • 第二步的参数:
  • -a:这是是小写a,指定的是添加一个服务器(server)
  • -t:这个还是与之前的一样,可以换一个理解方式,把他理解成服务名,因为在LVS里面这个就可以代表服务名
  • -r:real-server真实服务器的地址+端口
  • -m:指定NAT模式
  • -i: 指定Tun模式
  • -g: 指定DR模式

到这里,我们LVS上的操作就做完了,然后我们需要到Nginx上配置

4.1.4 配置nginx

我们将2个nginx的index.html文件改为hello,nginx01hello nginx02

# 第一台nginx
[root@oe02 ~]# echo "hello nginx01" > /usr/share/nginx/html/index.html
# 第二台nginx
[root@oe03 ~]# echo "hello nginx02" > /usr/share/nginx/html/index.html

这样我们的Nginx就配置好了,但是你现在使用客户端去访问192.168.200.170这个地址的话是出不来的,我们还需要给nginx配置网关,网关指向LVS的192.168.100.164这个地址

4.1.5 配置网关

[root@oe02 ~]# ip route add default via 192.168.100.100 dev ens33
[root@oe03 ~]# ip route add default via 192.168.100.100 dev ens33

这样我们的配置也完成了,我们来使用客户端访问一下

4.1.6 访问集群

C:\Users\86156>curl 192.168.200.170
hello nginx01
C:\Users\86156>curl 192.168.200.170
hello nginx02
C:\Users\86156>curl 192.168.200.170
hello nginx01
C:\Users\86156>curl 192.168.200.170
hello nginx02

看这个命令提示符就可以看出来,我们访问已经被轮询到不同的节点上了,我们可以在LVS节点上看见连接

[root@oe01 ~]# ipvsadm -lnc
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:04  TIME_WAIT   192.168.200.1:56457 192.168.200.170:80 192.168.100.162:80
TCP 01:04  TIME_WAIT   192.168.200.1:56455 192.168.200.170:80 192.168.100.163:80
TCP 01:02  TIME_WAIT   192.168.200.1:56453 192.168.200.170:80 192.168.100.162:80
TCP 01:05  TIME_WAIT   192.168.200.1:56458 192.168.200.170:80 192.168.100.163:80

到这里NAT模式就配置结束了

4.2 DR模式配置实例

节点 IP 网卡模式
LVS 192.168.200.170
192.168.200.200(VIP)
NAT模式
Nginx01 192.168.200.171
192.168.200.200(VIP)
NAT模式
Nginx02 192.168.200.172
192.168.200.200(VIP)
NAT模式

4.2.1 配置VIP

首先每个节点都要配置一个VIP

[root@oe01 ~]# nmcli connection add type dummy ifname dummy02 con-name dummy02 ipv4.method manual ipv4.addresses 192.168.200.200/32 autoconnect yes
[root@oe02 ~]# nmcli connection add type dummy ifname dummy02 con-name dummy02 ipv4.method manual ipv4.addresses 192.168.200.200/32 autoconnect yes
[root@oe03 ~]# nmcli connection add type dummy ifname dummy02 con-name dummy02 ipv4.method manual ipv4.addresses 192.168.200.200/32 autoconnect yes

这个dummy就是一个本地的环回口,所有的节点的这个地址都配置的相同,因为这是个本地环回口,不会产生IP冲突,就像你的电脑的127.0.0.1一样,所以不用担心IP冲突

4.2.2 修改内核参数

以下操作在LVS配置

# 开启IP转发
[root@oe01 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@oe01 ~]# sysctl -p
net.ipv4.ip_forward=1

LVS的配置就完成了,接下来修改后端Nginx的内核

以下操作在RS(真实服务器)上,每个RS都要做

[root@oe02 ~]# vim /etc/sysctl.conf
net.ipv4.conf.dummy02.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.dummy02.arp_announce = 2
  1. net.ipv4.conf.dummy02.arp_ignore = 1
  • 作用:当收到一个ARP请求时,如果该请求的目标IP地址不是该网卡上的本地地址,则忽略此请求。
  • 通俗解释:这条配置会让dummy02这个网卡只响应那些明确指向它自己IP地址的ARP请求,避免不必要的ARP响应。
  1. net.ipv4.conf.all.arp_ignore = 1
  • 作用:全局设置,影响系统中所有的网卡。所有网卡都会忽略那些目标IP地址不是自己IP的ARP请求。
  • 通俗解释:这让整个系统的所有网卡只对直接发给它们IP地址的ARP请求做出响应,增加安全性和网络性能。
  1. net.ipv4.conf.all.arp_announce = 2
  • 作用:全局设置,控制系统在发送ARP请求时的源IP地址选择策略。设置为2表示使用最匹配的(即与目的地在同一子网内的)IP地址。
  • 通俗解释:这可以减少网络中出现ARP冲突的可能性,因为系统会选择最合适的IP地址来发送ARP请求。
  1. net.ipv4.conf.dummy02.arp_announce = 2
  • 作用:仅影响dummy02网卡,作用与上一条相同,即在dummy02网卡上发送ARP请求时也使用最匹配的源IP地址。
  • 通俗解释:这让dummy02网卡在发送ARP请求时更精确地选择它的源IP地址,减少网络中可能的冲突。

4.2.3 配置LVS

在LVS节点上

[root@oe01 ~]# ipvsadm -A -t 192.168.200.200:80 -s rr
[root@oe01 ~]# ipvsadm -a -t 192.168.200.200:80 -r 192.168.200.171:80 -g
[root@oe01 ~]# ipvsadm -a -t 192.168.200.200:80 -r 192.168.200.172:80 -g
  • -g:是指定路由模式,也就是DR

所有的配置就做完了,接下来我们验证一下

4.2.4 客户端验证

C:\Users\86156>curl 192.168.200.200
hello nginx01
C:\Users\86156>curl 192.168.200.200
hello nginx02
C:\Users\86156>curl 192.168.200.200
hello nginx01
C:\Users\86156>curl 192.168.200.200
hello nginx02

客户端可以成功访问到后端的nginx,配置就做好了

4.3 配置永久生效

刚刚我们写的那些LVS的配置都是临时生效的,重启之后就不存在了,想要他永久生效的话可以执行一条命令让他生成一个文件,然后开启服务就可以了

[root@oe01 ~]# ipvsadm --save  > /etc/sysconfig/ipvsadm
[root@oe01 ~]# cat /etc/sysconfig/ipvsadm
-A -t oe01:http -s rr
-a -t oe01:http -r 192.168.200.171:http -g -w 1
-a -t oe01:http -r 192.168.200.172:http -g -w 1
[root@oe01 ~]# systemctl enable --now ipvsadm
Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.

本文来自博客园,作者:FuShudi,转载请注明原文链接:https://www.cnblogs.com/fsdstudy/p/18286692

分类: Euler , Euler / HCIP / LB

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
7月前
|
运维 算法 Linux
LVS详解(四)——LVS安装与配置命令
LVS详解(四)——LVS安装与配置命令
132 2
|
5月前
|
负载均衡 网络协议 算法
使用IPVSADM配置LVS负载均衡
使用IPVSADM配置LVS负载均衡
|
7月前
|
负载均衡 监控 调度
Keepalived+Lvs(dr)调度器主备配置小实验
Keepalived和LVS(Linux Virtual Server)是两个常用的开源软件,通常结合使用以提供高可用性和负载均衡的解决方案。 Keepalived是一种用于实现高可用性的软件,它可以监控服务器的健康状态,并在主服务器出现故障时自动切换到备份服务器。
218 2
|
监控 网络协议 数据安全/隐私保护
高可用 - 05 Keepalived配置(全局配置、VRRPD、LVS)
高可用 - 05 Keepalived配置(全局配置、VRRPD、LVS)
631 0
|
负载均衡 Linux Docker
LVS+keepalived配置高可用架构和负载均衡机制(2)
LVS+keepalived配置高可用架构和负载均衡机制(2)
261 0
|
负载均衡 网络协议 前端开发
LVS+keepalived配置高可用架构和负载均衡机制(1)
LVS+keepalived配置高可用架构和负载均衡机制(1)
745 1
|
负载均衡 并行计算 算法
Lvs-负载均衡配置 NAT与DR模式
Lvs-负载均衡配置 NAT与DR模式
392 1
Lvs-负载均衡配置 NAT与DR模式
|
负载均衡
|
网络协议
KEEPALIVED 做LVS+HA实例安装与配置
--------------------------------------master------------------------------------------------------- wget http://www.
1039 0
|
移动开发 网络协议 Shell
LVS+KEEPALIVED 安装与配置实例
--------------------------------------master--------------------------------------- echo "1" > /proc/sys/net/ipv4/ip_forward wget http://www.
1318 0