部署LVS-DR(直接路由)群集
- 一、LVS-DR数据包流向分析
- 二、LVS-DR中的ARP问题
- 三、案例:LVS-DR部署
- 3.1、环境
- 3.2、配置调度服务器
- 3.3、配置NFS服务器
- 3.4、配置Web1服务器
- 3.5、配置web2服务器
- 3.6、客户机测试
- 总结
一、LVS-DR数据包流向分析
为了方便进行原理分析,将Client与群集机器放在网络中,数据包流经的路线为1-2-3-4
LVS-DR模型的特点
①RS和DS必须在同一个物理网络中
②RS可以使用私有地址,也可以使用公网地址,如果使用公网地址,可以通过互联网对RIP进行直接访问
③所有的请求报文经由Director Server,但响应报文必须不能经过Director Server
④RS的数据包绝不允许指向DIP
⑤RS上的lo接口配置VIP的IP地址
1.1、Client向目标VIP发出请求,Director(负载均衡器)接收
1.1.1、IP包头及数据帧头信息
1.2、Director根据负载均衡算法选择RealServer_1,不修改也不封装IP报文,而是将数据帧的MAC地址改为RealServer_1的MAC地址,然后再局域网上发送
1.2.1、IP包头及数据帧头信息
1.3、RealServer_1收到这个帧,解封装后发现目标IP与本机匹配(RealServer事先绑定了VIP),于是处理这个报文,随后重新封装报文,发送到局域网
1.3.1、IP包头及数据帧头信息
1.4、Client将收到回复报文,Client人为得到正常的服务,而不会知道是哪一台服务器处理的
1.4.1、注意:如果跨网段,则报文通过路由器经由Internet返回给用户
二、LVS-DR中的ARP问题
2.1、在LVS-DR负载均衡集群中,负载均衡与节点服务器都要配置相同的VIP地址
2.2、在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的紊乱
2.2.1、当ARP广播发送到LVS-DR集群时,因为负载均衡和节点服务器都是连接到相同的网络上,它们都会接收到ARP广播
2.2.2、只有前端的负载均衡器进行响应广播,节点服务器不应该响应ARP广播
2.3、对节点服务要求进行处理,使其不响应针对VIP的ARP请求
2.3.1、使用虚接口lo:0承载VIP地址
2.3.2、设置内核参数arp_ignore=1:系统只响应目的IP为本地IP的ARP请求
2.4、RealServer返回报文(源IP是VIP)经路由器转发,重新封装报文时,需要先获取路由器的MAC地址
2.5、发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包中的源IP地址,而不使用发送接口的IP地址
2.6、路由器收到ARP请求后,将更新ARP表项
2.7、原有的VIP对应Director的MAC地址会被更新为VIP对应RealServer的MAC地址
2.8、问题
路由表根据ARP表项,会将新来的请求报文转发给RealServer,导致Director的VIP失效
2.9、解决方法
对节点服务器进行处理,设置内核参数arp_announce=2:系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址
三、案例:LVS-DR部署
3.1、环境
调度服务器 |
192.168.100.10/24(内网) |
192.168.100.100/24(VIP) |
|
Web1服务器 |
192.168.100.20/24 |
Web2服务器 |
192.168.100.30/24 |
NFS共享服务器 |
192.168.100.40/24 |
客户机一台 |
用于测试验证 |
3.2、配置调度服务器
1 加载ip_vs模块 2 [root@lvs ~]# modprobe ip_vs 3 [root@lvs ~]# cat /proc/net/ip_vs 4 IP Virtual Server version 1.2.1 (size=4096) 5 Prot LocalAddress:Port Scheduler Flags 6 -> RemoteAddress:Port Forward Weight ActiveConn InActConn 7 8 安装管理软件ipvsadm,不需要启动 9 [root@lvs ~]# rpm -ivh /mnt/Packages/ipvsadm-1.27-7.el7.x86_64.rpm 10 11 编辑调度服务器脚本 12 [root@lvs ~]# vi dr.sh 13 #!/bin/bash 14 # dr调度服务器安装 15 ifconfig ens33:0 192.168.100.100 broadcast 192.168.100.100 netmask 255.255.255.255 up #添加虚拟地址的虚接口 16 route add -host 192.168.100.100 dev ens33:0 #给ens33:0添加路由 17 ipvsadm -C #清除内核虚拟服务器表中的所有记录 18 ipvsadm -A -t 192.168.100.100:80 -s rr #创建虚拟服务器 19 ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.20:80 -g #添加服务器节点 20 ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.30:80 -g #添加服务器节点 21 ipvsadm -Ln #查看节点状态,加个"-n"将以数字形式显示地址、端口信息 22 23 执行脚本 24 [root@lvs ~]# sh dr.sh 25 26 查看接口 27 [root@lvs ~]# ifconfig 28 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 29 inet 192.168.100.10 netmask 255.255.255.0 broadcast 192.168.100.255 30 inet6 fe80::26b5:ebd3:a0d2:db12 prefixlen 64 scopeid 0x20<link> 31 ether 00:0c:29:9a:cd:27 txqueuelen 1000 (Ethernet) 32 RX packets 3038 bytes 1120347 (1.0 MiB) 33 RX errors 0 dropped 0 overruns 0 frame 0 34 TX packets 1151 bytes 130160 (127.1 KiB) 35 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 36 37 ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 38 inet 192.168.100.100 netmask 255.255.255.255 broadcast 192.168.100.100 39 ether 00:0c:29:9a:cd:27 txqueuelen 1000 (Ethernet) 40 41 ###选项注释 42 "-A":表示添加虚拟服务器 43 "-a":表示添加真实服务器 44 "-t":用来指定VIP地址及TCP端口 45 "-r":用来指定RIP地址及TCP端口 46 "-s":用来指定负载调度算法——rr(轮询)、wrr(加权轮询)、lc(最少连接)、wlc(加权最少连接) 47 "-m":表示使用NAT群集模式(是DR模式,是TUN模式)
3.3 配置NFS服务器
1 安装NFS服务 2 [root@nfs-server ~]# yum -y install rpcbind nfs-utils 3 4 创建测试目录并新建网页 5 [root@nfs-server ~]# mkdir -p /opt/web1 6 [root@nfs-server ~]# mkdir -p /opt/web2 7 [root@nfs-server ~]# echo '<h1>this is web 1!</h1>' > /opt/web1/index.html 8 [root@nfs-server ~]# echo '<h1>this is web 2!</h1>' > /opt/web2/index.html 9 10 设置访问权限 11 [root@nfs-server ~]# vi /etc/exports 12 /opt/web1 192.168.100.20(ro) 13 /opt/web2 192.168.100.30(ro) 14 15 开启服务并开机自启 16 [root@nfs-server ~]# systemctl start nfs 17 [root@nfs-server ~]# systemctl start rpcbind 18 [root@nfs-server ~]# systemctl enable nfs 19 [root@nfs-server ~]# systemctl enable rpcbind 20 21 查看访问权限 22 [root@nfs-server ~]# showmount -e 23 Export list for nfs-server: 24 /opt/web2 192.168.100.30 25 /opt/web1 192.168.100.20
3.4、配置Web1服务器
1 安装httpd服务 2 [root@web1 ~]# yum -y install httpd 3 4 挂载NFS服务 5 [root@web1 ~]# mount 192.168.100.40:/opt/web1 /var/www/html 6 7 查看权限 8 [root@web1 ~]# showmount -e 192.168.100.40 9 Export list for 192.168.100.40: 10 /opt/web2 192.168.100.30 11 /opt/web1 192.168.100.20 12 13 开启httpd服务 14 [root@web1 ~]# systemctl start httpd 15 16 本机访问 17 [root@web1 ~]# curl http://localhost 18 <h1>this is web1!</h1> 19 20 配置DR模式 21 [root@web1 ~]# vi web1.sh 22 #!/bin/bash 23 # web1 24 ifconfig lo:0 192.168.100.100 broadcast 192.168.100.100 netmask 255.255.255.255 up 25 route add -host 192.168.100.100 dev lo:0 26 echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore 27 echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore 28 echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce 29 echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce 30 sysctl -p &> /dev/null 31 32 执行脚本 33 [root@web1 ~]# sh web1.sh 34 35 查看端口信息 36 [root@web1 ~]# ifconfig 37 ...... 38 lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 39 inet 192.168.100.100 netmask 255.255.255.255 40 loop txqueuelen 1 (Local Loopback) 41 ......
3.5、配置web2服务器
1 安装httpd服务 2 [root@web1 ~]# yum -y install httpd 3 4 挂载NFS服务 5 [root@web1 ~]# mount 192.168.100.40:/opt/web2 /var/www/html 6 7 查看权限 8 [root@web1 ~]# showmount -e 192.168.100.40 9 Export list for 192.168.100.40: 10 /opt/web2 192.168.100.30 11 /opt/web1 192.168.100.20 12 13 开启httpd服务 14 [root@web1 ~]# systemctl start httpd 15 16 本机访问 17 [root@web1 ~]# curl http://localhost 18 <h1>this is web2!</h1> 19 20 配置DR模式 21 [root@web1 ~]# vi web2.sh 22 #!/bin/bash 23 # web2 24 ifconfig lo:0 192.168.100.100 broadcast 192.168.100.100 netmask 255.255.255.255 up 25 route add -host 192.168.100.100 dev lo:0 26 echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore 27 echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore 28 echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce 29 echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce 30 sysctl -p &> /dev/null 31 32 执行脚本 33 [root@web1 ~]# sh web2.sh 34 35 查看端口信息 36 [root@web1 ~]# ifconfig 37 ...... 38 lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 39 inet 192.168.100.100 netmask 255.255.255.255 40 loop txqueuelen 1 (Local Loopback) 41 ......
3.6、客户机测试
①先访问web1和web2服务器的IP
②再测试LVS-DR服务器IP
③查看节点状态
1 [root@lvs ~]# ipvsadm -Ln 2 IP Virtual Server version 1.2.1 (size=4096) 3 Prot LocalAddress:Port Scheduler Flags 4 -> RemoteAddress:Port Forward Weight ActiveConn InActConn 5 TCP 192.168.100.100:80 rr 6 -> 192.168.100.20:80 Route 1 0 2 7 -> 192.168.100.30:80 Route 1 0 1 8 #使用的是轮询,所以权重都是1
总结
基本上LVS-DR就介绍到这里,个人还是觉得像要对LVS有一个比较全面的认识,还是需要去将官方文档认真的看过一遍。