Linux 负载均衡介绍之LVS工作模式-DR直接路由模式
图示:
工作原理:
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS。
③.RS发现请求报文中的目的MAC是自己,就会将次报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。
特点:
1,集群节点和director必须在一个物理网络内
2,RIP可以使用公网地址或私有地址
3,director仅处理入站请求,director服务器的压力比较小
4,集群节点网关不指向director,故出站不经过director
5,不支持端口映射
6,大多数操作系统可以作为realserver,要支持隔离arp广播
ARP问题:
通常,DR模式需要在Real-server上配置VIP,配置的方式为:
/sbin/ifconfig lo:0 inet VIP netmask 255.255.255.255
i) 原因在于,当LVS把client的包转发给Real-server时,因为包的目的IP地址是VIP,那么如果Real-server收到这个包后,发现包的目的IP不是自己的系统IP,那么就会认为这个包不是发给自己的,就会丢弃这个包,所以需要将这个IP地址绑到网卡上;当发送应答包给client时,Real-server就会把包的源和目的地址调换,直接回复给client。
ii) 关于ARP广播:
- 上面绑定VIP的掩码是”255.255.255.255″,说明广播地址是其本身,那么他就不会将ARP发送到实际的自己该属于的广播域了,这样防止与LVS上VIP冲突,而导致IP冲突。
- 另外在Linux的Real-server上,需要设置ARP的sysctl选项:
LVS-DR案例:
环境:
192.168.0.106 client windown7
192.168.0.124 dr1 负载均衡器 虚拟IP地址:192.168.0.123
192.168.0.120 rs1 web1 虚拟IP地址:192.168.0.123
192.168.0.121 rs2 web2 虚拟IP地址:192.168.0.123
步骤:
1.LVS准备VIP和路由
添加VIP
ifconfig ens32:0 192.168.0.123 broadcast 192.168.0.255 netmask 255.255.255.0 up
route add -host 192.168.0.123 dev ens32:0
注意:VIP与RIP要配到同一个网卡上
设置路由转发
服务器不是一台路由器,那么它不会发送重定向,所以可以关闭该功能
# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1 开启路由功能
net.ipv4.conf.all.send_redirects = 0 禁止转发重定向报文
net.ipv4.conf.ens32.send_redirects = 0 禁止ens32转发重定向报文
net.ipv4.conf.default.send_redirects = 0 禁止转发默认重定向报文
2.LVS设置负载均衡条目
设置IPVSADM
yum install ipvsadm -y
ipvsadm -C (-C Clear the virtual server table.清除配置)
ipvsadm -A -t 192.168.0.123:80 -s rr
ipvsadm -a -t 192.168.0.123:80 -r 192.168.0.120:80 -g
ipvsadm -a -t 192.168.0.123:80 -r 192.168.0.121:80 -g
参数说明
-A 添加virtual server
-t 指定使用tcp协议
-s 指定调度策略为rr
-a 添加realserver
-r 指定realserver是谁
-g LVS类型DR
LVS类型:
-g:Gateway,DR(默认使用的类型)
-i:ipip,TUN
-m:masquerade(地址伪装),NAT
3.LVS让配置永久生效:
# ipvsadm-save > /etc/sysconfig/ipvsadm
# systemctl enable ipvsadm
4.两个web上部署web服务
安装web服务
#yum install nginx -y
修改主页内容
# vim /usr/share/nginx/html/index.html
启动服务:
#systemctl start nginx
#systemctl enable nginx
- 给两个web服务器的lo网卡设置子网掩码为32位vip
rs1:
# ifconfig lo:0 192.168.0.123/32
rs2:
# ifconfig lo:0 192.168.0.123/32
6.给两个web服务器设置内核参数
忽略arp响应 ,不允许收
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
为了让vip发包出去,但允许发
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
7.客户端测试
ipvsadm状态测试
[root@localhost ~]# ipvsadm -Lnc
IPVS connection entries
pro expire state source virtual destination
TCP 00:16 SYN_RECV 192.168.0.106:63429 192.168.0.123:80 192.168.0.121:80
8.命令解释大全(略)
1. 管理虚拟服务
添加一个虚拟服务192.168.1.100:80,使用轮询算法
ipvsadm -A -t 192.168.1.100:80 -s rr
修改虚拟服务的算法为加权轮询
ipvsadm -E -t 192.168.1.100:80 -s wrr
删除虚拟服务
ipvsadm -D -t 192.168.1.100:80
2. 管理真实服务
添加一个真实服务器192.168.1.123,使用DR模式,权重2
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.123 -g -w 2
增加真实服务器的权重
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.123 -g -w 5
修改真实服务器的权重
ipvsadm -e -t 192.168.1.100:80 -r 192.168.1.123 -g -w 5
删除真实服务器
ipvsadm -d -t 192.168.1.100:80 -r 192.168.1.123
3. 查看统计
查看当前配置的虚拟服务和各个RS的权重
ipvsadm -Ln
查看当前ipvs模块中记录的连接(可用于观察转发情况)
ipvsadm -lnc
查看ipvs模块的转发情况统计
ipvsadm -Ln --stats --rate
9.脚本配置方法
VS调度器配置
#!/bin/bash
vip='172.18.0.100'
iface='eth0:1'
mask='255.255.255.255'
port='80'
rs1='10.10.0.72'
rs2='10.10.0.73'
scheduler='wrr'
type='-g'
case $1 in
start)
ifconfig $iface $vip netmask $mask broadcast $vip up
iptables -F
ipvsadm -A -t ${vip}:${port} -s $scheduler
ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1
ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1
echo "The VS Server is Ready!"
;;
stop)
ipvsadm -C
ifconfig $iface down
echo "The VS Server is Canceled!"
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
RS服务器配置
#!/bin/bash
vip=172.18.68.100
mask='255.255.255.255'
dev=lo:1
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $dev $vip netmask $mask broadcast $vip up
route add -host $vip dev $dev
echo "The RS Server is Ready!"
;;
stop)
ifconfig $dev down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore3
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "The RS Server is Canceled!"
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac