lvs详细配置
lvs(linux virtual server)
1、概述
1、lvs简介
lvs 是一种基于linux操作系统的负载均衡解决方案,就是将请求分发到多个后端服务器上面,lvs常用于网站,数据库等需要高并发访问的场景
2、lvs架构
-
ipvs :lvs的核心组件,负责实现负载均衡
-
调度器: lvs中的负载均衡器,接受来自客户端的请求,并根据调度算法将请求转发到真实的服务器上
-
真实的服务器(readl server): 实际处理客户端请求的服务器
-
虚拟vip : 提供给客户端访问的ip地址,实际有调度器管理的
3、lvs工作模式
1、nat模式
-
工作原理:
- 在nat模式下面,负载均衡器接收到客户端的请求后,将请求转发给真实的服务器,真实服务器处理请求后,将响应的数据发送给负载均衡器,再有负载均衡器返回给客户端。负载均衡器充当了一个中间件的角色
-
优缺点:
-
优点;配置简单,可以隐藏真实的服务器的ip地址
-
缺点:流量都经过负载均衡器,负载均衡器的性能和宽带是瓶颈
-
-
特点:
-
集群和lvs的节点在同一个网络中,并且lvs的dip要充当RS的网关地址
-
lvs这个服务器需要再客户端和后端服务器进行数据转发,也就是ds服务器需要支持ip转发
-
lvs支持端口映射给后端服务器
-
所有流量都通过lvs节点进行转发,导致lvs成为集群瓶颈,nat模式下的单台lvs一般承载10到15台后端服务器,在集群中接收的流量是很少的
-
-
配置的步骤
-
添加虚拟服务
-
添加真实服务器
-
设置真实服务器的网关,后端服务器网关都设置lvs节点的DIP
-
2、DR模式
-
只需要修改mac地址,因此是一个二层的网络
-
DR模式的话,回包的过程,不经过这个lvs节点,直接与客户端进行通信,因此在这个实验中客户端和后端服务器在同一个网络中,就是能直接进行通信的
-
不需要后端服务器的网关设置为lvs上的ip了,回包的时候不经过lvs
-
为什么后端服务器需要配置vip?
-
当客户端访问的时候,经过lvs节点,调度到后端服务器上
-
因为没有修改ip地址,需要192.168.100.88回应,后端服务器上面有vip,因此响应,回包
-
如果后端服务器没有这个vip,会识别到这个ip不是我的,丢弃了
-
-
为什么要配置arp屏蔽?
-
不这样做的话,交换机上面有三个vip地址的mac地址,造成了冲突
-
只需要收集到lvs的vip地址的mac地址
-
-
完整的工作流程(请求+回包)
-
客户端向vip发送请求,数据包信息为: 源ip=客户端ip,目标ip=vip, 源mac=客户端mac,目标mac=路由器的mac地址
-
路由器将数据包转发给lvs(vip配置在lvs,路由表指向了lvs),此时数据包的目标mac更新为lvs的dip对应的mac地址
-
lvs通过负载均衡算法,选中一台后端rs服务器,修改数据包的目标mac地址为这个rs的mac地址,源ip和目标ip地址都不变
-
rs收到数据包后,因为本地配置了vip,能识别到目标ip为自己的ip,正常处理请求
-
rs生成响应数据包,信息为,源ip=vip(自己配置的),目标ip为客户端的ip,源mac地址为自己的rsmac地址,目标mac地址为路由器的mac地址
-
rs通过自身的网关,转发响应包,目标ip是客户端的ip.路由器直接转发到客户端
-
-
这样就是实现了客户端访问目标ip,目标ip回包的流程
-
dr模式的总结
-
发送请求个lvs上面的vip
-
lvs经过调度算法选择一个后端服务器,接收请求,源ip和目的ip都没有变
-
到达了后端服务器,发现目的ip是在我本机上,接收请求,回包
-
此时的源ip为自己本机的vip,目的ip为客户端的
-
从而实现了通信
-
-
配置步骤
-
后端服务器和lvs都需要配置vip地址
-
后端服务器开启arp屏蔽
-
配置lvs规则
-
3、TUNip隧道模式
-
实现方式在dr模式的基础上,封装一层ip报文,报文源ip是lvs的dip,目的ip是lvs根据负载均衡的调度算法选择出来的rip,当请求到达rip后,此时rs根据ip隧道解封装,然后由rs直接处理客户端的响应
-
特点
-
dip和rip不再需要在同一个局域网内,但是dip和rip和vip都是公网地址
-
rs服务器(后端服务器)必须要支持ip隧道协议(ipip隧道,gre隧道,gue隧道),默认使用的是ipip协议
-
ip隧道不支持端口映射
-
4、FULL-NAT模式
-
同时修改请求的源IP和目的IP进行地址转发,因此可以在多个vlan之间进行NAT转发
-
VIP必须是公网地址,RIP和DIP都只能私网地址,并且RIP和DIP通常不应该在一个局域网内,且有多个vlan的环境,所以RIP的网关也不会指向DIP
-
RS收到请求的源地址是来自DIP,因此RIP虽然不指向DIP,但是必须将数据包发给DIP,也就是要响应DIP,最终的所有流量都要通过LVS发送给客户端
4、lvs调度算法
1、轮询(Round Robin)
-
将请求依次分发给每个后端服务器,循环进行
-
每个服务器都能收到一个请求
-
适用场景 适用于负载均衡的较为均衡的场景
2、最小连接数(Least Connections)
-
将请求分发给当前连接数最少的服务器
-
选择用最空闲的服务器来处理请求
-
适用场景 服务器处理时间差异较大的场景
3、加权轮询(Weighted Round Robin)
-
根据服务器权重进行轮询,权重高的服务器分配更多的请求
-
就是服务器的性能最好的,配置最高的服务器,接收大量的请求
-
适用场景 适用于服务器性能差异较大的场景
4、源地址散列(Source Hashing)
-
根据请求的源地址计算哈希值,并将请求分配到对应的服务器
-
类似于将邮件按发件人地址分发到不同的邮局
-
适用场景 适用于固定的源地址请求分配
2、lvs nat模式配置
1、nat模式工作流程
-
客户端访问http://vip(配置在lvs服务器上),数据包为 源ip(客户端的公网ip),目标ip(vip)
-
负载均衡器收到并修改请求包(DNAT),内核模块(ip_vs) 监听到了,根据负载均衡算法,轮询,加权轮询等等,从真实服务器池中选择一台服务器,然后修改这个数据包,将目标ip修改为选中的真实服务器ip,源ip还是客户端
-
真实服务器处理请求,看到的数据包目标ip是自己,源ip是客户端,回包,数据包为 目标ip为客户端,源ip为自己的ip
-
后端服务器网关指向了lvs
-
lvs接收请求并修改数据包(SNAT),修改源ip为vip,目标ip还是客户端,这个伪装的数据包,在客户端看来就是最初请求vip给自己回复的
-
客户端接收响应
2、nat模式配置案例

- 我的案例图

-
三台机器
-
lvs节点: 2个网卡,一个是192.168.50.0/24(与客户端进行通信的),一个是192.168.100.0/24(与后端服务器通信的)
-
后端服务器配置192.168.20.0/24
-
lvs节点,一个网卡与客户端(nat模式)进行通信,另一个网卡与后端服务器通信
| 节点 | ip |
|---|---|
| lvs | 192.168.50.10(nat),192.168.100.10(仅主机) |
| nginx1 | 192.168.100.11 |
| nginx2 | 192.168.100.12 |
1、安装lvs工具,开启内核转发功能
# 这个安装包非常的小
[root@server ~]# yum -y install ipvsadm
# 主配置文件,但是一般不修改
[root@server ~]# rpm -qc ipvsadm
/etc/sysconfig/ipvsadm-config
# 开启ipv4内核转发模块
# 查询是关闭的状态
[root@server ~]# sysctl -a | grep ipv4.ip_forward
net.ipv4.ip_forward = 0
# 永久生效
[root@server ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
# 这个参数意思是开启路由转发,就是lvs修改目标ip为后端服务器ip后,lvs服务器允许目标ip不是自己的数据包通过lvs接口转发出去
# 不开启的话,修改后,就会丢弃
# 立即生效
[root@server ~]# sysctl -p
- 安装之后,不需要启动服务
2、关闭所有节点的防火墙和selinux
# 所有节点上面执行
[root@server ~]# systemctl stop firewalld --now
[root@server ~]# getenforce
Disabled
3、配置lvs和ipvsadm参数讲解
# 创建一个虚拟服务,对外提供服务的地址为192.168.50.20 -s 指定工作模式是轮询
[root@server ~]# ipvsadm -A -t 192.168.50.20:80 -s rr
# 添加后端服务器(真实服务器)
[root@server ~]# ipvsadm -a -t 192.168.50.20:80 -r 192.168.100.11:80 -m
[root@server ~]# ipvsadm -a -t 192.168.50.20:80 -r 192.168.100.12:80 -m
# 查看
[root@server ~]# 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.50.20:80 rr
-> 192.168.100.11:80 Masq 1 0 0
-> 192.168.100.12:80 Masq 1 0 0
-
添加服务里面的参数解释
-
-A: 创建一个虚拟服务
-
-t: 指定协议的tcp地址,对外提供服务的地址+端口(vip),如果是udp的话,就是-u
-
-s: 指定工作模式为轮询,rr就是轮询
-
-
添加后端服务的里面的参数
-
-a:小写a,指定添加的一个服务器
-
-t:跟上面的一样,就是一个服务名
-
-r:后端服务器的地址+端口
-
-m:指定nat模式
-
-i:指定tun模式
-
-g:指定DR模式
-
4、配置后端服务器的nginx网页
echo "welcome nginx1 " > /usr/share/nginx/html/index.html
[root@node2 ~]# cat /usr/share/nginx/html/index.html
welcome nginx2
5、配置后端服务器的网关
-
因为客户端将请求转发到lvs后,lvs将请求转发到后端服务器后,后端服务器访问不到这个vip地址
-
客户端访问192.168.50.20 后端服务器192.168.100.11收到后,返回不了
[root@node2 ~]# nmcli connection modify ens36 ipv4.gateway 192.168.100.10
[root@node1 ~]# nmcli connection modify ens36 ipv4.gateway 192.168.100.10
# 就是回包的时候,走的网关就是192.168.100.10,到达lvs机器后,进行转发到192.168.50.0/24这个网段上面去了
[root@node1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.100.10 0.0.0.0 UG 100 0 0 ens36
192.168.100.0 0.0.0.0 255.255.255.0 U 100 0 0 ens36
6、访问集群
[root@server /]# curl 192.168.50.20
welcome nginx1
[root@server /]# curl 192.168.50.20
welcome nginx2
# cmd中访问不到,因为后端服务器回包时,不能与windows通信
# 查看访问的情况
[root@server ~]# ipvsadm -lnc
IPVS connection entries
pro expire state source virtual destination
TCP 00:16 TIME_WAIT 192.168.50.10:34826 192.168.50.20:80 192.168.100.12:80
TCP 00:15 TIME_WAIT 192.168.50.10:34816 192.168.50.20:80 192.168.100.12:80
TCP 01:27 TIME_WAIT 192.168.50.10:43140 192.168.50.20:80 192.168.100.12:80
TCP 00:17 TIME_WAIT 192.168.50.10:34842 192.168.50.20:80 192.168.100.11:80
TCP 01:28 TIME_WAIT 192.168.50.10:43146 192.168.50.20:80 192.168.100.12:80
TCP 01:28 TIME_WAIT 192.168.50.10:43142 192.168.50.20:80 192.168.100.11:80
TCP 00:15 TIME_WAIT 192.168.50.10:34808 192.168.50.20:80 192.168.100.11:80
TCP 00:16 TIME_WAIT 192.168.50.10:34820 192.168.50.20:80 192.168.100.11:80
TCP 01:29 TIME_WAIT 192.168.50.10:43148 192.168.50.20:80 192.168.100.11:80
-
可以开启另外一个服务器充当客户端
-
配置192.168.50.0/24这个网段,网关指向192.168.50.20
-
就能与后端服务器进行通信了
# 客户端的网关配置
[root@master ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.50.20 0.0.0.0 UG 100 0 0 ens160
192.168.50.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
# 能与后端服务器进行通信
[root@master ~]# ping 192.168.100.11
PING 192.168.100.11 (192.168.100.11) 56(84) bytes of data.
64 bytes from 192.168.100.11: icmp_seq=1 ttl=63 time=0.496 ms
64 bytes from 192.168.100.11: icmp_seq=2 ttl=63 time=0.474 ms
# 所有的网络都是通的
3、lvs DR模式配置
1、dr工作流程
-
vip对外由路由器发布响应,但只有负载均衡器用真实网卡响应vip的arp
-
客户端发送请求,数据包为目标mac(路由器的mac,经过路由后,最终是负载均衡器的mac),目标ip为vip,源ip为客户端的ip地址
-
负载均衡器接收并转发请求
-
vip配置在真实的网卡上面,负载均衡算法选择一台后端服务器
-
修改数据链路层,ip层不变(目标ip是vip,源ip是客户端)
-
只修改mac地址,目标mac修改为选中的后端服务器的mac地址
-
源mac改为lvs的mac地址
-
-
转发给后端服务器,在二层中,所有服务器都在一个二层中,lvs通过arp学习知道后端服务器的mac地址,ip头还没有改变
-
后端服务器处理请求
-
目标mac是自己的mac,目标ip是自己的vip接收
-
生成数据包,源ip是vip(lo接口发出),目标ip是客户端ip
-
不经过负载均衡器,直接发送给路由器
-
-
客户端接收响应,看到源ip是vip,认为是从vip服务器直接回复的


-
实验环境的准备
-
清空上面的nat模式的配置,后端服务器的网关不指向这个lvs的dip,因为不从lvs上面经过
-
2个后端服务器,一个lvs节点,一个客户端
-
后端服务需要能够访问客户端
# ip地址规划
# 全部都是仅主机模式
192.168.100.0/24网段
lvs 192.168.100.10
后端服务器 192.168.100.11 192.168.100.12
vip地址为 192.168.100.88
2、每个节点都配置vip
- lvs,2个后端服务器
[root@node1 ~]# nmcli connection add type dummy ifname dummy2 con-name dummy2 ipv4.method manual ipv4.addresses 192.168.100.88/32 autoconnect yes
[root@node2 ~]# nmcli connection add type dummy ifname dummy2 con-name dummy2 autoconnect yes ipv4.method manual ipv4.addresses 192.168.100.88/32
[root@lvs ~]# nmcli connection add type dummy autoconnect yes ifname dummy2 con-name dummy2 ipv4.method manual ipv4.addresses 192.168.100.88/32
- vip地址配置在本地的环回接口,不会产生ip冲突
3、修改内核参数
[root@lvs ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@lvs ~]# sysctl -p
kernel.sysrq = 0
net.ipv4.ip_forward = 1
4、配置后端服务器的arp
vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.dummy2.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.dummy2.arp_announce=2
-
net.ipv4.conf.all.arp_ignore=1
-
全局配置,影响系统中的所有网卡
-
0 表示任意接口都响应arp请求
-
设置1的话,仅目标ip在本机上才响应arp,但还是会响应arp请求,因为目标ip 192.168.100.88在我的本机上,所有后面还需要添加一个参数
-
-
net.ipv4.conf.dummy2.arp_ignore=1
-
0 表示dummy2接口响应arp请求
-
1 表示dummy2接口不响应arp请求,也就是当请求访问192.168.100.88时,询问谁有的时候,这个接口不会应答
-
-
上面2个配置就是,客户端发送请求,问谁是vip,我们拒绝了,确保了只有lvs节点上面的vip地址回包
-
net.ipv4.conf.all.arp_announce=2
-
全局配置,所有网卡的策略
-
就是交换机在收集mac地址信息的时候,不告诉自己的vip地址
-
使用最匹配(金额目的地址在同一个子网内的)ip地址
-
选择合适的ip地址发送arp请求
-
-
net.ipv4.conf.dummy2.arp_announce=2
- 只影响dummy2接口,与上一条的作用相同,在dummy2接口上面选择最合适的源ip地址
-
上面2个配置,配置arp的通告级别,不告诉别人
-
主要就是防止arp冲突的
# 如果不在后端服务器上面配置的话
# 交换机上面就会有三个vip地址的mac信息,就会冲突,设置之后,只有lvs节点的vip地址的mac信息
5、配置lvs规则
ipvsadm -A -t 192.168.100.88:80 -s rr
ipvsadm -a -t 192.168.100.88:80 -r 192.168.100.11:80 -g
ipvsadm -a -t 192.168.100.88:80 -r 192.168.100.12:80 -g
# 可以看到是router模式
[root@lvs ~]# 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.100.88:80 rr
-> 192.168.100.11:80 Route 1 0 4
-> 192.168.100.12:80 Route 1 0 3
# 可以保存
ipvsadm-save > /etc/sysconfig/ipvsadm
6、客户端测试
[root@lvs ~]# ipvsadm -lnc
IPVS connection entries
pro expire state source virtual destination
TCP 00:15 FIN_WAIT 192.168.100.1:14188 192.168.100.88:80 192.168.100.11:80
[root@client ~]# curl 192.168.100.88
welcome nginx2
[root@client ~]# curl 192.168.100.88
welcome nginx1
3、ipvsadm命令介绍
1、命令介绍
[root@server ~]# ipvsadm --help
ipvsadm v1.31 2019/12/24 (compiled with popt and IPVS v1.2.1)
Usage: # 这个是案例,怎么使用的具体案例
ipvsadm -A|E virtual-service [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
ipvsadm -D virtual-service
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e virtual-service -r server-address [options]
ipvsadm -d virtual-service -r server-address
ipvsadm -L|l [virtual-service] [options]
ipvsadm -Z [virtual-service]
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon {master|backup} [daemon-options]
ipvsadm --stop-daemon {master|backup}
ipvsadm -h
Commands:
Either long or short options are allowed.
--add-service -A add virtual service with options # 添加一个虚拟服务
--edit-service -E edit virtual service with options # 编辑一个虚拟服务
--delete-service -D delete virtual service # 删除一个虚拟服务
--clear -C clear the whole table # 清空整个ipvsadm规则
--restore -R restore rules from stdin
--save -S save rules to stdout
--add-server -a add real server with options # 添加一个真实服务器
--edit-server -e edit real server with options
--delete-server -d delete real server # 删除一个真实的服务
--list -L|-l list the table # 列出ipvsadm规则
virtual-service:
--tcp-service|-t service-address service-address is host[:port] # tcp连接
--udp-service|-u service-address service-address is host[:port] # udp连接
--sctp-service service-address service-address is host[:port]
--fwmark-service|-f fwmark fwmark is an integer greater than zero
Options:
--ipv6 -6 fwmark entry uses IPv6
--scheduler -s scheduler one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq|fo|ovf|mh,
the default scheduler is wlc. # -s 调度模式,轮询或者其他的
--pe engine alternate persistence engine may be sip,
not set by default.
--persistent -p [timeout] persistent service
--netmask -M netmask persistent granularity mask
--real-server -r server-address server-address is host (and port) # 真实服务器ip和端口信息
- 常见的操作
ipvsadm -A -t 192.168.50.20:80 -s rr # 添加一个虚拟服务
ipvsadm -a -t 192.168.50.20:80 -r 192.168.100.11:80 -m # 添加一个后端服务器
永久保存
- 永久保存命令后,保存在ipvsadm这个配置文件,关机后,下次连接后,重启ipvsadm服务,就会读取这个配置文件,加载ipvsadm信息
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
4、其他
1、lvs nat模式做端口转发
-
就是访问192.168.50.20:8888 转发到后端服务器的192.168.100.11:22端口上面去,实现远程登录
-
那么怎么实现呢,看下面
-
lvs配置2个网卡,后端服务器192.168.100.0/24
-
-
lvs节点配置
[root@server ~]# ipvsadm -A -t 192.168.50.20:8888 -s rr
[root@server ~]# ipvsadm -a -t 192.168.50.20:8888 -r 192.168.100.11:22 -m
- 远程连接
[C:\~]$ ssh 192.168.50.20 8888
5、总结
1、nat和dr模式区别
-
nat模式的核心就是将后端服务器的网关设置为lvs上面的dip,lvs节点开启ip地址转发
-
nat支持端口映射
-
dr模式的配置,都是同一个网段,然后后端服务器通信这个客户端,关掉arp广播等等
| 特性 | NAT 模式 | DR 模式 |
|---|---|---|
| 响应路径 | 经过负载均衡器 | 直接返回客户端 |
| 负载均衡器压力 | 处理双向流量 | 只处理入站请求 |
| 网络要求 | 可跨网段 | 必须在同一二层网络 |
| 真实服务器配置 | 简单(改网关) | 复杂(配置VIP和ARP) |
| 性能 | 较低(有瓶颈) | 极高 |
| 真实服务器网关 | 指向 DIP | 指向真实路由器 |
| IP包修改 | 修改IP地址 | 只修改MAC地址 |
| 支持端口映射 | 支持 | 不支持 |
2、DR模式
-
后端服务器回包的时候不经过这个LVS节点
-
工作流程
3、NAT模式
-
后端服务器回包的时候经过这个lvs节点
-
工作流程
2、实际生产环境中
- dr模式

- nat模式


- 高可用和lvs


浙公网安备 33010602011771号