LVS 负载均衡集群部署之 NAT 模式

1、LVS-NAT模式的组成php

image

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

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

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

2、LVS-NAT实现原理数据库

        参考拓扑图数据流向:后端

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

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

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

        四、数据包到达 Real Server 中,Real Server 会先根据本身的路由表判断数据包的目的地址是否为本机地址,若是是,则对此数据包作出响应,构建新的响应数据包交给 Director Server,而此时,数据包的源地址为 RIP,目的地址为 CIP,若是不是,则丢弃。服务器

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

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

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

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

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

3、LVS-NAT部署注意事项

        一、如拓扑图,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

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

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

4、LVS-NAT 部署

         图片.png

        一、提早准备好两台 Real Server 服务器,Real Server 服务器环境搭建这里就很少做介绍,请参考小弟前期的博文

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

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

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

        二、提早准备好MySQL数据库,数据库的安装,请参考小弟前期的博文 http://www.javashuo.com/article/p-stbwdeok-cp.html

        三、安装 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没有缓存,访问结果会向第一张图那样

相关文章
相关标签/搜索