了解部署LVS-DR群集

 

一、LVS-DR数据包流向分析

1、为方便进行原理分析,将Client与群集机器放在同一网络中,数据包流经的路线为1-2-3-4

 

 2、Client向目标VIP发出请求,Director(负载均衡器)接收

·IP包头及数据帧头信息

 

 

 3、Director根据负载均衡算法选择RealServer_1,不修改也不封装IP报文,而是将数据帧的MAC地址改为RealServer_1的MAC地址,然后在局域网上发送

·IP包头及数据帧头信息

 

 4、RealServer_1收到这个帧,解封装后发现目标IP与本机匹配(RealServer事先绑定了VIP),于是处理这个报文。随后重新封装报文,发送到局域网

·IP包头及数据帧头信息

 

 

 5、Client将收到回复报文。Client认为得到正常的服务,而不会知道是哪一台服务器处理的

注意:如果跨网段,则报文通过路由器经由Internet返回给用户

 

 二、LVS-DR中的ARP问题

1、在LVS-DR负载均衡集群中,负载均衡器与节点服务器都要配置相同的VIP地址

2、在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的紊乱

·当ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会接收到ARP广播

3、对节点服务器进行处理,使其不响应针对VIP的ARP请求

·使用虚接口lo:0承载VIP地址

·设置内核参数arp_ignore=1:系统只响应目的IP为本地IP的ARP请求

4、RealServer返回报文(源IP是VIP)经路由器转发,重新封装报文时,需要先获取路由器MAC地址

5、发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包中的源IP地址,而不使用发送接口的IP地址

·如:ens33接口

 

6、路由器收到ARP请求后,将更新ARP表项

7、原有的VIP对应Director的MAC地址会被更新为VIP对应RealServer的MAC地址 

 

 8、问题:路由器根据ARP表项,会将新来的请求报文转发给RealServer,导致Director的VIP失效

       解决方法:对节点服务器进行处理,设置内核参数arp_announce=2:系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址

 

解决ARP的两个问题的设置方法

1、修改/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

 

三、案例:LVS-DR部署

环境

调度服务器

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

客户机一台

用于测试验证

配置调度服务器

加载ip_vs模块
[root@lvs ~]# modprobe ip_vs
[root@lvs ~]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
安装管理软件ipvsadm,不需要启动
[root@lvs ~]# rpm -ivh /mnt/Packages/ipvsadm-1.27-7.el7.x86_64.rpm
编辑调度服务器脚本
[root@lvs ~]# vi dr.sh
#!/bin/bash
# dr调度服务器安装
ifconfig ens33:0 192.168.100.100 broadcast 192.168.100.100  netmask 255.255.255.255 up       #添加虚拟地址的虚接口
route add -host 192.168.100.100 dev ens33:0      #给ens33:0添加路由
ipvsadm -C                  #清除内核虚拟服务器表中的所有记录
ipvsadm -A -t 192.168.100.100:80 -s rr      #创建虚拟服务器
ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.20:80 -g   #添加服务器节点
ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.30:80 -g   #添加服务器节点
ipvsadm -Ln         #查看节点状态,加个"-n"将以数字形式显示地址、端口信息
执行脚本
[root@lvs ~]# sh dr.sh
查看接口
[root@lvs ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.10  netmask 255.255.255.0  broadcast 192.168.100.255
        inet6 fe80::26b5:ebd3:a0d2:db12  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:9a:cd:27  txqueuelen 1000  (Ethernet)
        RX packets 3038  bytes 1120347 (1.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1151  bytes 130160 (127.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.100  netmask 255.255.255.255  broadcast 192.168.100.100
        ether 00:0c:29:9a:cd:27  txqueuelen 1000  (Ethernet)
###选项注释
"-A":表示添加虚拟服务器
"-a":表示添加真实服务器
"-t":用来指定VIP地址及TCP端口
"-r":用来指定RIP地址及TCP端口
"-s":用来指定负载调度算法——rr(轮询)、wrr(加权轮询)、lc(最少连接)、wlc(加权最少连接)
"-m":表示使用NAT群集模式(是DR模式,是TUN模式)

 

配置NFS服务器

安装NFS服务
[root@nfs-server ~]# yum -y install rpcbind nfs-utils
创建测试目录并新建网页
[root@nfs-server ~]# mkdir -p /opt/web1
[root@nfs-server ~]# mkdir -p /opt/web2
[root@nfs-server ~]# echo '<h1>this is web 1!</h1>' > /opt/web1/index.html
[root@nfs-server ~]# echo '<h1>this is web 2!</h1>' > /opt/web2/index.html
设置访问权限
[root@nfs-server ~]# vi /etc/exports
/opt/web1  192.168.100.20(ro)
/opt/web2  192.168.100.30(ro)
开启服务并开机自启
[root@nfs-server ~]# systemctl start nfs
[root@nfs-server ~]# systemctl start rpcbind
[root@nfs-server ~]# systemctl enable nfs
[root@nfs-server ~]# systemctl enable rpcbind
查看访问权限
[root@nfs-server ~]# showmount -e
Export list for nfs-server:
/opt/web2 192.168.100.30
/opt/web1 192.168.100.20

 

配置Web1服务器

安装httpd服务
[root@web1 ~]# yum -y install httpd
挂载NFS服务
[root@web1 ~]# mount 192.168.100.40:/opt/web1 /var/www/html
查看权限
[root@web1 ~]# showmount -e 192.168.100.40
Export list for 192.168.100.40:
/opt/web2 192.168.100.30
/opt/web1 192.168.100.20
开启httpd服务
[root@web1 ~]# systemctl start httpd
本机访问
[root@web1 ~]# curl http://localhost
<h1>this is web1!</h1>
配置DR模式
[root@web1 ~]# vi web1.sh
#!/bin/bash
# web1
ifconfig lo:0 192.168.100.100 broadcast 192.168.100.100 netmask 255.255.255.255 up
route add -host 192.168.100.100 dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p &> /dev/null
执行脚本
[root@web1 ~]# sh web1.sh
查看端口信息
[root@web1 ~]# ifconfig
......
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.100.100  netmask 255.255.255.255
        loop  txqueuelen 1  (Local Loopback)
......

 

配置web2服务器

安装httpd服务
[root@web1 ~]# yum -y install httpd
挂载NFS服务
[root@web1 ~]# mount 192.168.100.40:/opt/web2 /var/www/html
查看权限
[root@web1 ~]# showmount -e 192.168.100.40
Export list for 192.168.100.40:
/opt/web2 192.168.100.30
/opt/web1 192.168.100.20
开启httpd服务
[root@web1 ~]# systemctl start httpd
本机访问
[root@web1 ~]# curl http://localhost
<h1>this is web2!</h1>
配置DR模式
[root@web1 ~]# vi web2.sh
#!/bin/bash
# web2
ifconfig lo:0 192.168.100.100 broadcast 192.168.100.100 netmask 255.255.255.255 up
route add -host 192.168.100.100 dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p &> /dev/null
执行脚本
[root@web1 ~]# sh web2.sh
查看端口信息
[root@web1 ~]# ifconfig
......
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.100.100  netmask 255.255.255.255
        loop  txqueuelen 1  (Local Loopback)
......

 

客户机测试

①先访问web1和web2服务器的IP

 

 

 

 

 

 ②再测试LVS-DR服务器IP

 

 

 

 

 ③查看节点状态

 [root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
 -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.100.100:80 rr
 -> 192.168.100.20:80            Route   1      0          2
 -> 192.168.100.30:80            Route   1      0          1
#使用的是轮询,所以权重都是1

 

posted @ 2020-11-11 11:14  Biu小怪兽  阅读(68)  评论(0编辑  收藏  举报