第二章 部署LVS-DR

DR模式的调度器和节点服务器都有VIP地址,但节点服务器的VIP在回环网卡,回环网卡的地址只能本机看到,外部主机看不到,所以不会冲突。

一、DR模式的简单过程

DR模式的具体过程:首先客户端.135向目标vip发出请求,调度器接收请求,报文送达到调度器的内核空间,调度器会根据请求的数据包判断是否需要负载均衡转发,根据调度算法选择转发数据帧给节点服务器,转发时会数据帧的mac地址重新封装,源mac地址变为调度器mac地址,目的mac地址变为节点服务器的mac地址。节点服务器收到数据帧,解封装后发现目标IP与本机匹配,然后才会处理报文。随后重新防撞报文,将响应报文通过lo接口传送出物理网卡然后向外发出,节点服务器在直接转发给客户端,不经过调度器。

二、数据包流向分析

(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 地址。

四、DR模式中的ARP问题

服务器ARP通信的紊乱的问题

        在LVS-DR负载均衡集群中,负载均衡器与节点服务器都要配置相同的VIP地址。在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的紊乱。(每次进行一次ARP请求广播,如果调度器第一个响应,就会在ARP缓存表中记录下vip地址和调度器的mac地址。然后ARP会更新,这个广播其他节点服务器也会响应,那么网关路由器就会对ARP缓存表进行覆盖,则会错误的记录VIP对应的mac地址关系。而后客户端发来请求时,网关路由器转发请求时就会直接转发给节点服务器了,那就发错了。)

        我们想实现的是:当ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会接收到ARP广播。只有前端的负载均衡器进行响应,其他节点服务器不应该响应ARP广播。

解决方法:

五、LVS-DR模式部署

调度器192.168.170.200
节点服务器1192.168.170.101
节点服务器2192.168.170.30
nfs服务器192.168.170.150
VIP:192.168.170.50
1、所有主机初始化操作
2、部署NFS共享存储 192.168.170.150
#安装nfs和rpcbind
[root@pyx ~]# yum install -y nfs
nfsometer.noarch  nfstest.noarch    
[root@pyx ~]# yum install -y nfs-utils rpcbind
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
软件包 1:nfs-utils-1.3.0-0.68.el7.x86_64 已安装并且是最新版本
软件包 rpcbind-0.2.0-49.el7.x86_64 已安装并且是最新版本
无须任何处理

#创建共享目录和测试文件
[root@pyx ~]# mkdir /share/{xy101,xy102} -p
[root@pyx ~]# ls /share/
xy101  xy102
[root@pyx ~]# cd /share/
[root@pyx share]# echo '<h1>this is xy101 test web page<\h1>' >xy101/test.html
[root@pyx share]# echo '<h1>this is xy102 test web page<\h1>' >xy102/test.html
[root@pyx share]# vim /etc/exports
                /share/xy101 192.168.170.0/24(ro)
                /share/xy102 192.168.170.0/24(ro)
[root@pyx share]# systemctl enable --now rpcbind nfs
[root@pyx share]# showmount -e
Export list for pyx.localdomain:
/share/xy102 192.168.170.0/24
/share/xy101 192.168.170.0/24

3、部署Web服务器 192.168.170.101 和192.168.170.30

注意:配置lo:0虚接口承载VIP;修改内核参数 arp_ignore=1、arp_announce=2防止网关ARP紊乱问题;添加路由 route add -host <VIP> dev lo:0

#节点服务器1,ip地址为192.168.170.101
[root@localhost ~]# systemctl start rpcbind
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 
[root@localhost ~]# showmount -e 192.168.170.150
Export list for 192.168.170.150:
/share/xy102 192.168.170.0/24
/share/xy101 192.168.170.0/24
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# rz -e
[root@localhost yum.repos.d]# ls
local.repo  repo.bak    nginx.repo
[root@localhost yum.repos.d]# yum install -y nginx
[root@localhost yum.repos.d]# systemctl start nginx
[root@localhost yum.repos.d]# mount 192.168.170.150:/share/xy101 /usr/share/nginx/html/
[root@localhost yum.repos.d]# ls !$
ls /usr/share/nginx/html/
[root@localhost yum.repos.d]# ls /usr/share/nginx/html/
test.html

//配置虚拟网卡和vip
[root@localhost local]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vim ifcfg-lo:0
                DEVICE=lo:0
                IPADDR=192.168.170.50
                NETMASK=255.255.255.255
                ONBOOT=yes
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ifconfig 
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.170.101  netmask 255.255.255.0  broadcast 192.168.170.255
        inet6 fe80::350e:a1d9:ebac:b0c8  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:88:0d:40  txqueuelen 1000  (Ethernet)
        RX packets 4175  bytes 2892573 (2.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2396  bytes 336307 (328.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 140  bytes 11852 (11.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 140  bytes 11852 (11.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.170.50  netmask 255.255.255.255
        loop  txqueuelen 1000  (Local Loopback)
virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:6b:12:f5  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

#验证需要关闭nginx长连接功能,不然要每次等65秒
[root@localhost network-scripts]# vim /etc/nginx/nginx.conf
                                  keepalive_timeout  0;
[root@localhost network-scripts]# systemctl restart nginx
[root@localhost network-scripts]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

#添加内核参数,解决ARP紊乱的问题
[root@localhost network-scripts]# vim /etc/sysctl.conf 
[root@localhost network-scripts]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2

#添加路由规则,把VIP地址指向lo网卡,物理网卡收到数据包后把请求送到lo网卡上
[root@localhost network-scripts]# route add -host 192.168.170.50 lo:0
[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.170.2   0.0.0.0         UG    100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
192.168.170.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.170.50  0.0.0.0         255.255.255.255 UH    0      0        0 lo

#配置开启自动添加路由的配置(实验可不加)
vim /etc/rc.local
/sbin/route add -host 192.168.170.50 dev lo:0
--------------------------------------------------------------------------------------
#节点服务器2,ip地址为192.168.170.30,操作同上

 

启动nginx后挂载,nginx设置开机自启

4、 部署调度器192.168.170.200

注意:配置ensXX:0虚接口承载VIP;修改内核参数ip_forward=0、send_redirects=0关闭IP转发和重定向功能;安装ipvsadm工具,添加虚拟服务器和真实服务器的配置,使用-g选项选择LVS-DR模式

[root@centOS2 ~]# yum install -y ipvsadm
[root@localhost yum.repos.d]# touch /etc/sysconfig/ipvsadm
[root@localhost yum.repos.d]# modprobe ip_vs
[root@localhost yum.repos.d]# lsmod 
Module                  Size  Used by     #查看ip_vs是否开启
ip_vs                 145458  0 
nf_conntrack          139264  1 ip_vs
tcp_lp                 12663  0 
nls_utf8               12557  1 

[root@centOS2 ~]# ifconfig 
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.170.200  netmask 255.255.255.0  broadcast 192.168.170.255
        inet6 fe80::eeee:e675:4604:c084  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:37:7e:11  txqueuelen 1000  (Ethernet)
        RX packets 1208  bytes 116488 (113.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 276  bytes 41159 (40.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 300  bytes 25728 (25.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 300  bytes 25728 (25.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:3d:de:67  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@centOS2 ~]# cd /etc/sysconfig/network-scripts/
[root@centOS2 network-scripts]# ls
ifcfg-ens33  ifdown-ib    ifdown-ppp       ifdown-tunnel  ifup-ib    ifup-plusb   ifup-Team         network-functions
ifcfg-lo     ifdown-ippp  ifdown-routes    ifup           ifup-ippp  ifup-post    ifup-TeamPort     network-functions-ipv6
ifdown       ifdown-ipv6  ifdown-sit       ifup-aliases   ifup-ipv6  ifup-ppp     ifup-tunnel
ifdown-bnep  ifdown-isdn  ifdown-Team      ifup-bnep      ifup-isdn  ifup-routes  ifup-wireless
ifdown-eth   ifdown-post  ifdown-TeamPort  ifup-eth       ifup-plip  ifup-sit     init.ipv6-global
[root@centOS2 network-scripts]# cp ifcfg-lo ifcfg-ens33:0
[root@centOS2 network-scripts]# vim ifcfg-ens33:0
DEVICE=ens33:0
IPADDR=192.168.170.50
NETMASK=255.255.255.255
ONBOOT=yes
[root@centOS2 network-scripts]# systemctl restart network
[root@centOS2 network-scripts]# ifconfig 
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.170.200  netmask 255.255.255.0  broadcast 192.168.170.255
        inet6 fe80::eeee:e675:4604:c084  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:37:7e:11  txqueuelen 1000  (Ethernet)
        RX packets 1621  bytes 148350 (144.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 557  bytes 75753 (73.9 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.170.50  netmask 255.255.255.255  broadcast 192.168.170.50
        ether 00:0c:29:37:7e:11  txqueuelen 1000  (Ethernet)

#修改内核参数
[root@centOS2 network-scripts]# vim /etc/sysctl.conf 
[root@centOS2 network-scripts]# sysctl -p
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

#创建规则
[root@centOS2 network-scripts]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@centOS2 network-scripts]# ipvsadm -C
[root@centOS2 network-scripts]# ipvsadm -A -t 192.168.170.50:80 -s rr
[root@centOS2 network-scripts]# ipvsadm -a -t 192.168.170.50:80 -r 192.168.170.101:80 -g
[root@centOS2 network-scripts]# ipvsadm -a -t 192.168.170.50:80 -r 192.168.170.30:80 -g
[root@centOS2 network-scripts]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  centOS2:http rr
  -> 192.168.170.30:http          Route   1      0          0         
  -> 192.168.170.101:http         Route   1      0          0 
[root@centOS2 network-scripts]# ipvsadm-save -n > /opt/ipvsadm.bak
[root@centOS2 network-scripts]# cat !$
cat /opt/ipvsadm.bak
-A -t 192.168.170.50:80 -s rr
-a -t 192.168.170.50:80 -r 192.168.170.30:80 -g -w 1
-a -t 192.168.170.50:80 -r 192.168.170.101:80 -g -w 1

 

修改内核参数

 

验证时关闭2台节点服务器的nginx长连接

5、在本地浏览器测试

注意:如何客户端跨网段,则调度器和节点服务器的默认网关要指向网关路由器的地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值