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模式配置案例

img

  • 我的案例图

img

  • 三台机器

  • 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服务器直接回复的

img

img

  • 实验环境的准备

  • 清空上面的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模式

img

  • nat模式

img

img

  • 高可用和lvs

img

posted @ 2025-11-18 20:41  乔的港口  阅读(93)  评论(0)    收藏  举报