lvs三种模式的工作原理、lvs的DR模式和NAT模式配置http负载均衡

Linux lvs三种模式工作原理

LVS:Linux Virtual Sevser,Linux虚拟服务器,由章文嵩先生成立的有关负载均衡的开源项目。基于Linux内核。优化后并发量可以达到百万级。

NAT模式

NAT(Network Address Translation)网络地址转换,内网主机可以通过路由NAT实现访问外网主机。

lvs组件和slb组件 lvs三种模式区别详解_http

  1. client请求资源,当报文到达director时,源和目标IP是CIP-VIP,IPVS会强行修改目标地址为RIP,将报文从INPUT发向POSTROUTING,源和目标IP修改为CIP-RIP,RS验证目标地址是本地地址,则接受报文并处理请求。
  2. RS响应请求,由于请求报文源IP是CIP,所以响应报文的目标IP是CIP;将响应报文发送给网关director后,director会通过SNAT将源IP修改为VIP,这样client才可以明确是响应它请求报文的数据包。
    特点:
  • director与RS必须在同一个局域网呢
  • RS的网关必须指向director的私网DIP。
  • 请求和响应报文都需要director转发,会成为整个系统的瓶颈。
  • 支持端口映射,client访问80端口,director可以映射到RS的8080端口上。
  • director必须是Linux系统。
  • director需要两个网卡,一个与互联网通信的公网VIP,一个与RS通信的私网DIP。
TUN模式

IP隧道技术又称IP封装,在源和目标IP地址的基础上,利用新的源和目标IP地址对数据报文进行第二次封装。

lvs组件和slb组件 lvs三种模式区别详解_IP_02

  1. client请求资源,源和目标IP为CIP-VIP的报文到达director,IPVS会利用隧道技术将DIP-RIP封装在请求报文中,经POSTROUTING链发送至RS,RS本地需要配置tunl0地址为VIP,当RS接收到报文,二次封装的目标地址RIP为本地eth0地址,原始目标地址VIP为本地tunl0地址,所以RS就会认定是发送给自己的数据包,就会处理请求。
  2. RS响应请求,由于请求报文源和目标IP是CIP-VIP,所以响应报文的源和目标地址应为VIP-CIP;此时报文会经由RS的网关路由一直送达client。
    特点:
  • VIP、DIP、RIP都是公网IP。
  • RS网关不会也不能指向DIP。
  • 请求报文经过director,响应报文直接由RS发送给client,director不再成为系统瓶颈。
  • RS必须支持隧道技术。
  • 不支持端口映射。
DR(direct route)模式

lvs组件和slb组件 lvs三种模式区别详解_IP_03

  1. client请求资源,请求报文经过路由到达交换机,然后交换机查看目标IP为VIP,则修改源和目标MAC后再封装报文发送给director,IPVS则将报文源MAC修改为DIP的MAC地址,目标MAC修改为RIP的MAC地址,然后经POSTROUTING链发送出去,通过交换机转送给RS。DR模式会lo接口上配置一个虚拟地址VIP,当RS收到报文拆封发现目标MAC地址是自己,目标IP地址也是自己的lo地址VIP,就会处理请求。
  2. RS响应请求,由于请求报文的目标IP是VIP,所以响应报文就通过lo接口传送到eth0网卡发出。
    特点:
  • 保证前端路由将目标地址为VIP的报文全部发送给DS,而不是RS
  • RS的RIP可以使用私有地址,但也可以使用公网地址
  • RS和director必须在同一物理网络中
  • 请求报文有director调度,但响应报文不一定经由director
  • 不支持端口映射
  • RS的网关不能指向DIP

调度算法:

  • rr,轮询算法(round robin),调度器会将所有的请求平均分配给每个服务器。
  • wrr,加权轮询(weight round robin),给每个RS分配权重比例。
  • lc,最小连接(least connections),把新请求分配到当前连接数最小的服务器上,,集群系统的真实服务器具有相近的系统性能,采用最小连接调度算法可以比较好地均衡负载
  • wlc,加权最小连接(weight least connections),在lc算法上为每台服务器分配上权重比例。

lvs的DR模式配置http负载均衡

环境:

名称

IP

LVS服务器(DR)

192.168.72.138

apache服务器(RS-1)

192.168.72.135

apache服务器(RS-2)

192.168.72.131

1.DR上配置IP
[root@DR ~]# ip addr add 192.168.72.200/32 dev eth0
[root@DR ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:2e:a5:d7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.72.138/24 brd 192.168.72.255 scope global dynamic noprefixroute eth0
       valid_lft 1744sec preferred_lft 1744sec
    inet 192.168.72.200/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe2e:a5d7/64 scope link 
       valid_lft forever preferred_lft forever
[root@DR ~]#
2.RS上配置arp内核参数
[root@RS-1 ~]# vim /etc/sysctl.conf 
[root@RS-1 ~]# tail -2 /etc/sysctl.conf 
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS-1 ~]# 
[root@RS-1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS-1 ~]# 

[root@RS-2 ~]# vim /etc/sysctl.conf 
[root@RS-2 ~]# tail -2 /etc/sysctl.conf 
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS-2 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS-2 ~]#
3.RS上配置VIP

一定要先设置好内核参数在配置VIP,如果先配置VIP,VIP配置好后会立即通告给所有人,而修改内核参数就是为了不通告

LVS服务器的eth0网卡的IP:192.168.72.200作为VIP

两台RS上都要做
[root@RS-1 ~]# ip addr add 192.168.72.200/32 dev lo
[root@RS-2 ~]# ip addr add 192.168.72.200/32 dev lo
所有RS上都要做
[root@RS-1 ~]# route add -host 192.168.72.200/32 dev lo
[root@RS-1 ~]# cd /etc/sysconfig/network-scripts
[root@RS-1 network-scripts]# ls
[root@RS-1 network-scripts]# cat route-lo 
192.168.72.200/32 via dev lo
[root@RS-1 network-scripts]# 


[root@RS-2 ~]# route add -host 192.168.72.200/32 dev lo
DR上配置lvs-dr转发规则
[root@DR ~]# yum -y install ipvsadm
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
上次元数据过期检查:1:11:58 前,执行于 2021年10月14日 星期四 04时51分23秒。
依赖关系解决。
=============================================
 软件包  架构   版本         仓库       大小
=============================================
安装:
 ipvsadm x86_64 1.31-1.el8   AppStream  59 k

事务概要
=============================================
安装  1 软件包

总下载:59 k
安装大小:86 k
下载软件包:
ipvsadm-1.31 144 kB/s |  59 kB     00:00    
---------------------------------------------
总计         143 kB/s |  59 kB     00:00     
运行事务检查
事务检查成功。
运行事务测试
事务测试成功。
运行事务
  准备中  :                              1/1 
  安装    : ipvsadm-1.31-1.el8.x86_64    1/1 
  运行脚本: ipvsadm-1.31-1.el8.x86_64    1/1 
  验证    : ipvsadm-1.31-1.el8.x86_64    1/1 
Installed products updated.

已安装:
  ipvsadm-1.31-1.el8.x86_64                  

完毕!
[root@DR ~]# ipvsadm -A -t 192.168.72.200:80 -s rr
[root@DR ~]# ipvsadm -a -t 192.168.72.200:80 -r 192.168.72.135:80 -g
[root@DR ~]# ipvsadm -a -t 192.168.72.200:80 -r 192.168.72.131:80 -g
[root@DR ~]# ipvsadm -Sn
-A -t 192.168.72.200:80 -s rr
-a -t 192.168.72.200:80 -r 192.168.72.131:80 -g -w 1
-a -t 192.168.72.200:80 -r 192.168.72.135:80 -g -w 1
[root@DR ~]# 
[root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@DR ~]# 
[root@DR ~]# vim /etc/rc.local
ipvsadm -A -t 192.168.153.250:80 -s rr
ipvsadm -a -t 192.168.153.250:80 -r 192.168.153.152:80 -g
ipvsadm -a -t 192.168.153.250:80 -r 192.168.153.153:80 -g 
ipvsadm -Sn
ipvsadm -Sn > /etc/sysconfig/ipvsadm
4.RS上配置http并启动
[root@RS-1 ~]# yum -y install httpd
[root@RS-1 ~]# echo 'rs1' > /var/www/html/index.html
[root@RS-1 ~]# systemctl start httpd

[root@RS-2 ~]# yum -y install httpd
[root@RS-2 ~]# echo 'rs2' > /var/www/html/index.html
[root@RS-2 ~]# systemctl start httpd
5.客户端访问测试
[root@localhost ~]# for i in $(seq 10);do curl 192.168.72.250:80;done
rs2
rs1
rs2
rs1
rs2
rs1
rs2
rs1
rs2
rs1
[root@localhost ~]# ``

lvs的NAT模式配置http负载均衡

//在DR上配置DIP(135)和VIP(250)
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE="Ethernet"
BOOTPROTO="static"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
IPADDR0=192.168.72.138
GATEWAY=192.168.72.1
NETMASK0=255.255.255.0
IPADDR1=192.168.72.250
GATEWAY1=192.168.72.1

//在RS上分别配置RIP,并将网关指向DIP
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE="Ethernet"
BOOTPROTO="static"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
IPADDR=192.168.72.135
PREFIX=24
GATEWAY=192.168.72.138
DNS1=114.114.114.114
DNS2=8.8.8.8
[root@localhost ~]# 

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.72.131
PREFIX=24
GATEWAY=192.168.72.138
DNS1=192.168.72.1

//在DR上开启IP转发,配置转发规则
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@localhost ~]# 

//配置规则
[root@localhost ~]# ipvsadm -A -t 192.168.72.250:80 -s rr
[root@localhost ~]# ipvsadm -a -t 192.168.72.250:80 -r 192.168.72.131:80 -m
[root@localhost ~]# ipvsadm -a -t 192.168.72.250:80 -r 192.168.72.135:80 -m
[root@localhost ~]# ipvsadm -Sn
-A -t 192.168.72.250:80 -s rr
-a -t 192.168.72.250:80 -r 192.168.72.131:80 -m -w 1
-a -t 192.168.72.250:80 -r 192.168.72.135:80 -m -w 1

//永久配置规则
[root@DR ~]# vim /etc/rc.local
ipvsadm -A -t 192.168.153.250:80 -s rr
ipvsadm -a -t 192.168.153.250:80 -r 192.168.153.153:80 -m
ipvsadm -a -t 192.168.153.250:80 -r 192.168.153.154:80 -m
ipvsadm -Sn
ipvsadm -Sn > /etc/sysconfig/ipvsadm

//保存
[root@localhost ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm

//在RS上分别配置HTTP
[root@localhost ~]# echo 'rs1' > /var/www/html/index.html

[root@localhost ~]# echo 'rs2' > /var/www/html/index.html

//验证
[root@localhost ~]# for i in $(seq 10);do curl 192.168.72.250:80;done
rs1
rs2
rs1
rs2
rs1
rs2
rs1
rs2
rs1
rs2