LVS基于DR模式搭建负载均衡群集

LVS -DR模式集群架构原理图

 

架构工作原理:

1、PC机向目标VIP发出请求,BL接收

2、LB根据调度算法选择一台WEB服务器,不修改也不封装IP报文,而是将数据帧的目标MAC地址改为WEB的MAC地址,然后在局域网中发送。

3、WEB服务器接收到这个帧,解封装后发现目标IP(WEB事先绑定好VIP)和目标MAC与本机匹配,于是处理这个报文,随后重新封装报文,将源IP和源MAC封装为VIP和自己的MAC,然后发送到局域网。

4、PC机收到回复报文,并且认为得到正常的服务,而不会知道是哪台服务器处理的。

注:

在LVS-DR负载均衡群集中,负载均衡器与节点服务器都要配置相同的VIP地址,在局域网中具有相同的IP地址,势必会造成各种服务器ARP通信紊乱。当一个ARP广播发送到LVS-DR群集时,因为负载均衡器和节点服务器都是连接到相同的网络上的,它们都会接收到ARP广播,这个时候,应该只有前段的负载均衡器进行响应,其他节点服务器不应该响应ARP广播。

解决方法:在WEB节点的/etc/sysctl.conf文件

追加:

net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.lo.arp_announce = 2

 

实验环境:

主机名 主机IP 虚拟IP(VIP) 安装软件
LB(调度器) 192.168.1.11 192.168.1.100 ipvsadm
NFS 192.168.1.22   nfs
WEB1 192.168.1.33 192.168.1.100 httpd,nfs
WEB2 192.168.1.44 192.168.1.100 httpd,nfs

 

搭建

1、LB调度器的安装配置

 

 1 [root@LB~]#yum -y install ipvsadm
 2 [root@LB~]#ipvsadm -C      #清除ipvsadm中的转发规则
 3 [root@LB~]#ipvsadm -ln     #查看ipvsadm的转发表 
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 [root@LB~]#vi /opt/vip.sh #编写虚拟IP的生成脚本 9 #!/bin/bash 10 # VIP 11 VIP="192.168.1.100" 12 /sbin/ifconfig ens33:vip $VIP broadcast $VIP netmask 255.255.255.255 13 /sbin/route add -host $VIP dev ens33:vip 14 15 [root@LB~]#chmod +x /opt/vip.sh 16 [root@LB~]#/opt/vip.sh 17 [root@LB~]#ip a show ens33 18 eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 19 link/ether 00:0c:29:10:60:35 brd ff:ff:ff:ff:ff:ff 20 inet 192.168.1.11/24 brd 192.168.2.255 scope global ens33 21 inet 192.168.1.100/32 brd 192.168.1.100 scope global ens33:vip 22 inet6 fe80::20c:29ff:fe10:6035/64 scope link 23 valid_lft forever preferred_lft forever 24 25 [root@LB~]#route -n #查看路由表 26 Kernel IP routing table 27 Destination Gateway Genmask Flags Metric Ref Use Iface 28 0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 ens33 29 192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33 30 192.168.1.100 0.0.0.0 255.255.255.255 UH 0 0 0 ens33 31 [root@LB~]#echo "/opt/vip.sh">>/etc/rc.local 32 [root@LB~]#ipvsadm -At 192.168.1.100:80 -s rr #ipvsadm具体的命令语法自行百度 33 [root@LB~]#ipvsadm -at 192.168.1.100:80 -r 192.168.1.33:80 -g 34 [root@LB~]#ipvsadm -at 192.168.1.100:80 -r 192.168.1.44:80 -g 35 [root@LB~]#ipvsadm -ln 36 IP Virtual Server version 1.2.1 (size=4096) 37 Prot LocalAddress:Port Scheduler Flags 38 -> RemoteAddress:Port Forward Weight ActiveConn InActConn 39 TCP 192.168.1.100:80 rr 40 -> 192.168.1.33:80 Route 1 0 0 41 -> 192.168.1.44:80 Route 1 0 0 42 43 [root@LB~]#ipvsadm -S > /etc/sysconfig/ipvsadm #将ipvsadm生成的转发规则保存的ipvsadm文件中

 

 

2、WEB1、WEB2的配置

 

 1 [root@WEB1 ~]#yum -y install httpd nfs-utils                   #下载Apache、nfs服务
 2 [root@WEB1 ~]#sed -i '/#S/ s/#//' /etc/httpd/conf/httpd.conf   #启用apache的域名服务
 3 [root@WEB1 ~]#sed -n '/com:80/p' /etc/httpd/conf/httpd.conf 
 4 ServerName www.example.com:80
 5 [root@WEB1 ~]# /etc/init.d/httpd start
 6 正在启动 httpd:                                           [确定]
 7  
 8 [root@WEB1 ~]# vim /etc/fstab           #编辑fstab文件,写入nfs服务器的挂载目录,使其永久生效。
 9 ……
10 192.168.1.22:/opt/www/   /var/www/html/          nfs     defaults,_netdev       1 2
11 #挂载点IP:挂载点目录       #挂载到的目录            
12 
13 [root@WEB1 ~]# mount -a    #挂载所以可挂载点
14 [root@WEB1 ~]# df -hT      #查看挂载情况
15 Filesystem                 Type   Size  Used Avail Use% Mounted on
16 /dev/mapper/vg_www-lv_root ext4    37G  1.3G   34G   4% /
17 /dev/sda1                  ext4   485M   33M  427M   8% /boot
18 tmpfs                      tmpfs  242M     0  242M   0% /dev/shm
19 192.168.1.22:/opt/www/      nfs     37G  1.3G   34G   4% /var/www/html
20 
21 [root@WEB1 ~]#vi /opt/lvs-dr    #编写虚拟IP的生产脚本
22 #!/bin/bash
23 # lvs-dr
24 VIP="192.168.1.100"
25 /sbin/ifconfig lo:vip $VIP broadcast $VIP netmask 255.255.255.255   #这个VIP是绑定到本地回环接口的
26 /sbin/route add -host $VIP dev lo:vip
27 echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
28 echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
29 echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
30 echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
31 
32 [root@WEB1 ~]#chmod +x /opt/lvs-dr
33 [root@WEB1 ~]#/opt/lvs-dr
34 [root@WEB1 ~]#echo "/opt/lvs-dr" >> /etc/rc.local
35 [root@WEB1 ~]#ip a show lo     #查看本地回环接口信息
36 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
37     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
38     inet 127.0.0.1/8 scope host lo
39        valid_lft forever preferred_lft forever
40     inet 192.168.1.100/32 brd 192.168.1.100 scope global lo:vip
41        valid_lft forever preferred_lft forever
42     inet6 ::1/128 scope host 
43        valid_lft forever preferred_lft forever
44 
45 [root@WEB1 ~]#route -n
46 Kernel IP routing table
47 Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
48 0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 ens33
49 192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens33
50 192.168.1.100   0.0.0.0         255.255.255.255 UH    0      0        0 lo
51 
52 

 

 

3、NFS服务器配置

 1 [root@nfs ~]# yum -y install nfs-utils rpcbind    #下载NFS rpcbind
 2 [root@nfs ~]# mkdir /opt/www
 3 [root@nfs ~]# vim /etc/exports                    #设置共享目录,将/opt/www作为共享目录,要求192.168.2.0/24网段只读权限访问网页数据(若增加读写速度和安全性,可结合raid5+LVM)
 4 /opt/www        192.168.1.0/24(ro,sync,no_root_squash)   5 
 5 [root@nfs ~]# /etc/init.d/rpcbind start
 6 正在启动 rpcbind:                                         [确定]
 7 [root@nfs ~]# /etc/init.d/nfs start
 8 启动 NFS 服务:                                            [确定]
 9 启动 NFS mountd:                                          [确定]
10 启动 NFS 守护进程:                                        [确定]
11 正在启动 RPC idmapd:                                      [确定]
12 [root@nfs ~]# showmount -e 192.168.1.22            #查看nfs挂载情况
13 Export list for 192.168.1.22:
14 /opt/www 192.168.1.0/24
15 [root@nfs ~]# chkconfig rpcbind on   #设置开机启动
16 [root@nfs ~]# chkconfig nfs on       #设置开机启动
17 [root@nfs ~]# echo "<h1>it works</h1>">/opt/www/index.html   #编辑共享文件内容

4、WEB1、WEB2服务器将NFS共享的挂载目录挂载到本地

 1 [root@WEB1~]#vi /etc/fstab
 2 192.168.1.22:/opt/www/   /var/www/html/          nfs     defaults,_netdev       1 2
 3 
 4 [root@WEB1~]#mount -a
 5 [root@WEB1~]#df -hT
 6 Filesystem                 Type   Size  Used Avail Use% Mounted on
 7 /dev/mapper/vg_www-lv_root ext4    37G  1.3G   34G   4% /
 8 /dev/sda1                  ext4   485M   33M  427M   8% /boot
 9 tmpfs                      tmpfs  242M     0  242M   0% /dev/shm
10 192.168.1.22:/opt/www/      nfs     37G  1.3G   34G   4% /var/www/html

 

 

5、PC客户端测试

查看LB调度器的访问日志:

 1 [root@LB~]#ipvsadm -L -n -c
 2 IPVS connection entries
 3 pro expire state       source             virtual            destination
 4 TCP 01:54  FIN_WAIT    192.168.1.1:54059  192.168.1.100:80   192.168.1.44:80
 5 TCP 01:54  FIN_WAIT    192.168.1.1:54064  192.168.1.100:80   192.168.1.33:80
 6 TCP 01:53  FIN_WAIT    192.168.1.1:54056  192.168.1.100:80   192.168.1.33:80
 7 TCP 01:54  FIN_WAIT    192.168.1.1:54063  192.168.1.100:80   192.168.1.44:80
 8 TCP 01:56  FIN_WAIT    192.168.1.1:54087  192.168.1.100:80   192.168.1.33:80
 9 TCP 01:53  FIN_WAIT    192.168.1.1:54050  192.168.1.100:80   192.168.1.33:80
10 TCP 01:54  FIN_WAIT    192.168.1.1:54058  192.168.1.100:80   192.168.1.33:80
11 TCP 01:55  FIN_WAIT    192.168.1.1:54075  192.168.1.100:80   192.168.1.33:80
12 TCP 01:53  FIN_WAIT    192.168.1.1:54057  192.168.1.100:80   192.168.1.44:80
13 TCP 01:55  FIN_WAIT    192.168.1.1:54077  192.168.1.100:80   192.168.1.33:80
14 TCP 01:54  FIN_WAIT    192.168.1.1:54060  192.168.1.100:80   192.168.1.33:80
15 TCP 01:53  FIN_WAIT    192.168.1.1:54054  192.168.1.100:80   192.168.1.33:80
16 TCP 01:53  FIN_WAIT    192.168.1.1:54049  192.168.1.100:80   192.168.1.44:80
17 TCP 01:55  FIN_WAIT    192.168.1.1:54082  192.168.1.100:80   192.168.1.44:80
18 TCP 01:56  FIN_WAIT    192.168.1.1:54086  192.168.1.100:80   192.168.1.44:80

 

搭建完成

知识补充:arp_announce和arp_ignore

arp_announce : INTEGER

         默认为0

         对网络接口上本地IP地址发出的ARP回应作出相应级别的限制:

         确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口

         0 - (默认) 在任意网络接口上的任何本地地址

         1 -尽量避免不在该网络接口子网段的本地地址. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.

         2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送

         all/ 和{interface}/ 下两者同时比较,取较大一个值生效.

         提高约束级别有益于从指定的目标接受应答,而降低级别可以给予更多的arp查询者以反馈信息(关于arp代理这一段我普遍翻译地不好,去啃一下tcp/ip bible的卷一,然后再翻译吧)

 

arp_ignore : INTEGER

         默认为0

         定义对目标地址为本地IP的ARP询问不同的应答模式

         0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那么即使eth0收到来自10.1.1.2这样地址发起的对10.1.1.1 的arp查询也会回应--而原本这个请求该是出现在eth1上,也该有eth1回应的)

         1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那么即使eth0收到来自10.1.1.2这样地址发起的对192.168.0.1的查询会回答,而对10.1.1.1 的arp查询不会回应)

         2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,eth1收到来自10.1.1.2这样地址发起的对192.168.0.1的查询不会回答,而对192.168.0.2发起的对192.168.0.1的arp查询会回应)

         3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应(do not reply for local addresses configured with scope host,only resolutions for global and link addresses are replied 翻译地似乎不好,这个我的去问问人)

         4-7 - 保留未使用

         8 -不回应所有(本地地址)的arp查询

         all/ 和{interface}/ 下两者同时比较,取较大一个值生效.

posted @ 2019-03-28 21:47  zh_Revival  阅读(513)  评论(0编辑  收藏  举报