工作原理:
VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只是用于处理目标地址为VIP 的网络请求 VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只是用于处理目标地址为VIP 的网络请求。
1.selinux和iptables状态为disabled
2.Virtual IP:172.25.4.100
3.各主机信息如下:
主机名 | IP |
server1(调度器) | 172.25.83.1 |
server2(真实服务器) | 172.25.83.2 |
server3(真实服务器) | 172.25.83.3 |
1.扩展yum源——针对调度器(server1)
[root@server1 ~]# vim /etc/yum.repos.d/rhel-source.repo #在原来的yum源的基础上添加如下内容
[LoadBalancer] //负载均衡
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.83.83/rhel6.5/LoadBalancer
enabled=1
gpgcheck=0
[root@server1 ~]# yum clean all
[root@server1 ~]# yum repolist ##可以看到新的yum源的软件数有3694(负载均衡有4个包);如果不是,代表yum源的搭建有误。
2.安装ipvsadm软件——针对调度器(server1)
[root@server1 ~]# yum install ipvsadm -y
[root@server1 ~]# ipvsadm -l ##同ipvsadm -L命令
[root@server1 ~]# lsmod ##lsmod命令:是一个小程序,用来显示文件、proc/modules的信息,也就是显示当前内核模块装载的模块。可以看到ip_vs模块(值的注意的是:在执行lsmod命令之前必须先执行ipvsadm -l命令来清空ipvsadm策略。)
3.将调度器和真实服务器设置在同一个vlan
##server1
[root@server1 ~]# ip addr add 172.25.83.100/24 dev eth0 ##给调度器添加虚拟IP(即客户端访问的IP)
[root@server1 ~]# ip addr show
1: lo:mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0:mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:99:d9:5c brd ff:ff:ff:ff:ff:ff
inet 172.25.83.1/24 brd 172.25.83.255 scope global eth0
inet 172.25.83.100/24 scope global secondary eth0
inet6 fe80::5054:ff:fe99:d95c/64 scope link
valid_lft forever preferred_lft forever##server2
[root@server2 ~]# yum install httpd -y
[root@server2 ~]# /etc/init.d/httpd start
[root@server2 ~]# cd /var/www/html/
[root@server2 html]# vim index.html
www.xin.com -server2
[root@server2 html]# ip addr add 172.25.83.100/24 dev eth0
[root@server2 html]# ip addr show
1: lo:mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0:mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:d2:d6:73 brd ff:ff:ff:ff:ff:ff
inet 172.25.83.2/24 brd 172.25.83.255 scope global eth0
inet 172.25.83.100/24 scope global secondary eth0
inet6 fe80::5054:ff:fed2:d673/64 scope link
valid_lft forever preferred_lft forever##server3
[root@server3 ~]# yum install httpd -y
[root@server3 ~]# /etc/init.d/httpd start
[root@server3 ~]# cd /var/www/html/
[root@server3 html]# vim index.html
bbs.xin.com -server3
[root@server3 html]# ip addr add 172.25.83.100/24 dev eth0
[root@server3 html]# ip addr show
1: lo:mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0:mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:d2:d6:73 brd ff:ff:ff:ff:ff:ff
inet 172.25.83.2/24 brd 172.25.83.255 scope global eth0
inet 172.25.83.100/24 scope global secondary eth0
inet6 fe80::5054:ff:fed2:d673/64 scope link
valid_lft forever preferred_lft forever
4.添加ipvsadm策略——针对调度器(server1)
[root@server1 ~]# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@server1 ~]# ipvsadm -A -t 172.25.83.100:80 -s rr ##rr是;轮循算法;10种算法之一(利用ipvsadm --help查看)
[root@server1 ~]# ipvsadm -a -t 172.25.83.100:80 -r 172.25.83.2:80 -g
[root@server1 ~]# ipvsadm -a -t 172.25.83.100:80 -r 172.25.83.3:80 -g
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.83.100:http rr
-> server2:http Route 1 0 0
-> server3:http Route 1 0 0[root@server1 ~]# ipvsadm -ln ##nl表示不解析
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.83.100:80 rr
-> 172.25.83.2:80 Route 1 0 0
-> 172.25.83.3:80 Route 1 0 0[root@server1 ~]# /etc/init.d/ipvsadm save ##保存ipvsadm策略
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]此时我们可以看到ipvsadm的策略保存在/etc/sysconfig/ipvsadm文件中。
[root@server1 ~]# vim /etc/sysconfig/ipvsadm
1 -A -t 172.25.83.100:80 -s rr
2 -a -t 172.25.83.100:80 -r 172.25.83.2:80 -g -w 1 ##w表示权重
3 -a -t 172.25.83.100:80 -r 172.25.83.3:80 -g -w 1
5.在物理机(172.25.83.83)进行测试
在测试之前,先查看下server1,server2,server3虚拟机的MAC地址,以便后续的实验。
##server1
##server2
##server3
在物理机进行测试
[root@foundation83 ~]$ arp -d 172.25.83.100 ##ARP是地址解析协议;将IP地址映射为物理硬件(MAC)地址;
可以看到这里的100的IP地址指向的并不是指向调度器(即server1),而是server2(后端真实服务器);所以此时使用curl命令访问时看到的server2的内容。
我们用命令清除一下缓存:
重新curl 172.25.83.100,再次查看这个100的IP指向的主机为server3:
所以说,现在我们访问100这个IP时,并不能唯一指定调度器,且具有随即性;那么,现在不是我们想要的效果。所以说,此时我们要解决的问题是如何让100这个IP地址唯一地指向调度器(即server1)
抑制server2和server3的ARP:
##server2
[root@server2 html]# yum install arptables_jf -y
[root@server2 html]# arptables -L
Chain IN (policy ACCEPT)
target source-ip destination-ip source-hw destination-hw hlen op hrd proChain OUT (policy ACCEPT)
target source-ip destination-ip source-hw destination-hw hlen op hrd proChain FORWARD (policy ACCEPT)
target source-ip destination-ip source-hw destination-hw hlen op hrd pro
[root@server2 html]# arptables -A IN -d 172.25.83.100 -j DROP ##禁止100这个IP包发送进来
[root@server2 html]# arptables -A OUT -s 172.25.83.100 -j mangle --mangle-ip-s 172.25.83.2 ##允许server2de IP数据包发送给100这个IP
[root@server2 html]# /etc/init.d/arptables_jf save ##保存策略
Saving current rules to /etc/sysconfig/arptables: [ OK ]##server3同server2
[root@server3 html]# yum install arptables_jf -y
[root@server3 html]# arptables -L
Chain IN (policy ACCEPT)
target source-ip destination-ip source-hw destination-hw hlen op hrd proChain OUT (policy ACCEPT)
target source-ip destination-ip source-hw destination-hw hlen op hrd proChain FORWARD (policy ACCEPT)
target source-ip destination-ip source-hw destination-hw hlen op hrd pro
[root@server3 html]# arptables -A IN -d 172.25.83.100 -j DROP ##禁止100这个IP包发送进来
[root@server3 html]# arptables -A OUT -s 172.25.83.100 -j mangle --mangle-ip-s 172.25.83.3 ##允许server2de IP数据包发送给100这个IP
[root@server3 html]# /etc/init.d/arptables_jf save ##保存策略
Saving current rules to /etc/sysconfig/arptables: [ OK ]
物理机测试:
[root@foundation83 ~]# arp -d 172.25.83.100
[root@foundation83 ~]# arp -an | grep 100
? (172.25.83.100) aton br0
? (192.168.0.100) at 54:99:63:a9:70:66 [ether] on wlp3s0b1
[root@foundation83 ~]# curl 172.25.83.100 ##我们用curl命令获取100这个IP的内容
bbs.xin.com - server3
[root@foundation83 ~]# curl 172.25.83.100
www.xin.com -server2
[root@foundation83 ~]# arp -an | grep 100 ##现在这里的物理硬件地址唯一指向server1
? (172.25.83.100) at 52:54:00:99:d9:5c [ether] on br0