环境:
OS | hostname | IP |
---|---|---|
centos7 | balancer | 192.168.100.10 VIP:192.168.100.11 |
centos7 | server1 | 192.168.100.20 |
centos7 | server2 | 192.168.100.30 |
通过直接路由实现虚拟服务器(VS/DR)
VS/DR的体系结构如图所示:调度器和服务器组都必须在物理上有一个网卡通过不分段的局域网相连,即通过交换机或者高速的HUB相连,中间没有隔有路由器。VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只是用于处理目标地址为VIP的网络请求。
VS/DR的工作流程如图所示:它将报文直接路由给目标服务器。在VS/DR中,调度器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装IP报文,而是将数据帧的MAC地址改为选出服务器的MAC地址,再将修改后的数据帧在与服务器组的局域网上发送。因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该IP报文。当服务器发现报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户。
在VS/DR中,请求报文的目标地址为VIP,响应报文的源地址也为VIP,所以响应报文不需要作任何修改,可以直接返回给客户,客户认为得到正常的服务,而不会知道是哪一台服务器处理的。
VS/DR负载调度器也只处于从客户到服务器的半连接中,按照半连接的TCP有限状态机进行状态迁移。
归纳:
1)接收client的请求,根据你设定的负载均衡算法选取一台realserver的ip;
2)以选取的这个ip对应的mac地址作为目标mac,然后重新将IP包封装成帧转发给这台RS;
3)在hash table中记录连接信息。
数据包、数据帧的大致流向是这样的:client --> VS --> RS --> client
balancer配置
[root@balancer network-scripts]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:1d:c7:7b brd ff:ff:ff:ff:ff:ff
inet 192.168.100.10/24 brd 192.168.100.255 scope global ens37
valid_lft forever preferred_lft forever
inet 192.168.100.11/24 brd 192.168.100.255 scope global secondary ens37:1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe1d:c77b/64 scope link tentative
valid_lft forever preferred_lft forever
[root@server1 ~]# yum -y install ipvsadm
[root@balancer ~]# ipvsadm -A -t 192.168.100.11:80 -s rr
-g表示DR模式
[root@balancer ~]# ipvsadm -a -t 192.168.100.11:80 -r 192.168.100.20 -g
[root@balancer ~]# ipvsadm -a -t 192.168.100.11:80 -r 192.168.100.30 -g
[root@balancer ~]# ipvsadm --set 1 1 1
[root@balancer ~]# 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.100.11:80 rr
-> 192.168.100.20:80 Route 1 0 0
-> 192.168.100.30:80 Route 1 0 0
保存一份
[root@balancer ~]# ipvsadm -S > /etc/sysconfig/ipvsadm
[root@balancer ~]# cat !$
cat /etc/sysconfig/ipvsadm
-A -t 192.168.100.11:http -s rr
-a -t 192.168.100.11:http -r 192.168.100.20:http -g -w 1
-a -t 192.168.100.11:http -r 192.168.100.30:http -g -w 1
realserver配置
[root@server1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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
valid_lft forever preferred_lft forever
inet 192.168.100.11/32 scope global lo:1
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:8b:47:85 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.20/24 brd 192.168.100.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe8b:4785/64 scope link
valid_lft forever preferred_lft forever
[root@server1 ~]# yum install httpd httpd-tools -y
[root@server1 ~]# echo "server1" > /var/www/html/index.html
关闭arp转发
arp_ignore = 1 表示只回答目标IP是访问本地网络对应接口的arp请求
arp_announce = 2 只宣告本机网卡直连网络所在的ip的arp广播
[root@server1 ~]# vim /etc/sysctl.conf
net.ipv4.conf.eno16777736.arp_ignore = 1
net.ipv4.conf.eno16777736.arp_announce = 2
[root@server1 ~]# sysctl -p
net.ipv4.conf.eno16777736.arp_ignore = 1
net.ipv4.conf.eno16777736.arp_announce = 2
[root@server1 ~]# systemctl restart httpd
[root@server2 ~]# ifconfig lo:1 192.168.100.11 netmask 255.255.255.255 up
[root@server2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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
valid_lft forever preferred_lft forever
inet 192.168.100.11/32 scope global lo:1
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:7c:18:13 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.30/24 brd 192.168.100.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe7c:1813/64 scope link
valid_lft forever preferred_lft forever
[root@server2 ~]# yum install httpd httpd-tools -y
[root@server2 ~]# echo "server2" > /var/www/html/index.html
[root@server2 ~]# vim /etc/sysctl.conf
net.ipv4.conf.eno16777736.arp_ignore = 1
net.ipv4.conf.eno16777736.arp_announce = 2
[root@server2 ~]# sysctl -p
net.ipv4.conf.eno16777736.arp_ignore = 1
net.ipv4.conf.eno16777736.arp_announce = 2
测试
通过访问http://VIP进行测试
[root@balancer ~]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.100.11:80 16 120 0 22895 0
-> 192.168.100.20:80 8 31 0 3275 0
-> 192.168.100.30:80 8 89 0 19620 0
LVS多种调度模式
-s rr | 轮循法 |
---|---|
-s wrr | 带权重的循环法 |
-s lc | 最少连接法 |
-s wlc | 带权重的最少连接法 |
-s lblc | 基于本地的最少连接法 |
-s dh | 目标散列法 |
-s sh | 源散列法 |
-s sed | 最短预期延迟法 |
-s nq | 永不排队法 |
1、rr - round robin
--- 在服务器池中无穷的循环中遍历
2、wrr - Weighted Round Robin
--- 基于集群节点可以处理多少来分配给每个节点一个权重值。权重值为2的服务器将收到权重值为1的服务器的两倍的连接数量。如果服务器的权重为0 ,则不会收到新的连接请求(但当前活动的已经建立的连接将不会丢失)。
3、lc - Least-Connection
--- 当新的请求到达director时,director查看活动和非活动的连接数量,以确定把请求分发给哪个服务器。
director将集群节点目前的活动连接数量x256 再加上不活动的连接数量,得到节点的开销值。最低开销值的节点胜出,被分发给新的入站请求。(如果开销一样,则第一个节点被选中)
4、wlc - Weighted Least-Connection
--- 先如上算出集群节点的开销值,然后除以分配给其的权重值,最小值节点胜出,将入站请求分发给它。
5、lblc - Locality-Based Least-Connection
--- 基于局部的最小连接,当real server是缓存服务器时用得比较多
6、lblcr - Locality-Based Least-Connection with Replication
--- 带复制的基于局部的最小连接,当real server是缓存服务器时用得比较多
7、sh - Source Hashing
--- 同一个ip的客户端总是分发给同一个real server。
让客户端总是能访问到自己的会话信息,这种机制叫会话保持。
基于ip地址标识客户端的缺点:很多内网用户会伪装成公网ip,来访问服务器,不能人为的控制负载均衡。