LVS-DR集群
DR=Direct Routing(直接路由)
Director 分配请求到不同的 real server。real server 处理请求后直接回应给用户,这样 director 负载均衡器仅处理客户机与服务器的一半连接。负载均衡器仅处理一半的连接,避免了新的性能瓶颈,同样增加了系统的可伸缩性。Direct Routing 由于采用物理层(修改 MAC 地址)技术,因此所有服务器都必须在一个物理网段中。
director 分配请求到不同的 real server。real server 处理请求后直接回应给用户,这样 director 负载均衡器仅处理客户机于服务器的一半连接。IP Tunneling 技术极大地提高了 director 的调度处理能力,同时也极大地提高了系统能容纳的最大节点数,可以超过 100 个节点。real server 可以在任何 LAN 和WAN 上运行,这意味着允许地理上的分布,这在灾难恢复中有重要意义。服务器必须拥有正式的公网 IP地址用于与客户机直接通信,并且所有服务器必须支持 IP 隧道协议。
Direct Routing 和 IP Tunneling 区别
Direct Routing与IP Tunneling 相比,没有 IP 封装的开销,但由于采用物理层(修改 MAC 地址)技术,所有服务器都必须在一个物理网段。
LVS-DR工作原理拓扑
Lvs-dr的工作原理:Director收到请求,将请求转发给了我们的realserver,但是接下来的工作就是我们的realserver和我们的客户端进行通讯了,所以原理图如下
LVS-DR 工作流程
工作原理也就是:MAC 转换过程
实例场景设备清单: director 分发器,IP: 10.1.10.164, VIP : 10.1.10.166
Director | VIP | Real Server | Client/Gateway |
10.1.10.164 eth0 00:0C:29:65:4A:22 | 10.1.10.166 00:0C:29:65:4A:22 | 10.1.10.165 eth0 00:0C:29:64:F4:70 | 10.1.10.9 00:0C:29:25:1F:DD |
1:Client 基本信息 IP:10.1.10.9
向目标 vip 发出链接请求,Director 接收。此时 IP 包头及数据帧头信息如下:
Src mac | Dst mac | type | … | Source ip | Src port | Dst ip | Dst port | …… | CRC |
…… | …… | …… | … | 10.1.10.9 | 55014 | 10.1.10.166 | 80 | …… | …… |
Source MAC | Dst MAC |
00:0C:29:25:1F:DD | 00:0C:29:65:4A:22 |
2: Director 分发器根据负载均衡算法选择一台 active 的 realserver(假设是 192.168.57.122),将此RIP 所在网卡的 mac 地址作为目标 mac 地址,发送到局域网里。此时 IP 包头及数据帧头信息如下:
Src mac | Dst mac | type | … | Source ip | Src port | Dst ip | Dst port | …… | CRC |
…… | …… | …… | … | 10.1.10.9 | 55014 | 10.1.10.166 | 80 | …… | …… |
‘
Source MAC | Dst MAC |
00:0C:29:65:4A:22 | 00:0C:29:64:F4:70 |
整个过程不会修改IP报文的内容! [访问客户端无论多么复杂,我们可以认为客户端与LVS链接的时候属于同一网段的公网地址]
3: realserver(10.1.10.165)在局域网中收到这个帧,拆开后发现目标 IP(VIP)与本地匹配,于是处理这个报文。随后重新封装报文,发送到局域网。此时 IP 包头及数据帧头信息如下:
Src mac | Dst mac | type | … | Source ip | Src port | Dst ip | Dst port | …… | CRC |
…… | …… | …… | … | 10.1.10.166 | 80 | 10.1.10.9 | 55014 | …… | …… |
Source MAC | Dst MAC |
00:0C:29:64:F4:70 | 00:0C:29:25:1F:DD |
4: 如果 client 与 VS 同一网段,那么client(10.1.10.9)将收到这个回复报文。如果跨了网段,那么报文通过 gateway路由器经由 Internet 返回给用户。
归纳一下:1)接收client的请求,根据你设定的负载均衡算法选取一台realserver的ip;
2)以选取的这个ip对应的mac地址作为目标mac,然后重新将IP包封装成帧转发给这台RS;
3)在hash table中记录连接信息。
数据包、数据帧的大致流向是这样的:client --> VS --> RS --> client
总结:需要保证我们前段路由将我们所有目标地址为VIp的报文发往director
RS可以使用私有地址,可以使用公网地址,但是diector和前段路由统一网段,且RS和director必须在统一物理网段!
如果RS为私有地址,就必须保证RS可以通达外网,RS的网关必须指向出口路由
请求的报文经过director,响应报文不经过director
LVS-DR集群
环境
角色 | 主机名 | 网卡 | IP | 操作系统 |
Director | Strong-Tony01 | Eth0 | 10.1.10.164 | CentOS6.5 x86_64 |
Eth0:1 | 10.1.100.166 | |||
Real server1 | Strong-Tony02 | Eth0 | 10.1.100.165 | CentOS6.5 x86_64 |
Lo:1 | 10.1.10.166 | |||
Real server2 | Strong-Tony03 | Eth0 | 10.1.100.167 | CentOS6.5 x86_64 |
Lo:1 | 10.1.10.166 |
分发器IP地址配置
从拓扑图看出我们的eth0有连个IP地址,所以我们需要配置eht0和eth0:1两个IP
DIP===eth0===10.1.10.164 VIP===eth0:1===10.1.10.166
[root@Strong-tony01 ~]# cd /etc/sysconfig/network-scripts/
[root@Strong-tony01 network-scripts]# cp ifcfg-eth0 ifcfg-eth0:1
[root@Strong-tony01 network-scripts]# vi ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
UUID=39e0cb32-20b6-4ce7-8722-7659dcd2233d
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
HWADDR=00:0C:29:65:4A:22 #若配置文件有MAC,必须和eth0:1的MAC一样
IPADDR=10.1.10.164
PREFIX=24
GATEWAY=10.1.10.1
DNS1=114.114.114.114
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"
[root@Strong-tony01 network-scripts]# vi ifcfg-eth0:1
DEVICE=eth0:1 #修改网卡名称
TYPE=Ethernet
UUID=39e0cb32-20b6-4ce7-8722-7659dcd2233d
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
HWADDR=00:0C:29:65:4A:22 #MAC地址与eth0保持一致
IPADDR=10.1.10.166 #设置VIP IP地址
PREFIX=24
GATEWAY=10.1.10.1
DNS1=114.114.114.114
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0:1"
[root@Strong-tony01 network-scripts]# ifdown eth0
[root@Strong-tony01 network-scripts]# ifup eth0
[root@Strong-tony01 network-scripts]# ifconfig #查看是否有两个IP地址
eth0 Link encap:Ethernet HWaddr 00:0C:29:65:4A:22
inet addr:10.1.10.164 Bcast:10.1.10.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe65:4a22/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:810 errors:0 dropped:0 overruns:0 frame:0
TX packets:301 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:62315 (60.8 KiB) TX bytes:34793 (33.9 KiB)
eth0:1 Link encap:Ethernet HWaddr 00:0C:29:65:4A:22
inet addr:10.1.10.166 Bcast:10.1.10.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
两台RealServer的IP配置
[root@Strong-tony02 ~]# cd /etc/sysconfig/network-scripts/
[root@Strong-tony02 network-scripts]# cp ifcfg-lo ifcfg-lo:1
[root@Strong-tony02 network-scripts]# vi ifcfg-lo:1
DEVICE=lo:1 #修改网卡名称
IPADDR=10.1.10.166 #修改IP地址,VIP IP
NETMASK=255.255.255.255 #掩码4个255代表本台设备
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
ONBOOT=yes
NAME=loopback
[root@Strong-tony02 network-scripts]# ifdown lo
[root@Strong-tony02 network-scripts]# ifup lo
[root@Strong-tony02 network-scripts]# ifconfig #查看网卡配置信息
eth0 Link encap:Ethernet HWaddr 00:0C:29:64:F4:70
inet addr:10.1.10.165 Bcast:10.1.10.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe64:f470/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1279 errors:0 dropped:0 overruns:0 frame:0
TX packets:259 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:87957 (85.8 KiB) TX bytes:28559 (27.8 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
lo:1 Link encap:Local Loopback
inet addr:10.1.10.166 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
第二台RealServer配置
[root@Strong-tony03 ~]# cd /etc/sysconfig/network-scripts/
[root@Strong-tony03 network-scripts]# cp ifcfg-lo ifcfg-lo:1
[root@Strong-tony03 network-scripts]# vi ifcfg-lo:1
DEVICE=lo:1 #修改网卡名称
IPADDR=10.1.10.166 #修改IP地址,VIP IP
NETMASK=255.255.255.255 #掩码4个255代表本台设备
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
ONBOOT=yes
NAME=loopback
[root@Strong-tony03 network-scripts]# ifdown lo
[root@Strong-tony03 network-scripts]# ifup lo
[root@Strong-tony03 network-scripts]# ifconfig lo:1
lo:1 Link encap:Local Loopback
inet addr:10.1.10.166 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
分发器配置LVS-DR规则
[root@Strong-tony01 ~]# yum install -y ipvsadm
[root@Strong-tony01 ~]# ipvsadm -A -t 10.1.10.166:80 -s rr # 配置ipv规则
# -A,表示添加; -t,表示TCP的服务,后面书写格式为VIP:Port; -s设置调度算法
# rr表示轮询,round-robin
#-u: UDP协议的集群 ,-f: FWM: 防火墙标记
[root@Strong-tony01 ~]# ipvsadm -a -t 10.1.10.166:80 -r 10.1.10.165:80 –g #添加real server
#-g 表示--gatewaying,也就是DR模式LVS
# -a,表示添加real server的地址;
# -r表示realserver地址;
[root@Strong-tony01 ~]# ipvsadm -a -t 10.1.10.166:80 -r 10.1.10.167:80 –g
[root@Strong-tony01 ~]# ipvsadm –L #查看当前ipvsadm规则
# 配置及查看内核IPVS表和算法的工具类似于iptables
[root@Strong-tony01 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.10.166:80 rr
-> 10.1.10.165:80 Route 1 0 0
-> 10.1.10.167:80 Route 1 0 0
InActConn 指非活跃连接数, TCP ESTABLISH 状态以外的连接都称为不活跃连接。例如处于 SYN_RECV 状态的连接,处于 TIME_WAIT 状态的连接等
三个LVS 模式中,只有NAT模式需要开启 路由转发功能。 DR和TUN模式不需要开启。
[root@Strong-tony01 ~]# /etc/init.d/ipvsadm save #保存ipvsadm规则
#保存ipvsadm规则到/etc/init.d/ipvsadm
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
[root@Strong-tony01 ~]# chkconfig ipvsadm on #设置开机启动ipvsadm服务
[root@Strong-tony01 ~]# chkconfig --list ipvsadm
ipvsadm 0:off 1:off 2:on 3:on 4:on 5:on 6:off
测试数据站
[root@Strong-tony02 ~]# vi /etc/sysctl.conf
net.ipv4.conf.eth0.arp_ignore = 1 #追加下面四行内容
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
-----------------------------------------------------------------------------------
参数说明:
arp_ignore 为:1 只回答目标 IP 地址是访问本网络接口(eth0)的 ARP 查询请求。
自己的理解:
在设置参数的时候将 arp_ignore 设置为 1,意味着当别人的 arp 请求过来的时候,如果接收的网卡设备上面没有这个 ip,就不做出响应,默认是 0,只要这台机器上面任何一个网卡设备上面有这个 ip,就响应arp 请求,并发送 mac 地址。
arp_announce (宣告) 为 2
对查询目标使用最适当的本地地址。例如,如果在 eth0 接口上接受到了一个 VIP 的 arp 请求包。内核判断这个 VIP 地址是不是 eth0 接口上的 IP 一样。如果一样,则回复这个包。如果不一样,就丢弃不回应。或者使用命令:不过是临时生效
arp_announce:如何通告本地址,默认0,表示通过网络直连的接口地址
arp_ignore:如何接受arp请求,默认为0,如果你改为1,表示仅在请求的地址配置在请求的报文的接口进行响应
[root@Strong-tony02 ~]# sysctl -p #配置生效
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@Strong-tony02 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep GATEWAY
GATEWAY=10.1.10.1 #查看网关是否正确
[root@Strong-tony02 ~]# yum install -y httpd #安装httpd服务测试
[root@Strong-tony02 ~]#echo "<h1><em> This is Stong-tony02.cn </em></e1>" /var/www/html/index.html # 创建测试页面
[root@Strong-tony02 ~]# chkconfig httpd on # 设置开机自启动
[root@Strong-tony02 ~]# chkconfig --list httpd
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@Strong-tony02 ~]# service httpd start # 启动服务
Starting httpd: [ OK ]
[root@Strong-tony03 ~]# vi /etc/sysctl.conf
net.ipv4.conf.eth0.arp_ignore = 1 #追加这4行
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@Strong-tony03 ~]# sysctl -p #配置生效
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@Strong-tony03 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep GATEWAY
GATEWAY=10.1.10.1 #查看网关是否正确
[root@Strong-tony03 ~]# yum install -y httpd #安装httpd服务测试
[root@Strong-tony03 ~]#echo "<h1><em> This is Stong-tony03.cn </em></e1>" /var/www/html/index.html # 创建测试页面
[root@Strong-tony03 ~]# chkconfig httpd on # 设置开机自启动
[root@Strong-tony03 ~]# chkconfig --list httpd
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@Strong-tony03 ~]# service httpd start # 启动服务
Starting httpd: [ OK ]
注意,在前面我们重启网卡的时候,我们没有做ARP处理方案的时候,可能网卡是无法重启成功的,你也可以配置好VIP和Arp相关的处理方式之后,在重新启动,效果一样,只是一个启动顺序的问题而已!
测试集群运作
浏览器访问http://10.1.10.164,使用F5键刷新
按F5刷新,测试结果是会在两个页面之间切换
[root@Strong-tony01 ~]# ipvsadm -L -n –c # 查看客户端连接分发器和Real Server的情况
IPVS connection entries
pro expire state source virtual destination
TCP 00:33 FIN_WAIT 172.16.10.31:52623 10.1.10.166:80 10.1.10.167:80
TCP 00:48 FIN_WAIT 172.16.10.31:52632 10.1.10.166:80 10.1.10.165:80
TCP 01:26 FIN_WAIT 172.16.10.31:52645 10.1.10.166:80 10.1.10.167:80
TCP 00:13 FIN_WAIT 172.16.10.31:52620 10.1.10.166:80 10.1.10.165:80
TCP 01:27 FIN_WAIT 172.16.10.31:52648 10.1.10.166:80 10.1.10.165:80
TCP 00:38 FIN_WAIT 172.16.10.31:52631 10.1.10.166:80 10.1.10.167:80
TCP 01:26 FIN_WAIT 172.16.10.31:52646 10.1.10.166:80 10.1.10.165:80
TCP 01:26 FIN_WAIT 172.16.10.31:52642 10.1.10.166:80 10.1.10.167:80
TCP 01:24 FIN_WAIT 172.16.10.31:52639 10.1.10.166:80 10.1.10.165:80
TCP 01:27 FIN_WAIT 172.16.10.31:52647 10.1.10.166:80 10.1.10.167:80
TCP 01:26 FIN_WAIT 172.16.10.31:52643 10.1.10.166:80 10.1.10.165:80
TCP 00:33 FIN_WAIT 172.16.10.31:52624 10.1.10.166:80 10.1.10.165:80
TCP 00:14 FIN_WAIT 172.16.10.31:52621 10.1.10.166:80 10.1.10.167:80
TCP 01:25 FIN_WAIT 172.16.10.31:52640 10.1.10.166:80 10.1.10.167:80
TCP 01:24 FIN_WAIT 172.16.10.31:52638 10.1.10.166:80 10.1.10.167:80
TCP 01:25 FIN_WAIT 172.16.10.31:52641 10.1.10.166:80 10.1.10.165:80
TCP 00:15 FIN_WAIT 172.16.10.31:52622 10.1.10.166:80 10.1.10.165:80
[root@Strong-tony01 ~]# ipvsadm -Z # 清空当前虚拟服务表的计数器
[root@Strong-tony01 ~]# ipvsadm -L -n --stats #查看分发情况
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.1.10.166:80 36 184 0 22758 0
-> 10.1.10.165:80 18 92 0 11309 0
-> 10.1.10.167:80 18 92 0 11449 0
Conns (connections scheduled) 已经转发过的连接数
InPkts (incoming packets) 入包个数
OutPkts (outgoing packets) 出包个数
InBytes (incoming bytes) 入流量(字节)
OutBytes (outgoing bytes) 出流量(字节)
[root@Strong-tony01 ~]# ipvsadm -d -t 10.1.10.166:80 -r 10.1.100.165 # 删除一台RS
[root@Strong-tony01 ~]# ipvsadm -C # 清空规则
相关术语
director:分发器,负载调度器,也就是load balancer
real server:真正为用户提供服务器服务器IP
VIP:Virtual IP,真正对外提供服务的IP,也就是DNS解析的地址IP
DIP:Director IP,面对我们后端真实服务器的IP
RIP:Realserver IP
CIP:Client IP
ipvs:ip virtual server
LVS集中调度模式
-s rr 轮询法 -s wrr 带权重的轮询
-s lc 最少链接法 -s wlc 带权重的最少链接法
-s lblc 基于本地的最少链接法 -s dh 目标散列法
-s sh 散列法 -s sed 最短周期延迟法
-s nq 永不排队法 -s=scheduler=调度的意思
调度散发配置后立即生效,就像iptables规则一样
rr轮询 round robin
在服务器中无穷的循环中遍历
wrr带权重轮询 Weighted Round Robin
基于集群节点可以处理多少来分配给每个节点一个权重值。权重值为 2 的服务器将收到权重值为 1 的服务器的两倍的连接数量。如果服务器的权重为 0 ,则不会收到新的连接请求(但当前活动的已经建立的连接将不会丢失)。
lc最少链接法 Least-Connection
当新的请求到达 director 时,director 查看活动和非活动的连接数量,以确定把请求分发给哪个服务器。director 将集群节点目前的活动连接数量 x256 再加上不活动的连接数量,得到节点的开销值。最低开销值的节点胜出,被分发给新的入站请求。(如果开销一样,则第一个节点被选中)
wlc带权重的最少链接法 Weighted Least-Connection
先如上算出集群节点的开销值,然后除以分配给其的权重值,最小值节点胜出,将入站请求分发给它。
lblc基于本地的最少链接法 Locality-Based Least-Connection
基于局部的最小连接,当 real server 是缓存服务器时用得比较多
dh目标散列法 Destination Hashing
sh散列法 Source Hashing
同一个 ip 的客户端总是分发给同一个 real server。 让客户端总是能访问到自己的会话信息,这种机制叫会话保持。 基于 ip 地址标识客户端的缺点:很多内网用户会伪装成公网 ip,来访问服务器,不能人为的控制负载均衡。
比较高级的方法是基于客户端提供我们的 session id 来实现会话保持。haproxy(做负载均衡的软件)可以实现基于会话信息来判断保持会话。
如何保持会话一致:如果总是保持和一个 RS 会话,这台 RS 如果故障了,要确定另一个 RS 也有会话信息,所有的 RS保持数据同步。
会话同步的方法:所有的 RS 把自己的会话信息保存到数据库当中(memcached 软件)。
sed最短周期延迟法 Shortest Expected Delay 最短延时预测 (Ci+1)/Ui Ci 连接数 Ui 权重值
在 wlc 方法上做了轻微改进,这些服务使用 tcp,而且当群节点在处理每个请求时保持在活动状态。
计算方法: 每个休群节点的开销值是通过将活动的连接数加 1 计算的。然后开销值除以分配给每个节点的权重,以取得 SED 值,具有最低 SED 值的集群节点胜出。
nq永不排队法 Never Queue
没有队列,分配请求给空闲的服务器,没有空闲的就找响应最快的,如果集群节点中没有活动的连接 ,不管每个集群节点 SED 计算值的结果,它始终被 分配置服务的新入站请求。
HTTP 的会话(session)信息:
cookies 客户端(client)自己保存缓存
会话(session)服务器(server)端保存
LVS DR wrr调度算法
实现我们访问,轮询的时候在第一台real server上轮询两次之后,在第二台real server上轮询一次,2:1的比例承担我们的访问负载!
算法配置
[root@Strong-tony01 ~]# ipvsadm -C
[root@Strong-tony01 ~]# ipvsadm -A -t 10.1.10.166:80 -s wrr
[root@Strong-tony01 ~]# ipvsadm -a -t 10.1.10.166:80 -r 10.1.10.165:80 -g -w 20
[root@Strong-tony01 ~]# ipvsadm -a -t 10.1.10.166:80 -r 10.1.10.167:80 -g -w 10
[root@Strong-tony01 ~]# ipvsadm -L -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.1.10.166:80 0 0 0 0 0
-> 10.1.10.165:80 0 0 0 0 0
-> 10.1.10.167:80 0 0 0 0 0
测试:
物理机上刷新http://10.1.10.166
刷新的过程中我们发现,Strong-tony02.cn的页面我们看到两次之后才会变为Strong-tony01
[root@Strong-tony01 ~]# ipvsadm -L -n –stats #状况可以说明问题
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.1.10.166:80 45 225 0 31056 0
-> 10.1.10.165:80 30 150 0 20571 0
-> 10.1.10.167:80 15 75 0 10485 0
LVS DR wrr权重
实现我们访问,设置第一台real server轮询权重为0,第二台real server权重为20
[root@Strong-tony01 ~]# ipvsadm -C
[root@Strong-tony01 ~]# ipvsadm -A -t 10.1.10.166:80 -s wrr
[root@Strong-tony01 ~]# ipvsadm -a -t 10.1.10.166:80 -r 10.1.10.165 -g -w 0
[root@Strong-tony01 ~]# ipvsadm -a -t 10.1.10.166:80 -r 10.1.10.167 -g -w 20
测试机多次访问http://10.1.10.166查看结果
[root@Strong-tony01 ~]# ipvsadm -L -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.1.10.166:80 44 220 0 30664 0
-> 10.1.10.165:80 0 0 0 0 0
-> 10.1.10.167:80 44 220 0 30664 0
可以看到所有的链接都给了Strong-tony03这台real server,权重为0的Strong-tony这台real server不接收链接
此外:发现InPkts是有的,OutPkts为0, 因为数据包出去时,直接交给了 real server,而没有交给 Director!