1、LVS-NAT模式的组成php
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 部署
一、提早准备好两台 Real Server 服务器,Real Server 服务器环境搭建这里就很少做介绍,请参考小弟前期的博文
两台 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.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没有缓存,访问结果会向第一张图那样