目录
7、 在web中调整内核的ARP响应参数以阻止更新vip的MAC地址,避免冲突
2、RealServer为什么要在lo接口上配置VIP?在出口网卡上配置VIP可以吗?
4、LVS/DR load balancer(director)与RS为什么要在同一网段中?
5、为什么director上eth0接口除了VIP另外还要配一个ip(即DIP)?
6、director的vip的netmask一定要是255.255.255.255吗?
LVS-DR(Linux Virtual Server Director Server)工作模式,是生产环境中最常用的一 种工作模式。
- 客户机发起请求,经过调度服务器(lvs),经过算法调度,去访问真实服务器(RS)
-
- 由于不原路返回,客户机不知道,真实主机的ip地址,
-
- 所以只能通过调度服务器的外网ip(vip)去反回报文信息。
Director Server作为群集的访问入口,但不作为网关使用,后端服务器池中的Real Server与Director Server在同一个物理网络中,发送给客户机的数据包不需要经过Director Server。为了响应对整个群集的访问,DS(前端负载均衡节点服务器)与RS(后端真实服务器)都需要配置有VIP地址。
每个Real Server上都有两个IP:VIP(负载均衡对外提供访问的 IP 地址)和RIP(负载均衡后端的真实服务器 IP 地址),但是VIP是隐藏的,就是不能提供解析等功能,只是用来做请求回复的源IP的,Director上只需要一个网卡,然后利用别名来配置两个IP:VIP和DIP(负载均衡与后端服务器通信的 IP 地址),在DIR接收到客户端的请求后,DIR根据负载算法选择一台rs sever的网卡mac作为客户端请求包中的目标mac,通过arp转交给后端RS serve处理,后端再通过自己的路由网关回复给客户端。
(1)客户端发送请求到Director Server(负载均衡器),请求的数据报文(源IP是CIP,目标IP是VIP)到达内核空间。
(2)Director Server和Real Server在同一个网络中,数据通过二层数据链路层来传输。
(3)内核空间判断数据包的目标IP是本机VIP,此时IPVS(IP虚拟服务器)比对数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。修改源MAC地址为Director Server的MAc地址,修改目标MAC地址为Reaserver的MAC地址,源IP地址与目标IP地址没有改变,然后将数据包发送给Real Server。
(4)到达Real Server的请求报文的MAC地址是自身的 MAC地址,就接收此报文。数据包重新封装报文(源IP地址为VIP,目标IP为CIP),将响应报文通过lo接口传送给物理网卡然后向外发出。
(5)Real server直接将响应报文传送到客户端。
在LVS-DR负载均衡集群中,负载均衡与节点服务器都要配置相同的VIP地址。
在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的紊乱。
对节点服务器进行处理,使其不响应针对VIP的ARP请求。
RealServer返回报文(源IP是VIP)经路由器转发,重新封装报文时,需要先获取路由器的MAC地址。
发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包中的源IP地址,而不使用发送接口的IP地址
路由器收到ARP请求后,将更新ARP表项
原有的VIP对应Director的MAC地址会被更新为VIP对应RealServer的MAC地址
路由器根据ARP表项,会将新来的请求报文转发给RealServer,导致Director的VIP失效
- 修改/etc/sysctl.conf文件
- net.ipv4.conf.lo.arp_ignore=1 #忽略不对本机的物理接口IP地址的ARP请求
- net.ipv4.conf.lo.arp_announce=2 #使用本机的物理接口IP地址发送ARP请求,而不使用即将发送的数据包的源IP发送ARP请求
- net.ipv4.conf.all.arp_ignore=1
- net.ipv4.conf.all.arp_announce=2
- 调度器:ens33:0 #承载VIP,设置内核参数,不做路由器转发,配置ipvsadm -g指定为DR模式
- 节点服务器:lo:0 #承载VIP,设置内核参数,限制ARP请求,配置路由限制在本地 安装wEB应用
搭建环境
主机 | 操作系统 | IP地址 | 所需服务 |
---|---|---|---|
DR服务器(负载调度器) | CentOS7 | ens33:192.168.80.20,ens33:0 (VIP):192.168.80.188 | ipvsadm |
Web节点服务器1 | CentOS7 | ens33:192.168.80.30,ens33:0 (VIP):192.168.80.188 | httpd |
Web节点服务器2 | CentOS7 | ens33:192.168.80.40,ens33:0 (VIP):192.168.80.188 | httpd |
客户端 | Windows7 | 192.168.80.100 |
注:此次搭建在同一局域网内,设置网络时不用网关和DNS,注释即可。如果不在同一网段,需要配置网关。
- yum -y install ipvsadm keepalived #下载ipvsadm管理工具 keepalived(热备组的作用)
-
- modprobe ip_vs #加载ip_vs模块
- cat /proc/net/ip_vs #查看ip_vs模块
- ipvsadm-save > /etc/sysconfig/ipvsadm #保存策略
- systemctl start ipvsadm #启动ipvsadm工具
yum -y install ipvsadm keepalived #下载ipvsadm管理工具 keepalived(热备组的作用)
- cd /etc/sysconfig/network-scripts/ #进入网卡配置目录
- cp -p ifcfg-ens33 ifcfg-ens33:0 #复制虚拟子接口的配置文件
- vim ifcfg-ens33:0 #编辑虚拟字接口内容
- DEVICE=ens33:0
- ONBOOT=yes
- IPADDR=192.168.187.100 #根据自己的机器IP修改
- NETMASK=255.255.255.255
-
- ifup ens33:0 #开启虚拟子接口网卡
- ifconfig ens33:0 #查看配置是否成功
由于LVS负载均衡器和各个节点需要共用vip地址,应该关闭Linux内核的重定向响应参数,不充当路由器,这样当DS收到客户端发来的数据包时,就不会立马转发给后台RS服务器,而是转发给自己的虚拟子接口。
- vim /etc/sysctl.conf #编辑内核proc参数
- #添加以下内容
- net.ipv4.ip_forward = 0 #关闭ip转发
- net.ipv4.conf.all.send_redirects = 0 #关闭所有send重定向
- net.ipv4.conf.default.send_redirects = 0 #关闭默认重定向
- net.ipv4.conf.ens33.send_redirects = 0 #关闭网卡重定向
-
- sysctl -p #查看内核参数 加载生效
- ipvsadm -C #清除规则
- ipvsadm -A -t 192.168.187.100:80 -s rr #创建虚拟主机,指定ip地址,并指定分流模式为轮询
- ipvsadm -a -t 192.168.187.100:80 -r 192.168.187.58:80 -g
- #添加真实服务器ip地址,并指定负载均衡模式为DR,ip隧道模式为-i,-m为nat集群模式
- ipvsadm -a -t 192.168.187.100:80 -r 192.168.187.88:80 -g
- #添加真实服务器ip地址,并指定负载均衡模式为DR,ip隧道模式为-i, -g为DR模式
-
- ipvsadm #启动策略
- ipvsadm -ln #查看当前节点状态信息
- ipvsadm -Lnc #监控连接数
此地址仅用作发送web响应数据包的原地址,并不需要监听客户机的访问请求(改由调度器监听并分发),因此使用虚拟接口lo:0 来承载VIP,并为本机添加一条路由记录,并将访问的VIP的数据限制在本地,以免通信紊乱
- cd /etc/sysconfig/network-scripts/ #进入网卡配置目录
- cp -p ifcfg-lo ifcfg-o:0 #复制环回网卡
- vim ifcfg-lo:0 #修改内容
- DEVICE=lo:0
- ONBOOT=yes
- IPADDR=192.168.187.100 #地址为VIP
- NETMASK=255.255.255.255
-
- ifup ifcfg-lo:0 #启动环回网卡
- ifconfig lo:0 #查看环回网卡
- route add -host 192.168.187.100 dev lo:0
-
- 或者下面方式,都可实现路由禁锢,下面的为永久添加
- vim /etc/rc.local #linux在开启启动时,会加载的内容
- /sbin/route add -host 192.168.187.100 dev lo:0
-
- route -n #查看路由表
web1
web2
- vim /etc/sysctl.conf
- #添加以下内容
- net.ipv4.conf.lo.arp_ignore = 1
- net.ipv4.conf.lo.arp_announce = 2
- net.ipv4.conf.all.arp_ignore = 1 #系统只响应目的ip为本地的arp请求
- net.ipv4.conf.all.arp_announce = 2 #系统不使用ip包的源地址来设置arp请求的原地址,而选择发送接口的ip地址。
-
- sysctl -p #加载生效
避免端口冲突 记得关闭nginx
网卡设为net模式 防火墙要关掉
vs/dr 本身不会关心IP层以上的信息,即使是端口号也是 tcp/ip 协议栈去判断是否正确,vs/dr本身主要做这么几个事:
接收client的请求,根据你设定的负载均衡算法选取一台 real server 的 ip;
以选取的这个 ip 对应的 mac 地址作为目标 mac,然后重新将IP包封装成帧转发给这台RS;
在hash table 中记录连接信息。
vs/dr 做的事情很少,也很简单,所以它的效率很高,不比硬件负载均衡设备差多少,数据包、数据帧的大致流向是这样的:client –> VS –> RS –> client。
既然要让 RS 能够处理目标地址为vip 的IP包,首先必须要让 RS能接收到这个包。在lo上配置vip能够完成接收包并将结果返回 client。不可以将VIP设置在出口网卡上,否则会响应客户端的 arp request,造成 client/gateway arp table 紊乱,以至于整个 load balance 都不能正常工作。
我们知道仰制arp 帧需要在server上执行以下命令,如下:
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
因为arp对逻辑口没有意义。实际上起作用的只有以下两条:echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
即对所有的物理网卡设置arp仰制。对仰制所有的物理网卡设置arp仰制是为了让CIP发送的请求顺利转交给DIR以及防止整个LVS环境arp表混乱,不然容易导致整个lvs不能工作。
lvs/dr 它是在数据链路层来实现的,即RIP必须能够接受到DIR的arp请求,如果不在同一网段则会隔离 arp,这样arp请求就不能转发到指定的RIP上,所以director必须和RS在同一网段里面。
如果是用了keepalived等工具做 HA或者Load Balance,则在健康检查时需要用到DIP。 没有健康检查机制的HA或者Load Balance则没有存在的实际意义。
lvs/dr 里,director 的vip的 netmask 没必要设置为255.255.255.255,director的vip本来就是要像正常的ip地址一样对外通告的,不要搞得这么特殊。
因为“负载调度机”转发时并不会改写数据包的目的IP,所以“节点服务器”收到的数据包的目的IP仍是“负载调度器”的虚拟服务IP。为了保证“节点服务器”能够正确处理该数据包,而不是丢弃,必须在“节点服务器”的环回网卡上绑定“负载调度器”的虚拟服务IP。这样“节点服务器”会认为这个虚拟服务IP是自己的IP,自己是能够处理这个数据包的。否则“节点服务器”会直接丢弃该数据包!
“节点服务器”上的业务进程必须监听在环回网卡的虚拟服务IP上,且端口必须和“负载调度机”上的虚拟服务端口一致。因为“负载调度机”不会改写数据包的目的端口,所以“节点服务器”服务的监听端口必须和虚拟服务端口一致,否则“节点服务器”会直接拒绝该数据包。
“节点服务器”处理完请求后,响应直接回给客户端,不再经过“负载调度机”。因为“节点服务器”收到的请求数据包的源IP是客户端的IP,所以理所当然“节点服务器”的响应会直接回给客户端,而不会再经过“负载调度机”。这时候要求“节点服务器”和客户端之间的网络是可达的。
“负载调度机”和“节点服务器”须位于同一个子网。因为“负载调度机”在转发过程中需要改写数据包的MAC为“节点服务器”的MAC地址,所以要能够查询到“节点服务器”的MAC。而要获取到“节点服务器”的MAC,则需要保证二者位于一个子网,否则“负载调度机”只能获取到“节点服务器”网关的MAC地址。