为方便进行原理分析,将Client与群集机器放在同一网络中,数据包流经的路线为1-2-3-4
一、Client 向目标 VIP 发出请求,Director(负载均衡器)接收。此时源MAC 地址为Client MAC地址,目标MAC地址为 调度器Director 的MAC地址。
二、Director 根据负载均衡算法选择 RealServer_1,不修改也不封装IP报文,而是将数据帧的MAC地址改成RealServer_1的MAC地址,而后在局域网上发送。此时源MAC地址为Director的MAC地址,目的MAC地址为RealServer_1的MAC地址。
三、RealServer_1收到这个帧,解封装后发现目标IP与本机匹配(RealServer事先绑定了VIP),因而处理这个报文。随后从新封装报文,将响应报文经过 lo 接口传送给物理网卡而后向外发出。此时源MAC地址为RealServer_1的MAC地址,目的MAC地址为Client的MAC地址。
四、Client将收到回复的报文。Client 认为获得正常的服务,而不会知道是哪一台服务器处理的。
注意:若是跨网段,则报文经过路由器经由Internet返回给用户html
一、在LVS-DR负载均衡集群中,负载均衡与节点服务器都要配置相同的VIP地址。
二、在局域网中具备相同的IP地址,势必会形成各服务器ARP通讯的紊乱。
当ARP广播发送到LVS-DR集群时,由于负载均衡器和节点服务器都是链接到相同网络上,它们都会接收到ARP广播。
只有前端的负载均衡器进行响应,其余节点服务器不该该响应ARP广播。
三、对节点服务器进行处理,使其不响应针对VIP的ARP请求
使用虚接口lo:0承载VIP地址
设置内核参数arp_ignore=1:系统只响应目的IP为本地IP的ARP请求
四、RealServer返回报文(源IP是VIP)经路由器转发,从新封装报文时,须要先获取路由器的MAC地址。
五、发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)做为ARP请求包中的源IP地址,而不使用发送接口的IP地址,如:ens33
六、路由器收到ARP请求后,将更新ARP表项
七、原有的VIP对应Director的MAC地址会被更新为VIP对应RealServer的MAC地址
八、路由器根据ARP表项,会将新来的请求报文转发给RealServer,致使Director的VIP失效
解决方法:
对节点服务器进行处理,设置内核参数arp_announce=2:系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址。
解决ARP的两个问题的设置方法前端
修改 /etc/sysctl.conf 文件 net.ipv4.conf.lo.arp_ignore=1 net.ipv4.conf.lo.arp_announce=2 net.ipv4.conf.all.arp_ignore=1 net.ipv4.conf.all.arp_announce=2
一、数据包流向分析
(1)、客户端发送请求到Director Server (负载均衡器),请求的数据报文(源IP是CIP, 目标IP是VIP)到达内核空间。
(2)、Director Server和Real Server在同一个网络中,数据经过二层数据链路层来传输。
(3)、内核空间判断数据包的目标IP是本机VIP,此时IPVS (IP虚拟服务器) 比对数据包请求的服务是不是集群服务,是集群服务就从新封装数据包。修改源MAC地址为Director Server 的MAC地址,修改目标MAC地址为Real Server 的MAC地址,源IP地址与目标IP地址没有改变,而后将数据包发送给Real Server。
(4)、到达Real Server 的请求报文的MAC 地址是自身的MAC地址,就接收此报文。数据包从新封装报文 (源IP地址为VIP,目标IP为CIP),将响应报文经过 lo 接口传送给物理网卡而后向外发出。
(5) 、Real Server 直接将响应报文传送到客户端。
二、DR模式的特色
(1) Director Server 和Real Server 必须在同一-个物理网络中。
(2)Real Server可使用私有地址,也可使用公网地址。若是使用公网地址,能够经过互联网对RIP进行直接访问。
(3)Director Server做为群集的访问入口,但不做为网关使用。
(4)全部的请求报文经由Director Server, 但回复响应报文不能通过Director Server。
(5)Real Server 的网关不容许指向Director Server IP,即 Real Server 发送的数据包不容许通过Director Server。
(6)Real Server 上的 lo 接口配置 VIP的IP地址。web
########DR模式LVS负载均衡群集部署######### DR 服务器:192.168.241.3 Web 服务器1:192.168.241.4 Web 服务器2:192.168.241.5 vip :192.168.241.200 客户端:192.168.241.6
一、配置负载调度器(192.168.241.3) systemctl stop firewalld.service setenforce 0 modprobe ip_vs cat /proc/net/ip_vs yum -y install ipvsadm (1)配置虚拟IP地址(VIP:192.168.241.200) cd /etc/sysconfig/network-scripts #若隧道模式,复制为ifcfg-tunl0 vim ifcfg-ens33:0 DEVICE=ens33:0 ONBOOT=yes IPADDR=192.168.241.200 NETMASK=255.255.255.255 ifup ens33:0 ifconfig ens33:0 (2)调整proc响应参数 #因为LVS负载调度器和各节点须要共用VIP地址,应该关闭Linux内核的重定向参数响应,不充当路由器 vim /etc/sysctl.conf net.ipv4.ip_forward = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.ens33.send_redirects = 0 sysctl -p (3)配置负载分配策略 ipvsadm-save > /etc/sysconfig/ipvsadm systemctl start ipvsadm ipvsadm -C ipvsadm -A -t 192.168.241.200:80 -s rr ipvsadm -a -t 192.168.241.200:80 -r 192.168.241.4:80 -g #若隧道模式,-g替换为-i ipvsadm -a -t 192.168.241.200:80 -r 192.168.241.5:80 -g ipvsadm ipvsadm -ln #查看节点状态,Router表明DR模式
二、部署共享存储(NFS服务器:192.168.241.6) systemctl stop firewalld.service setenforce 0 yum -y install nfs-utils rpcbind mkdir /opt/kgc /opt/benet chmod 777 /opt/kgc /opt/benet vim /etc/exports /opt/kgc 192.168.241.0/24(rw,sync,no_root_squash) /opt/benet 192.168.241.0/24(rw,sync,no_root_squash) echo 'this is benet web' > /opt/benet/index.html echo 'this is kgc web' > /opt/kgc/index.html systemctl start nfs systemctl start rpcbind
三、配置节点服务器(192.168.241.四、192.168.241.5) systemctl stop firewalld.service setenforce 0 (1)配置虚拟IP地址(VIP:192.168.241.200) #此地址仅用做发送Web响应数据包的源地址,并不须要监听客户机的访问请求(改由调度器监听并分发)。所以使用需接口lo:0来承载VIP地址,并为本机添加一条路由记录,将访问VIP的数据限制在本地,以免通讯紊乱 cd /etc/sysconfig/network-scripts ##须要将ens33的网关和DNS注释 cp ifcfg-lo ifcfg-lo:0 vim ifcfg-lo:0 DEVICE=lo:0 ONBOOT=yes IPADDR=192.168.241.200 NETMASK=255.255.255.255 ifup lo:0 ifconfig lo:0 route add -host 192.168.241.200 dev lo:0 或者vim /etc/rc.local /sbin/route add -host 192.168.241.200 dev lo:0 chmod +x /etc/rc.d/rc.local (2)调整内核的ARP响应参数以阻止更新VIP的MAC地址,避免发生冲突 vim /etc/sysctl.conf ...... net.ipv4.conf.lo.arp_ignore = 1 #系统只响应目的IP为本地IP的ARP请求 net.ipv4.conf.lo.arp_announce = 2 #系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 sysctl -p 或者 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 yum -y install nfs-utils rpcbind httpd systemctl start rpcbind systemctl start httpd ####192.168.241.4 mount 192.168.241.6:/opt/kgc /var/www/html ####192.168.241.5 mount 192.168.241.6:/opt/benet /var/www/html
四、测试LVS群集
在客户端使用浏览器访问http://192.168.241.200,默认网关指向192.168.241.200算法