Lvs - DR模式
[TOC]
一:LVS-DR和LVS-IP TUN集群概述
1:Direct Routing(直接路由)
director分配请求到不同的real server。real server处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。负载均衡器仅处理一半的连接,避免了新的性能瓶颈,同样增加了系统的可伸缩性。Direct Routing由于采用物理层(修改MAC地址)技术,因此所有服务器都必须在一个网段中。
2:IP Tunneling(IP隧道)
director分配请求到不同的real server。real server处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。IP Tunneling技术极大地提高了director的调度处理能力,同时也极大地提高了系统能容纳的最大节点数,可以超过100个节点。real server可以在任何LAN或WAN上运行,这意味着允许地理上的分布,这在灾难恢复中有重要意义。服务器必须拥有正式的公网IP地址用于与客户机直接通信,并且所有服务器必须支持IP隧道协议。
3:Direct Routing 和IP Tunneling 区别
Direct Routing与IP Tunneling相比,没有IP封装的开销,但由于采用数据链路层(修改MAC地址)技术,所有服务器都必须在一个物理网段。
4:DR模式实际拓扑图及DR工作方式流程图
Lvs-dr的工作原理:Deiector收到请求,将请求转发给了我们的realserver,但是接下来的工作就是我们的realserver和我们的客户端进行通讯了,所以原理图如下(用户请求VIP,会由lvs服务器响应,分配至Rsalserver服务器,Realserver服务器处理我弄成之后直接返回给用户,不再通过lvs服务器。)
5:LVS DR模式工作原理
MAC转换过程
实例场景设备清单: director分发器IP:192.168.19.11、VIP:192.168.19.50
5.1:client基本信息: IP:192.168.19.10向目标vip发出请求,Director接收。此时IP包头及数据帧头信息如下
5.2:Director分发器根据负载均衡算法选择一台active的realserver(假设是192.168.19.200),将此RIP所在网卡的mac地址作为目标mac地址,发送到局域网里。此时IP包头及数据帧头信息如下:
5.3:realserver(192.168.19.200)在局域网中收到这个帧,拆开后发现目标IP(VIP)与本地匹配,于是处理这个报文。随后重新封装报文,发送到局域网。此时IP包头及数据帧头信息如下:
如果client与VS同一网段,那么client(192.168.19.10)将收到这个回复报文。如果跨了网段,那么报文通过gateway/路由器经由Internet返回给用户。
总结:
1)接收client的请求,根据你设定的负载均衡算法选取一台realserver的ip;
2)以选取的这个ip对应的mac地址作为目标mac,然后重新将IP包封装成帧转发给这台RS;
3)在hash table中记录连接信息。
数据包、数据帧大致流向:client ---> VS ---> RS ---> client
6:网络转发:
基于2层的数据报文的转发,要比基于3层的网络转发效率要高
lvs-DR 是基于2层的转发,所以在LVS中所有的模式,效率是最好的
为什么DR模式是最好的?
1):基于mac的数据报文转发,是效率最好的,但是是根据交换机的MAC地址表来实现的
加入了一个vip的概念是为了让Realserver封装数据包的时候能够欺骗路由器,路由器一看这个数据包的源地址是我刚发给lvs的。但是假如这个vip之后发现又会冲突,所以解决RS在接收到vip相干的arp广播时闭嘴。这个闭嘴就是调整内核参数。
接收arp广播的时候闭嘴还需要Realserver在向外发送arp广播的时候不能用192.168.19.50声明自己,同样Realserver在根其他服务器通信时,假设不知道路由器的信息或者不知道其他主机的信息也需要发送arp广播,他发arp广播的话说:我时192.168.19.50这是我的MAC地址,只要有一个这个说的其他服务器全部知道干什么了。
2):2层设备不具有路由功能,那么广播也就不具有跨路由的功能,所有要实现mac地址广播,必须在同一物理网段。
3):vlan具有隔离广播的功能,所有要能处理mac地址广播,就应该在同一个VLAN中。
因此: 如果要实现LVS-DR模式一下两点需求必须满足。
1): 所有的设备应该在同一个物理网段
2): 所有的设备都应该在同一个广播域中
二:实战:配置LVS-DR集群
1:lvs:两个ip地址DIP和VIP。直接cp一个。
Mac地址必需要写成和ens33一样,否则出不来ens33:1这个网卡设备;要不就干脆不加。
[root@director ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO=static
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.19.11
NETMASK=255.255.255.0
[root@director ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33:1 #vip
BOOTPROTO=static
DEVICE=ens33:1
ONBOOT=yes
IPADDR=192.168.19.50
NETMASK=255.255.255.0
重启网卡之后mac地址必须一样
2:安装ipvsadm和添加规则
[root@director ~]# ipvsadm -A -t 192.168.19.50:80 -s rr
[root@director ~]# ipvsadm -a -t 192.168.19.50:80 -r 192.168.19.200 -g
[root@director ~]# ipvsadm -a -t 192.168.19.50:80 -r 192.168.19.220 -g
[root@director ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.19.50:80 rr
-> 192.168.19.200:80 Route 1 0 0
-> 192.168.19.220:80 Route 1 0 0
注:-g 表示DR模式 ,-m 表示IP tun 模式
注:三个LVS 模式中,只有NAT模式需要开启 路由转发功能。 DR和TUN模式不需要开启
3:保存
[root@director ~]# ipvsadm -S > /etc/sysconfig/ipvsadm
[root@director ~]# cat !$
cat /etc/sysconfig/ipvsadm
-A -t director:http -s rr
-a -t director:http -r 192.168.19.200:http -g -w 1
-a -t director:http -r 192.168.19.220:http -g -w 1
4:关闭ARP转发(在两台realserver上都需要同样的操作)
同一个广播域配置多个vip是不允许的。如果想要配置就需要关闭arp广播。
因此 在Linux里面, 可以修改内核参数, 实现接口IP的广播不响应、不广播
arp_ignore = 1 表示只回答目标IP是访问本地网络对应接口的arp请求
arp_announce = 2 只宣告本机网卡直连网络所在的ip的arp广播
[root@realserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore
[root@realserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce
接受arp广播的时候问RS的时候,自己闭嘴问问你你在做响应。
告诉RS你在发送arp广播的时候使用那个ip地址去声明自己都行,但是就不能使用虚ip。
永久生效:(注意realserver的实际link ok的网卡是不是ens33)
[root@realserver1、2 ~]# vim /etc/sysctl.conf #最后添加
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2
或:
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@realserver1、2 ~]# sysctl -p
参数说明:
arp_ignore 为:1 # - 只回答目标IP地址是访问本网络接口(ens33)的ARP查询请求。
在设置参数的时候将arp_ignore 设置为1,意味着当别人的arp请求过来的时候,如果接收的网卡设备上面没有这个ip,就不做出响应,默认是0,只要这台机器上面任何一个网卡设备上面有这个ip,就响应arp请求,并发送mac地址。
arp_announce (宣告) 为2
2 - 对查询目标使用最适当的本地地址。例如,如果在ens33接口上接受到了一个VIP的arp请求包。内核判断这个VIP地址是不是ens33接口上的IP一样。如果一样,则回复这个包。如果不一样,就丢弃不回应。
5:两台RealServer的IP配置
realserver1:
[root@realserver1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO=static
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.19.200
NETMASK=255.255.255.0
回环接口必须要绑定这个vip,否则从lvs过来的请求不知道找谁。
[root@realserver1 ~]# ifconfig lo:1 192.168.19.50 netmask 255.255.255.255
realserver2:
[root@realserver1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO=static
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.19.220
NETMASK=255.255.255.0
回环接口必须要绑定这个vip,否则从lvs过来的请求不知道找谁。
[root@realserver1 ~]# ifconfig lo:1 192.168.19.50 netmask 255.255.255.255
6:启动80端口
[root@realserver1 ~]# yum install -y httpd
[root@realserver1 ~]# echo "192.168.20.200" > /var/www/html/index.html
[root@realserver1 ~]# systemctl restart httpd
[root@realserver2 ~]# yum install -y httpd
[root@realserver2 ~]# echo "192.168.20.220" > /var/www/html/index.html
[root@realserver2 ~]# systemctl restart httpd
7:客户端测试访问
[root@client ~]# elinks 192.168.19.50 --dump
192.168.20.200
[root@client ~]# elinks 192.168.19.50 --dump
192.168.20.220
[root@client ~]# elinks 192.168.19.50 --dump
192.168.20.200
[root@client ~]# elinks 192.168.19.50 --dump
192.168.20.220
[root@client ~]# elinks 192.168.19.50 --dump
8:分发器查看
[root@director ~]# 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.19.50:80 10 60 0 4670 0
-> 192.168.19.200:80 5 30 0 2335 0
-> 192.168.19.220:80 5 30 0 2335 0
这里的OutPkts和OutBytes数据都是0。是0就对了。否则就不是DR模式了。因为返回数据包的时候不经过lvs了,所以这里是0。
三:其他用法
lvs:wrr
[root@director ~]# ipvsadm -A -t 192.168.19.50:80 -s wrr
[root@director ~]# ipvsadm -a -t 192.168.19.50:80 -r 192.168.19.200 -g -w 10
[root@director ~]# ipvsadm -a -t 192.168.19.50:80 -r 192.168.19.220 -g -w 20
客户端访问
[root@client ~]# elinks 192.168.19.50 --dump
192.168.20.220
[root@client ~]# elinks 192.168.19.50 --dump
192.168.20.200
[root@client ~]# elinks 192.168.19.50 --dump
192.168.20.220
[root@client ~]# elinks 192.168.19.50 --dump
192.168.20.220
[root@client ~]# elinks 192.168.19.50 --dump
192.168.20.200
[root@client ~]# elinks 192.168.19.50 --dump
192.168.20.220
[root@client ~]# elinks 192.168.19.50 --dump
192.168.20.220
[root@client ~]# elinks 192.168.19.50 --dump
192.168.20.200
[root@client ~]# elinks 192.168.19.50 --dump
192.168.20.220
查看
[root@director ~]# 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.19.50:80 8 48 0 3736 0
-> 192.168.19.200:80 3 18 0 1401 0
-> 192.168.19.220:80 5 30 0 2335 0
[root@director ~]# 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.19.50:80 9 54 0 4203 0
-> 192.168.19.200:80 3 18 0 1401 0
-> 192.168.19.220:80 6 36 0 2802 0
[root@director ~]# 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.19.50:80 wrr
-> 192.168.19.200:80 Route 10 0 0
-> 192.168.19.220:80 Route 20 0 0
[root@director ~]#
[root@director ~]#
[root@director ~]# ipvsadm -d -t 192.168.19.50:80 -r 192.168.19.220 --->删除
[root@director ~]# 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.19.50:80 wrr
-> 192.168.19.200:80 Route 10 0 0
[root@director ~]# ipvsadm -e -t 192.168.19.50:80 -r 192.168.19.200 -g -w 30 --->修改
[root@director ~]# 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.19.50:80 wrr
-> 192.168.19.200:80 Route 30 0 0
四:ab网站压力测试命令
同时处理1000个请求。 一次要执行1000个并发请求。
在client:测试VIP:
[root@client ~]# ab -n 1000 -c 1000 http://192.168.19.50/index.html
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.19.50 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software: Apache/2.4.6
Server Hostname: 192.168.19.50
Server Port: 80
Document Path: /index.html
Document Length: 15 bytes #测试页面文档的大小,也就是index.html
Concurrency Level: 1000 #并发数1000
Time taken for tests: 0.948 seconds #整个测试花费的时间不到1秒钟
Complete requests: 1000 #完成了多少个请求数量(Document Length乘以1000)
Failed requests: 0 #失败请求数量
Write errors: 0 #写入错误数量
Total transferred: 274000 bytes #整个测试过程中总传输的字节数
HTML transferred: 15000 bytes #整个测试过程中html传输量
Requests per second: 1055.24 [#/sec] (mean) #平均每秒能处理请求数1055.24
Time per request: 947.656 [ms] (mean) #平均请求响应时间
Time per request: 0.948 [ms] (mean, across all concurrent requests) #每个请求的时间。毫秒
Transfer rate: 282.36 [Kbytes/sec] received #传输速率
Connection Times (ms) #连接时间,单位毫秒
min mean[+/-sd] median max
Connect: 0 19 23.3 1 62
Processing: 9 199 274.3 55 880
Waiting: 1 199 274.4 54 880
Total: 41 218 290.3 57 932
Percentage of the requests served within a certain time (ms) #在一定时间内服务提供的请求百分比
50% 57 #百分之50的请求小于57毫秒。以此类推。
66% 68
75% 317
80% 506
90% 886
95% 906
98% 928
99% 930
100% 932 (longest request)
查看大小15个字节
[root@realserver1 ~]# ll /var/www/html/index.html
-rw-r--r-- 1 root root 15 Dec 26 20:32 /var/www/html/index.html
ab命令在一般系统上面做测试时候,一般并发不能超过1024个,其实是因为因为系统限制每个进程打开的最大文件数为1024,可以用ulimit -a来查看
可以测试一下后面两台realserver机器的负载情况。
[root@director ~]# watch -n 0.1 ipvsadm -L -n --stats