一、LVS-NAT模式的组成
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 部署
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.4port=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
fiecho "禁止 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
fiecho "安装 ipvsadm 服务!"
yum -y install ipvsadm
ipvsadm -A -t $VIP -s wrrfor ip in $RIP1 $RIP2
do
ipvsadm -a -t $VIP:$port -r $ip:$port -m
donef、我们写个监控脚本,来监控两台 Real Server 能否正常访问,并动态的实时修改 ipvsadm 配置(由于目前为止我们还没学习类似 keeplive 的高可用方案,因此以脚本代替。)
#!/bin/bash
VIP=192.168.20.136
RIP1=172.16.0.3
RIP2=172.16.0.4port=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:$portelif [[ $web_status -eq 0 && $lvs_status -ne 0 ]]; then
ipvsadm -a -t $VIP:$port -r $IP:$port -m
fi
done
sleep 1
doneg、由于我们在配置 ipvsadm 的时候并没写明权重,如果后期,我们要对权重和调度算法进行调整时,可以使用以下命令
ipvsadm -E -t 192.168.20.136 -s rr
或者可以将其写入安装脚本中。
h、查看ipvsadm 负载均衡状态
ipvsadm -Ln
如图:
i、查看ipvsadm负载均衡连接状态
ipvsadm -lnc
或者
watch -n1 ipvsadm -lnc 表示1秒钟刷新一次,这里的时间时可以修改的,也可以为小数,比如 watch -n0.5 ipvsadm -lnc
如图:
j、验证
我们分别在Real Server中新建index.php文件
Real ServerA 中index.php文件内容为:Real ServerA
Real ServerB 中index.php文件内容为:Real ServerB
然后,我们访问 http://192.168.20.136
如图:
由于,用浏览器访问时会有缓存,导致可能刷新很多遍页面还是 Real ServerA 或者 Real ServerB ,所以,我这里分别用两个不同的浏览器进行访问
我们也可以在 Linux 服务器中用 curl 进行访问,curl没有缓存,访问结果会向第一张图那样