一、LVS简介

    LVS(linux virtual server)----->linux虚拟服务器,目前LVS模块已经被集成在linux内核中了。该项目在linux内核中实现了基于ip的数据请求负载均衡调度方案,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的web请求会发送给LVS调度器,调度器根据自己欲设算法将该请求发送给后端的某台web服务器,比如轮询调度法,一共有8中调度方法。LVS工作模式可以分为NAT模式、TUN模式和DR模式。

二、三种LVS工作模式详细

    1、基于NAT的LVS模式负载均衡

lvs java主备模式 lvs主主模式_linux

      NAT(network address translation) 网络地址转换,其主要原理是修改数据报头,使得位于企业内部的私有ip地址可以访问外王,以及外部用户可以访问位于公司内部的私有的ip主机。

     工作过程:

        (1):用户通过互联网DNS服务器解析到公司负载均衡设备上的外网地址,相对于真实服务器而言,LVS外网ip又称为vip,用户通过访问vip,即可连接后端的真实服务器,而此时用户对这一切都是不可知的,用户认为自己还在访问真实的后端服务器,也不知道自己访问的vip只是一个调度器。

        (2):用户将请求发送至调度器上,此时LVS根据算法选择一个后端的真实服务器,将数据请求包转发给真实服务器,并在转发之前LVS会修改数据包中的目标地址以及目标端口,此时修改为真实的服务器ip地址

        (3):真实的服务器将响应的数据包返回给LVS调度器,调度器在响应数据包后会将源地址和源端口修改为vip及调度器相应端口,修改完成后,由调度器响应数据包发送给终端

       LVS调度器中有一个连接Hash表,该表会记录连接请求及其转发信息,当同一个连接下一个数据包发送给调度器时,该Hash'表可以直接找到之前连接的记录,并根据记录信息选出相同真实服务器及其端口信息。

       NAT的优点时服务器可以运行在任何支持TCP/IP的操作系统,他只需要在调度器上配置一个ip

服务器组可以用私有的ip地址。

      NAT的缺点时伸缩能力有限,当服务器节点数目上升到20时,调度器本身有可能成为系统的新瓶颈,因为请求和响应的报文都需要经过调度器。

  2、 基于TUN的LVS负载均衡

lvs java主备模式 lvs主主模式_lvs java主备模式_02

        LVS(NAT)模式的集群环境中,所有数据包的请求的回应的哦欧需要经过调度器处理,但是在TUN模式中,将NAT模式中的问题有所解决。因为数据包的请求包往往远远小于响应数据包的大小。因为响应数据包中有包含客户需要的具体数据所以,TUN的原理就是将请求与响应数据分离。,让调度器仅仅处理数据请求,让真实的服务器响应数据包直接返回给客户。

       IP(隧道)是一种数据包分装技术,他可以经原始的数据包分装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的vip地址的数据包分装,通过隧道转发给真实的后端服务器,通过将客户端发往调度器的原始数据包分装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务的ip地址以及对应端口),lLVS(Tun)模式要求真实的服务器可以与外部网络连接,真实服务器在受到请求数据包后直接给客户端返回响应数据。

        LVS(Tun)技术对服务器有要求,即所有服务器必须支持"IP Tunneling"或者IP Encapsulation”协议。目前,VS/TUN 的后端服务器主要运行 Linux 操作系统。

       3、LVS(DR)负载均衡

lvs java主备模式 lvs主主模式_lvs java主备模式_03

        在LVS(TUN)模式中,需要LVS调度器与真实的服务器之间创建隧道连接,这样就会增加服务器的负担。DR模式也叫路由模式,该模式中LVS依然仅承担数据的请求以及根据算法调度出合理的后端服务器,最终由后端真实服务器负责响应数据包发送返回给客户端。与隧道模式不同的是,DR模式要求调度器与后端服务器必须在统一个局域网内u,VIP地址需要在调度器与后端所有服务器之间共享,因为最终的真实服务器会给客户端回应数据包时需要设置源IP为VIP,目标IP为客户端IP,这样客户端访问的时调度器VIP地址,回应的源地址也是VIP,这样客户端是感觉不到后端服务器的存在。由于多台计算机都设置了同样的VIP地址,所以在直接路由模式中要求调度器的VIP是对外可见的,客户端将请求数据包发送到调度器主机,而所有的真实服务器的VIP必须配置在Non-ARP的网络上ARP是一个协议。调度器根据算法在选出真实的服务器后,在不修改数据报文的情况下,将数据帧的MAC地址修改为选出的真实的MAC地址,通过交换机将该数据帧发给真实的服务器。
 

三、LVS-实战:搭建HTTP负载均衡集群

1. 搭建lvs-dr模式的http负载集群

主机名

作用

IP/DIP

VIP

yibie

LVS服务器(DR)

192.168.57.60

192.168.57.250

RS-1

apache服务器(RS)

192.168.57.100

192.168.57.250

RS-2

apache服务器(RS)

192.168.57.131

192.168.57.250

 三台机器分别配置了对应的本地静态地址DIP和RIP,VIP之后配置

1.1 LVS上配置IP

[root@yibie ~]# ip addr add 192.168.57.250/24 dev ens160 
[root@yibie ~]# 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: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:52:12:fc brd ff:ff:ff:ff:ff:ff
    inet 192.168.57.60/24 brd 192.168.57.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 192.168.57.250/24 scope global secondary ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe52:12fc/64 scope link 
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:5e:ad:58 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:5e:ad:58 brd ff:ff:ff:ff:ff:ff

1.2 RS上配置arp内核参数

[root@RS-1 ~]# vim /etc/sysctl.conf 
// 添加以下两行
net.ipv4.conf.all.arp_ignore = 1

// 将对应网卡设置为只回应目标IP为自身接口地址的ARP请求

net.ipv4.conf.all.arp_announce = 2

// 将ARP请求的源IP设置为eth0上的IP,也就是RIP

[root@RS-1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

// 两台RS都要进行以上操作
[root@RS-2 ~]# vim /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

1.3 RS上配置VIP

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

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

两台RS上都要做,永久生效在配置文件中加IP

[root@RS-1 ~]# ip addr add 192.168.57.250/24 dev lo
[root@RS-2 ~]# ip addr add 192.168.57.250/24 dev lo
[root@RS-1 ~]# route add -host 192.168.57.250/24 dev lo
[root@RS-1 ~]# echo '192.168.57.250/24 via dev lo' > /etc/sysconfig/network-scripts/route-lo


[root@RS-2 ~]# route add -host 192.168.57.250/24 dev lo
[root@RS-2 ~]# echo '192.168.57.250/24 via dev lo' > /etc/sysconfig/network-scripts/route-lo

1.4 DR上配置lvs-dr转发规则

LVS依赖于ipvsadm来进行配置,所以我们首先先安装ipvsadm

[root@yibie ~]# yum -y install ipvsadm
[root@yibie ~]#  ipvsadm -A -t 192.168.57.250:80 -s rr
[root@yibie ~]# ipvsadm -a -t 192.168.57.250:80 -r 192.168.57.100:80 -g
[root@yibie ~]# ipvsadm -a -t 192.168.57.250:80 -r 192.168.57.131:80 -g
[root@yibie ~]# ipvsadm -Sn
-A -t 192.168.57.250:80 -s rr
-a -t 192.168.57.250:80 -r 192.168.57.100:80 -g -w 1
-a -t 192.168.57.250:80 -r 192.168.57.131:80 -g -w 1
[root@yibie ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm

1.5 RS上配置http并启动

[root@RS-1 ~]# yum -y install httpd
[root@RS-1 ~]# echo 'rs1' > /var/www/html/index.html
[root@RS-1 ~]# systemctl enable --now httpd

[root@RS-2 ~]# yum -y install httpd
[root@RS-2 ~]# echo 'rs2' > /var/www/html/index.html
[root@RS-2 ~]# systemctl enable --now httpd

1.6 客户端访问测试

[root@yibie ~]# for i in $(seq 10);do curl 192.168.57.250:80;done
rs2
rs1
rs2
rs1
rs2
rs1
rs2
rs1
rs2
rs1

2. 搭建lvs-nat模式的http负载集群

主机名

作用

IP/DIP

VIP

yibie

LVS服务器(DR)

192.168.57.60

192.168.57.255

RS-1

apache服务器(RS)

192.168.57.100

网关为DR网关

RS-2

apache服务器(RS)

192.168.57.131

网关为DR网关

2.1 关闭防火墙和seLinux 

[root@yibie ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
 setenforce 0

[root@RS-1 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@RS-1 ~]# setenforce 0

[root@RS-2 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@RS-2 ~]# setenforce 0

2.2 配置 DR的VIP

[root@yibie ~]# ip addr add 192.168.57.255/24 dev ens160 
[root@yibie ~]# 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: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:52:12:fc brd ff:ff:ff:ff:ff:ff
    inet 192.168.57.60/24 brd 192.168.57.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 192.168.57.255/24 scope global secondary ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe52:12fc/64 scope link 
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:5e:ad:58 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:5e:ad:58 brd ff:ff:ff:ff:ff:ff
[root@yibie ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160 
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens160"
DEVICE="ens160"
ONBOOT="yes"
IPADDR=192.168.57.60
GATEWAY=192.168.57.2
DNS1=114.114.114.114
PREFIX=24
DNS2=8.8.8.8

2.3 下载httpd并修改显示内容

[root@RS-1 ~]# yum -y install httpd
[root@RS-1 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

[root@RS-1 ~]# echo "hello ! 192.168.57.100" > /usr/share/httpd/noindex/index
.html
[root@RS-1 ~]# systemctl restart httpd

[root@RS-2 ~]# yum -y install httpd
[root@RS-2 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS-2 ~]# echo "hello ! 192.168.57.131" > /usr/share/httpd/noindex/index.html
[root@RS-2 ~]# systemctl restart httpd

2.4 配置 RS1网关为DR网关

[root@RS-1 ~]# sed -ri 's/^(GATEWAY=).*/\1192.168.57.2/' /etc/sysconfig/network-scripts/ifcfg-ens160 
[root@RS-1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160 
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens160"
DEVICE="ens160"
ONBOOT="yes"
IPADDR=192.168.57.100
GATEWAY=192.168.57.2
DNS1=114.114.114.114
PREFIX=24
DNS2=8.8.8.8

2.5 配置 RS2网关为DR网关

[root@RS-2 ~]# sed -ri 's/^(GATEWAY=).*/\1192.168.57.2/' /etc/sysconfig/network-scripts/ifcfg-ens160
[root@RS-2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160 
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens160"
DEVICE="ens160"
ONBOOT="yes"
IPADDR=192.168.57.131
GATEWAY=192.168.57.2
DNS1=114.114.114.114
PREFIX=24
DNS2=8.8.8.8

2.6 DR上配置 转发规则

LVS依赖于ipvsadm来进行配置,所以首先安装ipvsadm

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

[root@yibie ~]# ipvsadm -A -t 192.168.57.255:80 -s rr
[root@yibie ~]# 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.57.255:80 rr
[root@yibie ~]# ipvsadm -a -t 192.168.57.255:80 -r 192.168.57.100:80 -m
[root@yibie ~]# ipvsadm -a -t 192.168.57.255:80 -r 192.168.57.131:80 -m
[root@yibie ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@yibie ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.57.255:80 -s rr
-a -t 192.168.57.255:80 -r 192.168.57.100:80 -m -w 1
-a -t 192.168.57.255:80 -r 192.168.57.131:80 -m -w 1

2.7 客户端测试

[root@JLin ~]# for i in $(seq 4);do curl 192.168.57.255:80;done
hello ! 192.168.57.131
hello ! 192.168.57.100
hello ! 192.168.57.131
hello ! 192.168.57.100