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}/ 下两者同时比较,取较大一个值生效.