目录
LVS负载均衡DR模式主要用于将客户端请求分发到后端真实服务器。在DR模式下,LVS负载均衡器和后端真实服务器位于同一个物理网络中,通过修改数据包的MAC地址来实现请求的转发。
具有高性能、低延迟、配置简单等优点
具有如下几个特点:
Director Server 和 Real 必须在同一个物理网Server络中。
Real Server 可以使用私有地址,也可以使用公网地址。如果使用公网地址,可以通过互联网对 RIP 进行直接访问。
Director Server作为群集的访问入口,但不作为网关使用。
所有的请求报文经由 Director Server,但回复响应报文不能经过 Director Server。
Real Server 的网关不允许指向 Director Server IP,即Real Server发送的数据包不允许经过 Director Server。
Real Server 上的 lo 接口配置 VIP 的 IP 地址。
数据流向
DR模式的数据流向于NAT不同,客户端向VIP(集群的虚拟ip)发送数据包(源ip为自己,目的ip为VIP,源mac为自己。目的mac未知)。这时调度器接收到数据(也就是负载均衡器),对数据包进行解封装,根据负载均衡调度算法,判断出要发送给哪个真实服务器,然后将数据包进行封装,源ip 目的ip不变,目的mac地址变为真实服务器的mac地址。真实服务器收到数据包后对请求进行处理,当然也有解封装的过程。ip mac 地址都反过来,重新对数据进行封装,返回给客户端,不经过调度器。
如果集群内有网关路由器的话,客户端向VIP发送请求,首先需要经过网关路由器,网关路由器收到请求后并不知道发给谁,所以用ARP广播来寻找调度器,找到调度器后将数据发送给调度器,此时APR缓存表会更新调度器的mac地址与VIP绑定,方便下次直接发送,后面的数据流向就和没有网关路由器时一致,有一点区别就是真实服务器在返回数据时不是直接发送给客户端,而是先发送给路由器,由路由器转发给客户端。
ARP问题
问题1
或许你可能注意到了,客户端将数据包发送给网关路由器,然后路由器进行ARP广播,找到调度器,那么是如何找到的呢?因为调度器可以收到ARP广播,真实服务器也可以收到啊
这里就涉及到一个配置,在节点服务器(真实服务器)上配置一个内核参数arp_ignore=1(/etc/sysctl.cof,配置完成后需要重载内核参数 sysctl -p),这个参数的含义就是,忽视目的ip不是自己本身ip的请求,因为ARP广播的时候并不知道任何终端的ip,所以广播的目标ip就是VIP,然后节点服务器看到ip是VIP,不是自己本机的ip,所以忽视了这条广播,最终只有调度器收到了广播,对广播进行回应。
问题2
ARP在找到了调度器后,会将VIP与调度器的mac地址进行绑定,之后再有请求过来,就不需要再重新进行ARP广播了。但是,节点服务器将数据重新封装,发送给路由器时,源ip也是vip,那么路由器的ARP缓存表会将节点服务器的mac地址与vip进行绑定,对缓存表进行更新。
同样的,这个问题也可以通过配置来解决,重要的是思路,假如节点服务器在返回数据包的时候,源ip不使用VIP,而使用自己本机的ip,不就不会更新VIP与调度器mac地址的绑定了吗
我们同样在 /etc/sysctl.conf 文件里配置 arp_announce = 2 保存退出
sysctl -p 重载
LVS-DR部署
想要模拟DR模式的部署,至少需要四台机器
DR 服务器:172.16.233.101
Web 服务器1:172.16.233.102
Web 服务器2:172.16.233.103
vip:172.16.233.150
共享存储:172.16.233.104
1.配置负载均衡调度器
modprobe ip_vs
yum -y install ipvsadm
配置虚拟ip地址
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
编辑虚拟网口,只留下这四行
vim ifcfg-ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=172.16.233.150
NETMASK=255.255.255.255
启动网口
ifup ens33:0
调整 proc 相应参数
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
配置负载分配策略
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -ln 查看节点状态
清除规则,重新添加
ipvsadm -C
ipvsadm -A -t 172.16.233.150:80 -s rr
ipvsadm -a -t 172.16.233.150:80 -r 172.16.233.102:80 -g
ipvsadm -a -t 172.16.233.150:80 -r 172.16.233.103:80 -g
再次查看,此时已经有了对应条目
2.部署共享存储
yum -y install nfs-utils rpcbind
mkdir /opt/123 /opt/abc
chmod 777 /opt/123 /opt/abc
vim /etc/exports
/usr/share *(ro,sync)
/opt/123 172.16.233.0/24(rw,sync)
/opt/abc 172.16.233.0/24(rw,sync)
systemctl start nfs.service
systemctl start rpcbind.service
3.配置节点服务器
两台节点服务器配置相同
先配置虚拟 IP 地址
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=172.16.233.150
NETMASK=255.255.255.255
启动网口
ifup lo:0
ifconfig lo:0
route add -host 172.16.233.150 dev lo:0
vim /etc/rc.local
/sbin/route add -host 172.16.233.150 dev lo:0
chmod +x /etc/rc.d/rc.local
调整内核的ARP相应参数
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
net.ipv4.conf.all.arp_announce = 2
sysctl -p
yum -y install nfs-utils rpcbind httpd
systemctl start rpcbind
systemctl start httpd
至此两个台机器除ip外完全一致
其中一台机器:
mount.nfs 172.16.233.102:/opt/123 /var/www/html
echo '123123123' > /var/www/html/index.html
另一台:
mount.nfs 172.16.233.103:/opt/abc /var/www/html
echo 'abcabcabc' > /var/www/html/index.html
浏览器访问虚拟ip
完成