0、LVS-NAT
LVS-NAT内容请参考:LVS-NAT
一、DR、TUN介绍
Director Routing(直接路由)
director分配请求到不同的real server。real server 处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。负载均衡器仅处理一半的连接,避免了新的性能瓶颈,同样增加了系统的可伸缩性。Director Routing采用的是物理层(修改MAC地址)技术,因此,所以服务器都必须在同一个物理网段。
IP Tunneling(IP隧道)
director分配请求到不同的real server。real server 处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。IP Tunneling技术极大地提高了director的调度能力,同时也极大地提高了系统容纳的最大节点数,可以超过100个节点。real server可以在任何LAN或WAN上运行,也就意味着允许物理上的分布,这对灾难恢复有重要意义。服务器必须有正式的公网ip地址用于与客户机直接通信,并且所有服务器必须支持IP隧道协议。
DR与TUN区别:Director与IP Tunneling相比,没有IP封装的开销,但由于采用物理层(修改MAC地址)技术,所有服务器都必须在一个物理网段。LVS-DR示意图:可以看到,全部机子都在同一个网络,可直接与客户端通信。LVS-DR模式工作原理:MAC地址转换每台机子的ip与mac信息如下:
MAC地址转换过程:(1)客户端(ip:192.168.10.201)向目标vip发出请求, Director接收。此时IP包头部及数据帧头信息如下:
(2)Director根据负载均衡算法选择一台active的RS(假设是192.168.10.101),并将此RIP所在网卡的mac地址作为目标mac地址,发送到局域网里。此时IP包头部及数据帧头信息如下:
(3)real server(192.168.10.101)在局域网中收到这个帧,拆开后发现目标IP(VIP)与本地匹配,于是处理这个报文,随后重新封装报文,发送到局域网。此时IP包及数据帧头信息如下:
(4)如果client与LVS在同一网段,那么clinet(192.168.10.201)将收到这个回复报文。如果跨了网段,那么这个报文通过gateway/路由通过Internet返回给用户。
以上就是LVS-DR模式的原理。
二、LVS-DR实验
实验环境:VMware station 14pro准备3台机子,每台机子的信息如下:
Director:RHEL7.5、DIP:192.168.10.205(ens33)、VIP:192.168.10.88(ens33:1)
RS1:RHEL7.3、RIP:192.168.10.101(ens33)、VIP:192.168.10.88(lo:1)
RS2:RHEL7.3、RIP:192.168.10.102(ens33)、VIP:192.168.10.88(lo:1)
/etc/hosts文件:
192.168.10.205 node5
192.168.10.101 node1
192.168.10.102 node2
1、director配置
1.1 网络配置
director有两个ip,一个是DIP:192.168.10.205,另一个是VIP:192.168.10.88,通过网卡别名配置VIP。
[root@node5 ~]# ifconfig ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.10.205 netmask 255.255.255.0 broadcast 192.168.10.255 inet6 fe80::20c:29ff:fed0:a01b prefixlen 64 scopeid 0x20<link> ether 00:0c:29:d0:a0:1b txqueuelen 1000 (Ethernet) RX packets 263 bytes 25805 (25.2 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 175 bytes 19669 (19.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
DIP已经配置好,下面通过别名配置VIP:
[root@node5 ~]# ifconfig ens33:1 192.168.10.88
但是这样配置,重启后VIP会消失。所以通过配置文件配置,如下:通过修改配置文件,配置VIP:vip配置文件为:/etc/sysconfig/network-scripts/ifcfg-ens33:1
[root@node5 ~]# cd /etc/sysconfig/network-scripts/ [root@node5 network-scripts]# cp ifcfg-ens33 ifcfg-ens33:1 [root@node5 network-scripts]# vim ifcfg-ens33:1 TYPE=Ethernet BOOTPROTO=none NAME=ens33:1 DEVICE=ens33:1 ONBOOT=yes IPADDR=192.168.10.88 PREFIX=24 GATEWAY=192.168.10.2 DNS1=119.29.29.29 DNS2=182.254.116.116 HWADDR=00:0c:29:d0:a0:1b
dip配置文件为:/etc/sysconfig/network-scripts/ifcfg-ens33
[root@node5 network-scripts]# vim ifcfg-ens33 TYPE=Ethernet BOOTPROTO=none NAME=ens33 DEVICE=ens33 ONBOOT=yes IPADDR=192.168.10.205 PREFIX=24 GATEWAY=192.168.10.2 DNS1=119.29.29.29 DNS2=182.254.116.116 HWADDR=00:0c:29:d0:a0:1b
dip、vip两个配置文件,除了NAME、DEVICE、IPADDR不同外,其他配置相同。注意:两个配置文件的里面的mac设置(HWADDR)一定要一样。修改好配置文件之后,重启网络:
[root@node5 network-scripts]# systemctl restart network [root@node5 network-scripts]#
查看一下ip信息:
[root@node5 network-scripts]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:d0:a0:1b brd ff:ff:ff:ff:ff:ff inet 192.168.10.205/24 brd 192.168.10.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 192.168.10.88/24 brd 192.168.10.255 scope global secondary noprefixroute ens33:1 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fed0:a01b/64 scope link valid_lft forever preferred_lft forever [root@node5 network-scripts]#
OK,ip已经配置好。1.2 安装lvs管理工具,配置lvs规则。安装lvs管理工具ipvsadmin:
[root@node5 ~]# yum install ipvsadm -y
配置lvs规则:
[root@node5 ~]# ipvsadm -A -t 192.168.10.88:80 -s -rr Memory allocation problem [root@node5 ~]#
报错:Memory allocation problem
解决方法:
查看一下vmlloc使用情况:
[root@node5 ~]# cat /proc/meminfo | grep -i vmalloc VmallocTotal: 34359738367 kB VmallocUsed: 189532 kB VmallocChunk: 34359310332 kB [root@node5 ~]#
在/etc/default/grub文件的末尾添加如下一行:
GRUB_CMDLINE_LINUX="vmalloc=256MB"
[root@node5 ~]# vim /etc/default/grub GRUB_CMDLINE_LINUX="vmalloc=256MB"
保存退出,重启虚拟机。重新配置规则:
[root@node5 ~]# ipvsadm -A -t 192.168.10.88:80 -s rr [root@node5 ~]# ipvsadm -a -t 192.168.10.88:80 -r 192.168.10.101 -g [root@node5 ~]# ipvsadm -a -t 192.168.10.88:80 -r 192.168.10.102 -g
选项:
-A:添加虚拟服务
-t:tcp协议
-s:指定调度算法,rr表示round-robin轮询算法
-a:表示添加real server的地址
-t:tcp协议
-r:指定real server的ip地址
-g:表示DR查看规则是否添加成功:
[root@node5 ~]# 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.10.88:80 rr -> 192.168.10.101:80Route 1 0 0 -> 192.168.10.102:80Route 1 0 0 [root@node5 ~]#
OK规则添加成功。注:DR、TUN模式不需要开启路由转发。NAT则需要开启路由转发功能。
开启路由转发功能的方法:编辑/usr/lib/sysctl.d/50-default.conf文件,将“net.ipv4.ip_forward = 0”改为“net.ipv4.ip_forward = 1”即可。
最后,清空防火墙规则:
[root@node5 ~]# iptables -F
2、Real Server配置
2.1 RS1配置1、网络配置rip配置:修改配置文件
[root@node2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 NAME="ens33" DEVICE="ens33" ONBOOT=yes BOOTPROTO=static TYPE=Ethernet IPADDR=192.168.10.101 PREFIX=24 GATEWAY=192.168.10.2 DNS1=119.29.29.29 DNS2=182.254.116.116
保存退出,重启网络后,配置vip。Vip配置:使用回环接口
[root@node1 ~]# ifconfig lo:1 192.168.10.88 netmask 255.255.255.255
ip信息:
[root@node1 ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 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.10.88/32 scope global lo:1 valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:24:e7:db brd ff:ff:ff:ff:ff:ff inet 192.168.10.101/24 brd 192.168.10.255 scope global ens33 valid_lft forever preferred_lft forever [root@node1 ~]#
注意:因为vip的配置是临时配置的,重启网络会失效,所以不能重启网络。2、安装httpd
[root@node1 ~]# yum install httpd -y
3、创建测试页
[root@node1 ~]# vim /var/www/html/index.html ===== Real Server 1 ip:192.168.10.101 =====
4、启动httpd服务:
[root@node1 ~]# systemctl start httpd
5、清空防火墙:
[root@node1 ~]# iptables -F
6、关闭ARP转发为什么要关闭ARP转发呢?因为Director、Real Server都配置了相同的VIP(192.168.10.88),如果不关闭ARP转发,则ip冲突了。
[root@node2 ~]# echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore [root@node2 ~]# echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce
如要要永久生效,在/usr/lib/sysctl.d/50-default.conf配置文件中添加以下两行即可:
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2
[root@node2 ~]# vim /usr/lib/sysctl.d/50-default.conf net.ipv4.conf.ens33.arp_ignore = 1 net.ipv4.conf.ens33.arp_announce = 2 [root@node2 ~]# sysctl -p
参数解释:
arp_ignore为1:只回答目标ip地址是访问本网络接口(此处为ens33)的ARP查询请求。
也就是说,arp_ignore设为1,当别人的arp请求过来的时候,如果接收的网卡设备上面没有这个ip,就不做出相应。默认为0,只要这台机子上任何一个网卡设备上面有这个ip,就响应arp请求,并发送mac地址。
arp_announce(宣告)设为2:对查询目标使用最适当的本地地址。例如,如果在ens33接口上接收到了一个VIP的arp请求包,内核判断这个VIP地址是不是跟ens33接口上的IP一样。如果一样,则回复这个包;如果不一样,就丢弃不回应。
至此,RS1配置成功。2.2 RS2配置1、DIP、VIP的配置方法跟RS1一样。配置过程省略。配置结果如下:
[root@node2 ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 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.10.88/32 scope global lo:1 valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:f3:92:c7 brd ff:ff:ff:ff:ff:ff inet 192.168.10.102/24 brd 192.168.10.255 scope global ens33 valid_lft forever preferred_lft forever [root@node2 ~]#
2、安装httpd、创建测试页跟RS1方法一样。测试页内容:
[root@node2 ~]# vim /var/www/html/index.html ===== Real Server 2 ip:192.168.10.102 =====
3、最后启动httpd服务,并且情况防火墙规则即可。
4、关闭ARP转发。方法跟rs1的一样。这里不再演示。RS的vip配置也可以通过修改配置文件去设置。方法如下:
[root@node2 ~]# cd /etc/sysconfig/network-scripts/ [root@node2 network-scripts]# cp ifcfg-lo ifcfg-lo:1 [root@node2 network-scripts]# vim ifcfg-lo:1 DEVICE=lo:1 IPADDR=192.168.10.88 NETMASK=255.255.255.255 ONBOOT=yes NAME=loopback
这样的话就永久生效了。至此LVS-DR配置完成。
3、测试
测试不能在dirctor上测试。
本实验中,虚拟机的网络是NAT模式。并不是桥连。
物理机打开浏览器,输入:192.168.10.88,结果如下:OK,没问题。
三、LVS的几种调度算法
1、rr:Round Robin,轮询法
在服务器中无穷的循环中遍历
2、wrr:Weighted Round Robin,带权重的轮询法
基于集群节点可以处理多少来分配给每个节点一个重值。权重为2的服务器将收到权重为1的服务器的两倍的连接数。如果权重为0,则不会收到新的连接请求(但当前活动的已经建立的连接将不会丢失)。
3、lc:Least-Connection,最少连接法
当新的请求到达director时,director查看活动和非活动的连接数量,以确定把请求分发给哪个服务器。
director将集群节点目前的活动连接数量×256,再加上不活动的连接数量,就得到节点的开销量。最低开销量的节点胜出,被分发给新的入站请求。(如果开销一样,则第一个节点被选中)
4、wlc:Weighted Least Connection,带权重的最少连接法
先算出节点的开销值,然后除以分配给其的权重值,最小节点胜出,将入站请求分发给它。
5、lblc:Locality-Based Least-Connection,基于局部的最少连接法
基于局部的最小连接,当real server是缓存服务器时用得比较多
6、lblcr:Locality-Based Least-Connection with Replication,带复制的基于局部的最少连接法
带复制的基于局部的最小连接,当real server是缓存服务器时用得比较多
7、dh:Destination Hashing,目标散列法
8、sh:Source Hashing,源散列法
同一个ip的客户端总是分发给同一个real server。让客户端总是能访问到自己的会话信息,这种机制叫会话保持。
基于ip地址标识客户端的缺点:很多内网用户会伪装成公网ip,来访问服务器,不能人为的控制负载均衡。
比较高级的方法是基于客户端提供我们的session id来实现会话保持。
haproxy可以实现基于会话信息来判断保持会话。
如何保持会话一致
1、如果总是保持和一个RS会话,这台RS如果故障了,要确定另一个RS也有会话信息,所有的RS保持数据同步。
2、会话同步的方法:所有的RS把自己的会话信息保存到数据库中(memcacheed软件)
9、sed:Shortest Expected Delay,最短预期延迟法
在wlc方法上做了轻微改进,这些服务器使用tcp,而且当群节点处理每个请求时保持在活动状态。
计算方法:每个休群节点的开销值是通过将活动的连接数加1计算的,然后,开销值除以分配给每个节点的权重,以取得SED值,具有最低SED值的集群节点胜出。
10、nq:Never Queue,永不排序法
分配请求给空闲的服务器,没有空闲的就找响应最快的。
如果集群节点中没有活动的连接,不管每个集群节点SED计算值的结果,它始终被分配至服务的新入站请求。
HTTP的会话(session)信息:cookies:客户端自己保存缓存
session:服务器保存
四、测试LVS的其他调度算法
例如、wrr
[root@node5 ~]# ipvsadm -C [root@node5 ~]# ipvsadm -A -t 192.168.10.88:80 -s wrr [root@node5 ~]# ipvsadm -a -t 192.168.10.88:80 -r 192.168.10.101 -g -w 10 [root@node5 ~]# ipvsadm -a -t 192.168.10.88:80 -r 192.168.10.102 -g -w 20 [root@node5 ~]# 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.10.88:80 wrr -> 192.168.10.101:80Route 10 0 0 -> 192.168.10.102:80Route 20 0 0 [root@node5 ~]#
浏览器打开:192.168.10.88,不断刷新,查看lvs连接调度情况:
[root@node5 ~]# ipvsadm -L -n --stats IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP 192.168.10.88:80 86 5520 1139320 -> 192.168.10.101:80 29 1940444360 -> 192.168.10.102:80 57 3580694960 [root@node5 ~]#
结果显示,权重为20的连接数大约是权重为10的2倍。权重为0的情况:
[root@node5 ~]# ipvsadm -C [root@node5 ~]# ipvsadm -A -t 192.168.10.88:80 -s wrr [root@node5 ~]# ipvsadm -a -t 192.168.10.88:80 -r 192.168.10.101 -g -w 0 [root@node5 ~]# ipvsadm -a -t 192.168.10.88:80 -r 192.168.10.102 -g -w 20 [root@node5 ~]# ipvsadm -L -n --stats IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP 192.168.10.88:80 30 1940420580 -> 192.168.10.101:80 00000 -> 192.168.10.102:80 30 1940420580 [root@node5 ~]#
dr模式,进去(InPkts)的有数据,为啥出去的(OutPkts)没有数据。因为数据包出去时,直接交给了real server,而没有交给Director。
五、ab压力测试
参数:
-n:requests Number of requests to perform,在测试会话中所执行的请求总个数。默认时,仅执行一个请求
-c:concurrency Number of multiple requests to make,一次产生的请求个数。默认是,一次一个。
语法:ab -n 数字 -c 数字 http://连接
要求:同时处理1000个请求,一次要执行1000个并发请求。
找另外一台机子(192.168.10.204)做请求测试:
[root@localhost ~]# ab -n 1000 -c 1000 http://192.168.10.88/index.html This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 192.168.10.88 (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.10.88 Server Port:80 Document Path: /index.html Document Length:45 bytes Concurrency Level: 1000 Time taken for tests: 1.080 seconds Complete requests: 1000 Failed requests:0 Write errors: 0 Total transferred: 305000 bytes HTML transferred: 45000 bytes Requests per second:925.54 [#/sec] (mean) Time per request: 1080.453 [ms] (mean) Time per request: 1.080 [ms] (mean, across all concurrent requests) Transfer rate: 275.67 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect:1 80 204.1 361019 Processing: 6 191 212.7 74 694 Waiting:1 191 212.9 74 694 Total: 22 272 278.61041053 Percentage of the requests served within a certain time (ms) 50%104 66%346 75%372 80%386 90%713 95%765 98% 1044 99% 1047 100% 1053 (longest request) [root@localhost ~]#
测试结果部分参数解释:
Server Software:Apache/2.4.6 #被测试的httpd版本 Server Hostname:192.168.10.88 #服务器主机名 Server Port:80 #服务器端口 Document Path: /index.html #测试的页面文档 Document Length:45 bytes # 文档大小 Concurrency Level: 1000 #并发数 Time taken for tests: 1.080 seconds #整个测试的耗时 Complete requests: 1000 #完成的请求数量 Failed requests:0 #失败的请求数量 Write errors: 0 Total transferred: 305000 bytes #整个测试中总传输字节数 HTML transferred: 45000 bytes #整个场景中HTML内容传输量。 Requests per second:925.54 [#/sec] (mean) #每秒处理请求数,相当于服务器中的每秒事务数,后面的括号的mean表示这是一个平均值。 Time per request: 1080.453 [ms] (mean) #平均请求响应时间,mean表示这是一个平均值。 Time per request: 1.080 [ms] (mean, across all concurrent requests) #每个请求的时间,1.080[毫秒](意思是说,在所有的并发请求),每个请求实际运行时间的平均值。由于对于并发请求,cpu实际上并不是同时处理的,而是按照每个请求获得的时间片逐个轮转处理的,所以基本上第一个Time per request时间约等于第二个Time per request时间乘以并发请求数。 Transfer rate: 275.67 [Kbytes/sec] received #传输速率,平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题。 Connection Times (ms) #连接时间 min mean[+/-sd] median max Connect: 1 80 204.1 36 1019 Processing: 6 191 212.7 74 694 Waiting: 1 191 212.9 74 694 Total: 22 272 278.6 104 1053 Percentage of the requests served within a certain time (ms) #在一定的时间内提供服务的请求的百分比(毫秒) 50% 104 66% 346 75% 372 80% 386 90% 713 95% 765 98% 1044 99% 1047 100% 1053 (longest request) vs