###

实现LVS负载均衡转发方式有三种,分别为NAT、DR、TUN模式,LVS均衡算法包括:RR(round-robin)、LC(least_connection)、W(weight)RR、WLC模式等(RR为轮询模式,LC为最少连接模式)。

LVS NAT原理:用户请求LVS VIP到达director(LVS服务器:LB),director将请求的报文的目标IP地址改成后端的realserver IP地址,同时将报文的目标端口也改成后端选定的realserver相应端口,最后将报文发送到realserver,realserver将数据返给LVS,director再把数据发送给用户。(两次请求都经过director,所以访问大的话,director会成为瓶颈)

LVS NAT模式实施必备条件

1)LVS服务器至少配置2块网卡,一个外网卡,一个内网卡;

2)LVS后端RS服务器的网关设置为LVS的内网卡IP地址;

在LVS服务器上开启路由转发功能ip_forward。

###


###

LVS TUN原理:用户请求LVS到达director,director通过IP-TUN加密技术将请求的报文的目标MAC地址改成后端的realserver MAC地址,目标IP为VIP(不变),源IP为用户IP地址(保持不变),然后Director将报文发送到realserver,realserver基于IP-TUN解密,然后检测到目标为自己本地VIP,如果在同一个网段,然后将请求直接返给用户。如果用户跟realserver不在一个网段,则通过网关返回用户。

###


###

#一般使用DR模式

LVS DR原理:用户请求LVSVIP到达director(LB均衡器),LVS将请求的报文的目标MAC地址改成后端的realserver MAC地址,目标IP为VIP(不变),源IP为用户IP地址(保持不变),然后Director将报文发送到realserver,realserver检测到目标IP是自己(VIP地址配置在RS机器上),如果在同一个网段,然后将请求直接返给用户。如果用户跟realserver不在一个网段,则通过网关返回用户

LVS  DR模式实施必备条件

1)LVS服务器和后端RS机器必须在同一个物理网段;

2)LVS和后端RS机器均要配置同一个VIP地址,不能冲突;

3)抑制后端RS机器上VIP地址的ARP广播响应;

不能抑制后端RS机器上真实IP地址的ARP广播响应。


#大白话理解如下:

客户端首先访问到LVS这一层,然后到达LVS这一层之后,LVS会把客户端的mac修改同后端RS机器一样的mac,客户端的ip和LVS保持不变,然后LVS再拿着这个修改成与后端RS机器一样的mac,去找后端的RS机器,后端的RS机器一看,LVS拿的这个mac和自己的mac一样,然后就开始处理请求,最后RS机器处理玩请求之后,如果用户和RS机器在同一个网段,那么直接返回请求给用户,如果跟RS机器不在同一个网段,那么就通过网关返回给用户,也就是局域网路由器,所以数据进来会经过LVS,但是出去就不经过LVS了

注:LVS DR模式有一个硬性要求,LVS机器必须跟后端的RS机器在同一个物理网段,简单理解就是说要使用同一台交换机,因为它要解析到mac地址


#注意:

VIP既配置在LVS机器,又要配置在RS后端机器如何防止冲突:

1)后端机器VIP地址必须配置在lo网卡上(lo本地回环网卡是用来检测本地通信的,一般不对外),不能配置在真实网卡上,否则会产生冲突

2)当请求到达内网,它会发一个广播查找谁是VIP,但是用户请求只能去找LVS上面的VIP,如果直接跳过LVS去找RS机器的VIP,那么就不叫作负载均衡了,所以要抑制后端RS机器VIP地址响应ARP广播,同时又不能抑制后端RS机器的真实IP的ARP广播,因为LVS会将请求的报文MAC地址修改成后端RS的mac,所以如果把后端RS机器真实网卡的ARP广播抑制之后,那么即使LVS机器和后端RS机器在一个网段,那也解析不了RS的mac地址

#VIP的可以抑制,但是真实网卡的不能抑制,因为LVS必须要找到真实机器的mac

###


###

#LVS DR模式实施:

#硬性要求

#LVS服务器必须和后端RS机器在同一个网段

#LVS服务器和后端RS机器都要配置同一个VIP地址,不能冲突

#必须抑制后端RS机器上的VIP地址的ARP广播响应

#不能抑制后端RS机器上的真实ip地址的ARP广播响应

###


#准备四台机器,一台客户端,一台LVS,两台后端RS机器

###

#LVS机器

#LVS负载均衡技术实现是基于Linux内核模块IP_VS

#安装ipvsadm管理工具

[root@yang-6 ~]# yum install -y ipvsadm
[root@yang-6 ~]# rpm -qa |grep -aiE ipvsadm
ipvsadm-1.27-8.el7.x86_64


#加载模块

[root@yang-6 ~]# lsmod |grep -aiE ip_vs

[root@yang-6 ~]# modprobe ip_vs

[root@yang-6 ~]# lsmod |grep -aiE ip_vs

[root@yang-6 ~]# lsmod |grep -aiE ip_vs
ip_vs                 145497  0
nf_conntrack          133095  6 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4
libcrc32c              12644  4 xfs,ip_vs,nf_nat,nf_conntrack
[root@yang-6 ~]#


#添加LVS机器上的VIP

[root@yang-6 ~]# ipvsadm -A -t 192.168.254.99:80 -s rr


#查看虚拟服务器VIP

[root@yang-6 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.254.99:80 rr
[root@yang-6 ~]#


#在VIP旗下添加后端RS机器真实IP地址,增加两个后端

[root@yang-6 ~]# ipvsadm -a -t 192.168.254.99:80 -r 192.168.254.207 -g -w 100

[root@yang-6 ~]# ipvsadm -a -t 192.168.254.99:80 -r 192.168.254.208 -g -w 100


#查看LVS负载均衡集群

[root@yang-6 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.254.99:80 rr
  -> 192.168.254.207:80           Route   100    0          0
  -> 192.168.254.208:80           Route   100    0          0
###


#给VIP机器配置VIP地址

#给lo网卡配置VIP

[root@yang-6 network-scripts]# cd /etc/sysconfig/network-scripts/

[root@yang-6 network-scripts]#
[root@yang-6 network-scripts]# cp ifcfg-lo ifcfg-lo:1

[root@yang-6 network-scripts]# vim ifcfg-lo:1
DEVICE=lo:1
#LVS机器定义的VIP地址
IPADDR=192.168.254.99
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback


#启动lo:1网卡

#查看是否存在VIP地址

[root@yang-6 network-scripts]# ifup lo:1
[root@yang-6 network-scripts]#
[root@yang-6 network-scripts]# ifconfig

###

#RS后端机器1

#给lo网卡配置VIP

[root@yang-5 network-scripts]# cd /etc/sysconfig/network-scripts/

[root@yang-5 network-scripts]#
[root@yang-5 network-scripts]# cp ifcfg-lo ifcfg-lo:1

[root@yang-5 network-scripts]# vim ifcfg-lo:1
DEVICE=lo:1
#LVS机器定义的VIP地址
IPADDR=192.168.254.99
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback


#启动lo:1网卡

#查看是否存在VIP地址

[root@yang-5 network-scripts]# ifup lo:1
[root@yang-5 network-scripts]#
[root@yang-5 network-scripts]# ifconfig


#抑制VIP地址的ARP广播响应

[root@yang-5 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@yang-5 ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@yang-5 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@yang-5 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce


###

#RS后端机器2

#给lo网卡配置VIP
[root@yang-8 network-scripts]# cd /etc/sysconfig/network-scripts/

[root@yang-8 network-scripts]#
[root@yang-8 network-scripts]# cp ifcfg-lo ifcfg-lo:1

[root@yang-8 network-scripts]# vim ifcfg-lo:1
DEVICE=lo:1
#LVS机器定义的VIP地址
IPADDR=192.168.254.99
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback


#启动lo:1网卡

#查看是否存在VIP地址

[root@yang-8 network-scripts]# ifup lo:1
[root@yang-8 network-scripts]#
[root@yang-8 network-scripts]# ifconfig


#抑制VIP地址的ARP广播响应

[root@yang-5 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@yang-5 ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@yang-5 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@yang-5 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce


###

#客户端机器

#测试,直接访问VIP地址,每次返回不同页面,表示LVS负载均衡配置成功

[root@yang-7 ~]# curl http://192.168.254.99

###


##############


###

#LVS机器

#LVS 机器中可以配置很多组

#增加新的组,增加新的VIP即可

[root@yang-6 ~]# ipvsadm -A -t 192.168.254.98:80 -s rr
[root@yang-6 ~]# ipvsadm -a -t 192.168.254.98:80 -r 192.168.254.200 -g -w 100
[root@yang-6 ~]# ipvsadm -a -t 192.168.254.98:80 -r 192.168.254.201 -g -w 100
[root@yang-6 ~]# ipvsadm -a -t 192.168.254.98:80 -r 192.168.254.202 -g -w 100
[root@yang-6 ~]#
[root@yang-6 ~]# ipvsadm -L -n


#保存LVS规则

[root@yang-6 ~]# ipvsadm-save -n lvs_config.txt


#删除集群组

[root@yang-6 ~]# ipvsadm -D -t 192.168.254.98:80

###


###

#整合LVS+Keepalived

#安装keepalived

[root@yang-6 ~]# yum install -y keepalived


#编辑配置文件

#[root@yang-6 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

#VIP1
vrrp_instance VI_1 {
    state MASTER
    interface ens32
    virtual_router_id 51
    priority 100
    advert_int 5
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.254.99
    }
}
virtual_server 192.168.254.99 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    persistence_timeout 60
    protocol TCP
    real_server 192.168.254.205 80 {
        weight 100
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    real_server 192.168.254.208 80 {
        weight 100
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
}

#重启keepalived服务

[root@yang-6 ~]# systemctl restart keepalived.service


#查看LVS集群状态,已经自动进行配置

[root@yang-6 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.254.99:80 wrr persistent 60
  -> 192.168.254.205:80           Route   100    0          0
  -> 192.168.254.208:80           Route   100    0          0
[root@yang-6 ~]#


#同样后端机器需要在lo网卡配置VIP,LVS机器会自动绑定VIP

#同样后端机器需要做VIP抑制


#在LVS服务区器上查看负载均衡集群

[root@yang-6 ~]# ipvsadm -L -n


#测试宕掉后端一台服务,查看集群机器状态会自定踢掉失活的机器,把服务起来,再次到LVS服务器查看集群状态,机器重新加到集群当中

###