一、LVS-NAT模式的组成

image

        LVS-NAT模式的实现,其主要依赖于 LVS调度器,即 Director Server,由上图可以看出,整个调度器,则由两部分构成:用户空间和内核空间。

        1、内核空间,指的是,在负载均衡实现过程中,有一部分代码工作在内核之中,而这部分代码才是真正负载均衡实现调度的部分,叫做内核空间,即 IPVS

        2、用户空间,指的是,在负载均衡实现过程中,负责为ipvs内核框架编写规则,定义集群服务角色,后端真实的服务器(Real Server)的部分,叫做用户空间,即 ipvsadm

二、LVS-NAT实现原理

        参考拓扑图数据流向:

        1、当客户端向 LVS 调度器发起请求时 ,首先数据包会到达 PREROUTING 链,而此时,数据包的源IP为CIP,目的IP为VIP,经由 PREROUTING 链的处理,改变数据包的目的IP地址和目的端口(而这里的目的IP地址和目的端口在用户空间中定义),此时的目的地址变成RIP。

        2、当 PREROUTING 链处理完数据包之后,会将数据包交给 INPUT 链,进行数据包过滤,过滤掉不属于目的主机地址(即集群服务)的数据包。

        3、当 INPUT 处理完数据包后,会将数据包交给 POSTROUTING 链,在 POSTTOUTING 链,根据数据包的目的地址和主机路由表进行对比,选择最优路径,将数据包发送给Real Server。

        4、数据包到达 Real Server 中,Real Server 会先根据自己的路由表判断数据包的目的地址是否为本机地址,如果是,则对此数据包做出响应,构建新的响应数据包交给 Director Server,而此时,数据包的源地址为 RIP,目的地址为 CIP,如果不是,则丢弃。

        5、当客户端的响应数据包到达 Director Server 时,首先会经过 OUTPUT 链的转发,完了再将数据包交给 POSTROUTING 链,将响应数据包的源地址修改为本机的 VIP

        6、最后,响应数据包会被发送给客户端

        说明:关于数据流向的问题,这里只介绍个大概,如果需要更加详尽的数据处理过程,请参考 IPtables 防火墙工作原理,因为 LVS 是基于 IPtables 架构的。

                     这里推荐两篇博文:https://×××w.cnblogs.com/tangshengwei/p/4652011.html

                                                   https://blog.csdn.net/ggxiaobai/article/details/53609284

三、LVS-NAT部署注意事项

        1、如拓扑图,RIP、DIP必须为私有地址,且Real Server 的网关必须指定为DIP

               私有IP地址范围:

   A类地址范围:10.0.0.0—10.255.255.255
    B类地址范围:172.16.0.0---172.31.255.555
    C类地址范围:192.168.0.0---192.168.255.255

        2、RIP、DIP必须处于同一网段

        3、请求数据和响应数据都需要经过Director Server,在高负载场景中,Director Server 很容易成为性能瓶颈

四、LVS-NAT 部署

         图片.png

        1、提前准备好两台 Real Server 服务器,Real Server 服务器环境搭建这里就不多作介绍,请参考小弟前期的博文

https://blog.51cto.com/4746316/2313671

https://blog.51cto.com/4746316/2313873 

两台 Real Server 的IP分别设置为,172.16.0.2、172.16.0.3,即为 RIP,网关设置为172.16.0.4(DIP)。

        2、提前准备好MySQL数据库,数据库的安装,请参考小弟前期的博文 https://blog.51cto.com/4746316/2313577 。

        3、安装 Director Server 服务器。

a、开启系统内核路由转发功能

[root@lvs ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

或者 

[root@lvs ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

[root@lvs ~]# sysctl –p

注意:如果在sysctl.conf文件中net.ipv4.ip_forward = 1已经存在,说明系统内核转发功能已开启,或者cat /proc/sys/net/ipv4/ip_forward 值为1时,也说明内核转发功能已开启。

b、生产环境中,最好关闭 icmp 重定向

[root@lvs ~]# echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

[root@lvs ~]# echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects

[root@lvs ~]# echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects

[root@lvs ~]# echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects

或者

[root@lvs ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

或者

[root@lvs ~]# echo "net.ipv4.icmp_echo_ignore_all=1" >> /etc/sysctl.conf

c、设置服务器地址

设置内部网卡地址为:172.16.0.4(DIP),设置外部 网卡地址为:192.168.20.136(VIP)

d、安装、配置 ipvsadm

[root@lvs ~]# yum –y install ipvsadm

[root@lvs ~]# ipvsadm –A –t 192.168.20.136 –s wrr

[root@lvs ~]# ipvsadm –a –t 192.168.20.136 –r 172.16.0.2 –m –w 1

[root@lvs ~]# ipvsadm –a –t 192.168.20.136 –r 172.16.0.3 –m –w 2

到此,LVS-NAT就配置完了,三条命令,如果后端真实服务器多的话,再往里面加就 OK了。

e、我们将前面步骤整理写成脚本

#!/bin/bash

VIP=192.168.20.136
RIP1=172.16.0.3
RIP2=172.16.0.4

port=80

echo "开启系统内核转发功能!"
cat /etc/sysctl.conf | grep "net.ipv4.ip_forward = 1" &> /dev/null
forward=$?

if [[ $forward -ne 0 ]]; then
     echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
     sysctl -p
fi

echo "禁止 icmp 重定向!"
cat /etc/sysctl.conf | grep "net.ipv4.icmp_echo_ignore_all=1" &> /dev/null
icmp=$?

if [[ $icmp -ne 0 ]]; then
     echo "net.ipv4.icmp_echo_ignore_all=1" >> /etc/sysctl.conf
     echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
fi

echo "安装 ipvsadm 服务!"
yum -y install ipvsadm
ipvsadm -A -t $VIP -s wrr

for ip in $RIP1 $RIP2
do
     ipvsadm -a -t $VIP:$port -r $ip:$port -m
done

f、我们写个监控脚本,来监控两台 Real Server 能否正常访问,并动态的实时修改 ipvsadm 配置(由于目前为止我们还没学习类似 keeplive 的高可用方案,因此以脚本代替。)

#!/bin/bash

VIP=192.168.20.136
RIP1=172.16.0.3
RIP2=172.16.0.4

port=80

while :
do
     for IP in $RIP1 $RIP2
     do
         curl http://$IP &> /dev/null
         web_status=$?
         ipvsadm -Ln | grep $IP &> /dev/null
         lvs_status=$?

        if [[ $web_status -ne 0  && $lvs_status -eq 0 ]]; then
             ipvsadm -d -t $VIP:$port -r $IP:$port

        elif [[ $web_status -eq 0  && $lvs_status -ne 0 ]]; then
             ipvsadm -a -t $VIP:$port -r $IP:$port -m
        fi
     done
     sleep 1
done

g、由于我们在配置 ipvsadm 的时候并没写明权重,如果后期,我们要对权重和调度算法进行调整时,可以使用以下命令

ipvsadm -E -t 192.168.20.136 -s rr

或者可以将其写入安装脚本中。

h、查看ipvsadm 负载均衡状态

ipvsadm -Ln

如图:

图片.png

i、查看ipvsadm负载均衡连接状态

ipvsadm -lnc

或者

watch -n1 ipvsadm -lnc     表示1秒钟刷新一次,这里的时间时可以修改的,也可以为小数,比如 watch -n0.5 ipvsadm -lnc

如图:

图片.png

j、验证

我们分别在Real Server中新建index.php文件

Real ServerA 中index.php文件内容为:Real ServerA

Real ServerB 中index.php文件内容为:Real ServerB

然后,我们访问 http://192.168.20.136

如图:

图片.png

图片.png图片.png

由于,用浏览器访问时会有缓存,导致可能刷新很多遍页面还是 Real ServerA 或者 Real ServerB ,所以,我这里分别用两个不同的浏览器进行访问

我们也可以在 Linux 服务器中用 curl 进行访问,curl没有缓存,访问结果会向第一张图那样