配置lvs(DR)
主机名 | 主机 | IP地址 |
---|---|---|
lvs1 | lvs | 192.168.88.38 |
web1 | nginx | 192.168.88.10 |
web2 | nginx | 192.168.88.20 |
lvs1上操作
#安装ipvsadm
[root@lvs1 ~]# yum -y install ipvsadm
[root@lvs1 ~]# ipvsadm -A -t 192.168.88.100:80 -s rr
[root@lvs1 ~]# ipvsadm -a -t 192.168.88.100:80 -r 192.168.88.10:80 -g
[root@lvs1 ~]# ipvsadm -a -t 192.168.88.100:80 -r 192.168.88.20:80 -g
[root@lvs1 ~]# ip addr add 192.168.88.100/24 dev ens37
[root@lvs1 ~]# ip a
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:48:b3:7b brd ff:ff:ff:ff:ff:ffinet 192.168.88.38/24 brd 192.168.88.255 scope global noprefixroute ens37valid_lft forever preferred_lft foreverinet 192.168.88.100/24 scope global secondary ens37valid_lft forever preferred_lft foreverinet6 fe80::dbb5:b534:a44a:a21/64 scope link noprefixroute valid_lft forever preferred_lft forever
[root@lvs1 ~]# 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.88.100:80 rr-> 192.168.88.10:80 Route 1 1 0 -> 192.168.88.20:80 Route 1 1 0
web1,web2上操作
[root@web1 ~]# vim /etc/yum.repos.d/nginx.repo
[root@web1 ~]# cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[root@web1 ~]# yum install -y nginx
[root@web1 ~]# systemctl enable nginx --now
#设置成开机自启
[root@web ~]# cat /etc/nginx/conf.d/www.conf server {listen 80;server_name localhost;location / {root /opt/;index index.php index.html;}location ~ \.php$ {root /html/www;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_pass 127.0.0.1:9000;include fastcgi_params;}
}
这里把nginx的网页根目录修改成了/opt
[root@web ~]# cat /opt/index.html
test1
[root@web2 ~]# cat /opt/index.html
test2
[root@web ~]# ip addr add 192.168.88.100/24 dev ens37
[root@web2 ~]# ip addr add 192.168.88.100/24 dev ens37
[root@web ~]# ip a
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:1d:db:1e brd ff:ff:ff:ff:ff:ffinet 192.168.88.10/24 brd 192.168.88.255 scope global noprefixroute ens37valid_lft forever preferred_lft foreverinet 192.168.88.100/24 scope global secondary ens37valid_lft forever preferred_lft foreverinet6 fe80::e5ba:c25b:cc86:2c12/64 scope link noprefixroute valid_lft forever preferred_lft forever
[root@web2 ~]# ip a
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:a5:68:f6 brd ff:ff:ff:ff:ff:ffinet 192.168.88.20/24 brd 192.168.88.255 scope global noprefixroute ens37valid_lft forever preferred_lft foreverinet 192.168.88.100/24 scope global secondary ens37valid_lft forever preferred_lft foreverinet6 fe80::7de0:34dc:644b:46b5/64 scope link noprefixroute valid_lft forever preferred_lft forever
在真机上测试:**curl 192.168.88.100 **在真机上测试,发现客户端发出请求,通过调度器访问web资源的时候,会一直向同一个web服务器(server3)要资源,并 没有实现轮询。
注意:此时客户端访问资源有时候轮询,有时候不轮询,出现这样的现象是为什么呢?
因为DR模式是通过 修改MAC地址 进行访问的,调度器和两台web服务器上都有192.168.88.100这个入口地址VIP,所以客户端在请求的时候,三台虚拟机都有可能回复请求,客户端会记录回复他的那台虚拟机的mac地址,所以下次在访问的时候他会找记录过的mac地址对应的虚拟机(有可能是真实的服务器)直接访问,这在现实中是 不允许 的,因为 如果请求全部发往后端某一台真正的服务器的话,这台服务器会因为压力过大而宕机。而且,直接访问后端的真正的服务器,我们的lvs1(LVS调度器)也就没有起到作用,并没有实现真正意义上的负载均衡,这也是DR模式的一个缺点。这就类似于DDOS攻击,有可能会导致后端服务器瘫痪,造成用户不能正常访问资源。
现在解决DR模式不轮询的问题:
在 web1,web2上,安装针对MAC地址的防火墙管理工具 yum install -y arptables
arptables:用户空间工具,用来 管理 linux内核中的ARP规则表. 这些规则用来检查ARP帧.arptables类似于iptables,但没有那么复杂.iptables工作于ip层,用于对ip包进行管理.arptables工作与arp协议层,用于对arp数据帧进行管理.arptables可以像iptables那样对arp数据帧进行各种规则设置,可以ACCEPT,DROP等
arptables -nL 可查看设置的访问规则
man arptable 可查看设置规则
设置规则:
[root@web2 ~]# yum install -y arptables
[root@web2 ~]# arptables -A INPUT -d 192.168.88.100 -j DROP
[root@web2 ~]# arptables -A OUTPUT -s 192.168.88.100 -j mangle --mangle-ip-s 192.168.88.20
[root@web2 ~]# arptables-save > /etc/sysconfig/arptables
[root@web2 ~]# systemctl restart arptables.service
[root@web2 ~]# cat /etc/sysconfig/arptables
*filter
:INPUT ACCEPT
:OUTPUT ACCEPT
:FORWARD ACCEPT
-A INPUT -j DROP -d 192.168.88.100
-A OUTPUT -j mangle -s 192.168.88.100 --mangle-ip-s 192.168.88.20
web1节点也做同样步骤
在真机上测试:curl 192.168.88.100 实现了轮询。
[root@ceph01 ~]# curl 192.168.88.100
test2
[root@ceph01 ~]# curl 192.168.88.100
test1
[root@ceph01 ~]# curl 192.168.88.100
test2
[root@ceph01 ~]# curl 192.168.88.100
test1
[root@ceph01 ~]# curl 192.168.88.100
test2
[root@ceph01 ~]# curl 192.168.88.100
test1
[root@ceph01 ~]# curl 192.168.88.100
test2
[root@ceph01 ~]# curl 192.168.88.100
test1
[root@ceph01 ~]# curl 192.168.88.100
test2
[root@ceph01 ~]# curl 192.168.88.100
test1