LVS-DR数据流量分析
web节点和调度器同一网段,入从调度器走,出从web节点走
client:客户机 Director:调度器 Server:服务器
调度器的ens33:0(ens33虚拟IP)需要和服务器的lo:0(环回虚拟IP)相同
1.客户机向目标VIP发出请求,Director(负载均衡器)接收
IP包头及数据帧头信息
source MAC | dest MAC | … | source IP | dest IP | dest port | … |
---|---|---|---|---|---|---|
客户机MAC | 调度器MAC | … | 客户机IP | 调度器VIP | 80 | … |
2.Director根据负载均衡算法选择Server,不修改也补封装IP报文,而是将数据帧的MAC地址改为Server的MAC地址,然后在局域网上发送
IP包头及数据帧头信息
source MAC | dest MAC | … | source IP | dest IP | dest port | … |
---|---|---|---|---|---|---|
调度器MAC | 服务器MAC | … | 客户机IP | 调度器VIP | 80 | … |
3.Server收到这个帧,解封装后发现目标IP与本机匹配(Server需要绑定VIP),于是处理这个报文。随后重新封装报文,发送到局域网
IP包头及数据帧头信息
source MAC | dest MAC | … | source IP | dest IP | dest port | … |
---|---|---|---|---|---|---|
服务器MAC | 客户机MAC | … | 服务器IP | 客户机IP | 80 | … |
4.Client将收到回复报文。Client任务得到正常的服务,而不会知道是哪一台服务器处理的
LVS-DR的ARP问题
问题1
在LVS-DR负载均衡集群中,负载均衡器与节点服务器都要配置相同的VIP地址
在局域网中具有相同IP地址,会造成各服务器ARP通信紊乱,当APR广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会收到ARP广播
解决方法
对节点服务器进行处理,使起不响应针对VIP的ARP请求
使用虚接口lo:0承载VIP地址
设置内核参数arp_ignore=1
当arp_ignore=1时,网卡上收到目的IP为环回IP的arp请求,发现请求IP不是自己网卡上的IP,不会回arp响应
问题2
路由器根据ARP表项,会将新来的请求报文转发给Server,导致Director的VIP失效
解决方法
对节点服务器进行处理,设置内核参数arp_ignore=2 系统不适用IP包的源地址来设置ARP请求源地址,而选择发送接口的IP地址
附:ARP的工作原理。
ARP指的是已知目标IP地址未知目标mac地址时用
举例:若PC1想发消息给PC2,但是只知道PC2 的IP,未知PC2的mac 地址时 就会通过ARP发送广播帧给交换机,交换机接收到广播帧时无条件广播处理,此时连接到交换机上的所有主机有课收到此广播帧,它们会比较自己的IP地址与目标IP地址是否一致,若不一致则丢弃处理,若一致则回复消息给对方,在回包的过程中加上自己的IP地址和mac地址,当发送房接收到此数据时,查看接受方的mac和IP地址,把他们一起放入ARP缓存起来。
LVS-DR群集部署
群集拓扑图
部署环境
IP设置
虚拟IP:192.168.2.100
设备 | IP地址 | 子网掩码 | 网关 | 网卡 |
---|---|---|---|---|
LVS | 192.168.2.15 | 255.255.255.0 | ens33 | |
web1 | 192.168.2.16 | 255.255.255.0 | 192.168.2.15 | ens33 |
web2 | 192.168.2.17 | 255.255.255.0 | 192.168.2.15 | ens33 |
nfs | 192.168.2.18 | 255.255.255.0 | ens33 |
NFS共享存储
1.需安装nfs-utils、rpcbind软件包
yum -y install nfs-utils rpcbind
2.设置共享目录
(为了便于测试,所以设置两个不同的目录区分)
mkdir /opt/web1
mkdir /opt/web2
echo "<html><title>web1</title><body><h1>This is web1</h1></body></html>" >> /opt/web1/index.html
echo "<html><title>web2</title><body><h1>This is web2</h1></body></html>" >> /opt/web2/index.html
vi /etc/exports
/opt/web1 192.168.2.16(ro)
/opt/web2 192.168.2.17(ro)
重启
systemctl restart nfs
查看本机发布的NFS共享目录
showmount -e
web1节点
安装httpd用于测试
yum -y install httpd
查看NFS服务器共享的目录
showmount -e 192.168.2.18
将目录挂载到网站根目录
mount 192.168.2.18:/opt/web1 /var/www/html/
检查一下是否挂载成功
开启httpd
systemctl start httpd
关闭防火墙
systemctl stop firewalld
setenforce 0
vi /etc/selinux/config
测试
curl http://localhost
编辑脚本
vim web1.sh
#!/bin/bash
#Lvs-Dr模式 web1
ifconfig lo:0 192.168.2.100 broadcast 192.168.2.100 netmask 255.255.255.255 up
route add -host 192.168.2.100 dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p &> /dev/null
执行脚本
web2节点
web2节点和web1节点,除了更改几个参数之外,其它都一样
安装httpd用于测试
yum -y install httpd
查看NFS服务器共享的目录
showmount -e 192.168.2.18
将目录挂载到网站根目录
mount 192.168.2.18:/opt/web2 /var/www/html/
检查一下是否挂载成功
cat /var/www/html/index.html
开启httpd
systemctl start httpd
关闭防火墙
systemctl stop firewalld
setenforce 0
vi /etc/selinux/config
测试
curl http://localhost
编辑脚本
vim web2.sh
#!/bin/bash
#Lvs-Dr模式 web2
ifconfig lo:0 192.168.2.100 broadcast 192.168.2.100 netmask 255.255.255.255 up
route add -host 192.168.2.100 dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p &> /dev/null
执行脚本
LVS调度器部署
1.手动加载ip_vs模块
modprobe ip_vs
查看
cat /proc/net/ip_vs
安装 ipvsadm
yum -y install ipvsadm
2.编写脚本
vim dr.sh
#!/bin/bash
#Lvs-dr
ifconfig ens33:0 192.168.2.100 broadcast 192.168.2.100 netmask 255.255.255.255 up
route add -host 192.168.2.100 dev ens33:0
ipvsadm -C
ipvsadm -A -t 192.168.2.100:80 -s rr
ipvsadm -a -t 192.168.2.100:80 -r 192.168.2.16:80 -g
ipvsadm -a -t 192.168.2.100:80 -r 192.168.2.17:80 -g
ipvsadm -Ln
ipvsadm选项
选项 | 说明 |
---|---|
-C | 清除内核虚拟服务器表中的所有记录 |
-A | 添加虚拟服务器 |
-a | 添加真是服务器 |
-t | 用来指定VIP地址及TCP端口 |
-r | 用来指定RIP地址及TCP端口 |
-s | 用来指定负载调度算法 |
-m | 表示使用NAT群集模式 |
-g | 表示使用DR群集模式 |
i | 表示使用TUN群集模式 |
执行脚本
3访问测试
查看详细信息
ipvsadm -Lnc