DR模式的概述与工作原理
DR模式服务概述:
Direct Routing(直接路由) --在同一个地域,同一个网段
Director分配请求到不同的real server。real server处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。负载均衡器仅处理一半的连接,避免了新的性能瓶颈,同样增加了系统的可伸缩性。Direct Routing由与采用物理层(修改MAC地址)技术,因此所有服务器都必须在一个网段中。
LVS DR 模式工作原理: 修改MAC地址
DR模式将报文直接路由给目标真实服务器。在DR模式中,调度器根据各个真实服务器的负载情况,连接数多少等,动态地选择一台服务器,不修改目标IP地址和目标端口,也不封装IP报文,而是将请求报文的数据帧的目标MAC地址改为真实服务器的MAC地址。然后再将修改的数据帧在服务器组的局域网上发送。因为数据帧的MAC地址是真实服务器的MAC地址,并且又在同一个局域网。那么根据局域网的通讯原理,真实复位是一定能够收到由LB发出的数据包。真实服务器接收到请求数据包的时候,解开IP包头查看到的目标IP是VIP。(此时只有自己的IP符合目标IP才会接收进来,所以我们需要在本地的回环借口上面配置VIP。另:由于网络接口都会进行ARP广播响应,但集群的其他机器都有这个VIP的lo接口,都响应就会冲突。所以我们需要把真实服务器的lo接口的ARP响应关闭掉。)然后真实服务器做成请求响应,之后根据自己的路由信息将这个响应数据包发送回给客户,并且源IP地址还是VIP。
DR模式实际拓扑图及LVS+DR方式的工作流程图: MAC转换过程
实例场景设备清单: director分发器,DIP: 192.1681.70,
VIP :192.168.1.63
① client发送的请求基本信息: IP:192.168.1.101 向目标vip发出请求,Director接收。此时IP包头及数据帧头信息如下:
② Director分发器根据负载均衡算法选择一台active的realserver(假设是192.168.1.62),将此RIP所在网卡的mac地址作为目标mac地址,发送到局域网里。此时IP包头及数据帧头信息如下:
③ realserver(192.168.1.62)在局域网中收到这个帧,脱掉数据帧后发现目标IP(VIP)与本地匹配,于是处理这个报文。随后重新封装报文,发送到局域网。此时回复请求的IP包头及数据帧头信息如下:
④如果client与VS同一网段,那么client(192.168.57.135)将收到这个回复报文。如果跨了网段,那么报文通过gateway/路由器经由Internet返回给用户。
DR模式小结:
1、通过在调度器LB上修改数据包的目的MAC地址实现转发。注意源地址仍然是CIP,目的地址仍然是VIP地址。
2、请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此并发访问量大时使用效率很高(和NAT模式比)
3、因为DR模式是通过MAC地址改写机制实现转发,因此所有RS节点和调度器LB只能在一个局域网里面
4、RS主机需要绑定VIP地址在LO接口上,并且需要配置ARP抑制。
5、RS节点的默认网关不需要配置成LB,而是直接配置为上级路由的网关,能让RS直接出网就可以。
6、由于DR模式的调度器仅做MAC地址的改写,所以调度器LB就不能改写目标端口,那么RS服务器就得使用和VIP相同的端口提供服务。
一:实验目标
1:正确理解DR的工作原理
2:使用LVS+DR搭建集群实现负载均衡
3:理解LVS的几种调度模式以及调度参数
4:了解ipvsadm命令参数
5:用ab命令测试网站压力
6:实战: 同时处理1000个请求。 一次要执行1000个并发请求。
二:实验拓扑
三:实验环境
1:准备3台
分发器:xuegod63 VIP:eth0:1:192.168.1.63
DIP:eth0:192.168.1.70
Real server xuegod62: RIP:eth0: 192.168.1.62
VIP:lo:1 192.168.1.63
Real server xuegod64: RIP:eth0: 192.168.1.64
VIP:lo:1 192.168.1.63 2:iptables -F , 清除规则
3:selinux关闭
4:red had 6.5版本 64位操作系统
四:实验代码
分发器-xuegod63
1:配置DIP和RIP地址
DIP :[root@xuegod63 ~]# ifconfig eth0 192.168.1.70
VIP :[root@xuegod63 ~]# ifconfig eth0:1 192.168.1.63
[root@xuegod63 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 #以配置以下信息
IPADDR=192.168.1.70
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=202.106.46.151
2:生成eth0:1配置文件
[root@xuegod63 network-scripts]# cp ifcfg-eth0 ifcfg-eth0:1
[root@xuegod63 network-scripts]# vim ifcfg-eth0\:1 #写入以下内容
DEVICE=eth0:1
NM_CONTROLLED=yes
IPADDR=192.168.1.63
NETMASK=255.255.255.0
ONBOOT=yes
TYPE=Ethernet
PREFIX=24
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
NAME="eth0:1"
HWADDR=00:0C:29:12:EC:1E #Mac地址必需要写成和eth0一样,否则出不来eth0:1这个网卡设备
[root@xuegod63 network-scripts]#service network restart
[root@xuegod63 network-scripts]# ifconfig #查看是否有eth0 和eth0:1
inet addr:192.168.1.63 Bcast:192.168.1.255 Mask:255.255.255.0
inet addr:192.168.1.63 Bcast:192.168.1.255 Mask:255.255.255.0
3:配置LVS-DR规则:
[root@xuegod63 network-scripts]# rpm -ivh /mnt/Packages/ipvsadm-1.25-9.el6.x86_64.rpm
[root@xuegod63 ~]# ipvsadm -A -t 192.168.1.63:80 -s rr
[root@xuegod63 ~]# ipvsadm -a -t 192.168.1.63:80 -r 192.168.1.62 -g
[root@xuegod63 ~]# ipvsadm -a -t 192.168.1.63:80 -r 192.168.1.64 -g
注: -g 表示DR模式 , -m 表示IP tun 模式
[root@xuegod63 ~]# 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.1.63:80 rr
-> 192.168.2.62:80 Route 1 0 0
-> 192.168.2.64:80 Route 1 0 0
注:三个LVS 模式中,只有NAT模式需要开启路由转发功能。 DR和TUN模式不需要开启。
4:LVS的规则配置文件:/etc/sysconfig/ipvsadm
找到配置文件方法: 因为:/etc/init.d/ipvsadm save 可以保存。所以配置文件一定可以在/etc/init.d/ipvsadm 中找到相关保存路径。
[root@xuegod63 ~]# vim /etc/init.d/ipvsadm
[root@xuegod63 ~]# /etc/init.d/ipvsadm save
[root@xuegod63 ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.1.63:80 -s wrr
-a -t 192.168.1.63:80 -r 192.168.1.62:80 -g
-a -t 192.168.1.63:80 -r 192.168.1.64:80 -g
RealServer:xuegod62:
1, 配置RIP eth0 ,桥接模式
[root@xuegod62 ~]# ifconfig eth0 192.168.1.62/24
2, 回环接口 -vip
[root@xuegod62 ~]# ifconfig lo:1 192.168.1.63 netmask 255.255.255.255
[root@xuegod62 network-scripts]# cp ifcfg-lo ifcfg-lo:1
[root@xuegod62 network-scripts]# cat ifcfg-lo:1
DEVICE=lo:1
IPADDR=192.168.1.63
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback
[root@xuegod62 ~]# service network restart
3, 关闭ARP转发功能。
[root@xuegod62 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@xuegod62 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
[root@xuegod62 ~]# vim /etc/sysctl.conf #最后添加
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
[root@xuegod62 ~]# sysctl -p #永久生效:(注意realserver的实际link ok的网卡是不是eth0)
参数说明: |
|
参数 |
作用 |
arp_announce为:2 |
对查询目标使用最适当的本地地址。例如,如果在eth0接口上接收到了一个VIP的arp请求包。内核判断这个VIP地址是不是eth0接口上的IP一样。如果一样,则回复这个包。如果不一样,就丢弃不回应。 |
arp_ignore 为:1 |
只回答目标IP地址是访问本网络接口(eth0)的ARP查询请求。 自己的理解: 在设置参数的时候将arp_ignore设置为1,意味着当别人的arp请求过来的时候,如果接收的网卡设备的arp缓存表中没有这个ip,就不做出响应,默认是0,只要这台机器上面任何一个网卡设备上面有这个ip,就响应arp请求,并发送mac地址。 |
4, 网关指向公网出口路由器IP:
[root@xuegod62 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
GATEWAY=192.168.1.1
5, 启动80端口
[root@xuegod62 ~]# echo 192.168.1.62 > /var/www/html/index.html
[root@xuegod62 ~]# service httpd restart
RealServer:xuegod64:
1, 配置ip eth0 ,桥接模式
[root@xuegod64 ~]#ifconfig eth0 192.168.1.64/24
2, 回环接口
[root@xuegod64 ~]# ifconfig lo:1 192.168.1.63 netmask 255.255.255.255
[root@xuegod64 network-scripts]# cp ifcfg-lo ifcfg-lo:1
[root@xuegod64 network-scripts]# cat ifcfg-lo:1
DEVICE=lo:1
IPADDR=192.168.1.63
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback
3, 关闭ARP转发。
[root@xuegod64 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@xuegod64 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
永久生效:(注意realserver的实际link ok的网卡是不是eth0)
[root@xuegod64 ~]# vim /etc/sysctl.conf #最后添加
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
[root@xuegod64 ~]# sysctl -p
4, 网关指向公网出口路由器IP:
[root@xuegod64 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
GATEWAY=192.168.1.1
5, 启动80端口
[root@xuegod64 ~]#echo 192.168.1.64 > /var/www/html/index.html
[root@xuegod64 ~]#service httpd restart
测试
物理机上测试:
http://192.168.1.63/
注: 测试时,不要在分发器上测试。那样测试是不行的
////////////////////////////////////////////////////////////////////////////////////////////////////////
LVS的几种调度模式:
[root@xuegod63 ~]# ipvsadm -h
参数 |
调度算法 |
-s rr |
轮循法 (默认算法) |
-s wrr |
带权重的循环法 |
-s lc |
最少连接法 |
-s wlc |
带权重的最少连接法 |
-s lblc |
基于本地的最少连接法 |
-s dh |
目标散列法 |
-s sh |
源散列法 |
-s sed |
最短预期延迟法 |
-s nq |
永不排队法 |
每个调度算法详细说明 |
||
数目 |
参数 |
作用 |
1: |
轮循调度(Round Robin)(简称rr) |
调度器通过“轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。 |
2: |
加权轮叫(Weighted Round Robin)(简称wrr) |
调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器能处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。 |
3: |
最少链接(Least Connections)(LC) |
调度器通过“最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。 |
4: |
加权最少链接(Weighted Least Connections)(WLC) |
在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值. |
5: |
基于局部性的最少链接(Locality-Based Least Connections)(LBLC |
“基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接” 的原则选出一个可用的服务器,将请求发送到该服务器 |
6: |
带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)(LBLCR) |
“带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标 IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。 |
7: |
目标地址散列(Destination Hashing)(DH) |
“目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。 |
8: |
源地址散列(Source Hashing)(SH) |
“源地址散列”调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。 |
9: |
最短的期望的延迟(Shortest Expected Delay Scheduling SED)(SED) |
基于wlc算法。这个必须举例来说了 |
10: |
最少队列调度(Never Queue Scheduling NQ)(NQ) |
无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要在进行sed运算 |
注:调度算法配置后立即生效,就像iptables配置规则一样。 |
测试不同的调度算法
例1:测试LVS的LVS-DR wrr-带权重的循环法
[root@xuegod63 ~]# ipvsadm -C #清空之前的调度算法
[root@xuegod63 ~]# ipvsadm -A -t 192.168.1.63:80 -s wrr
[root@xuegod63 ~]# ipvsadm -a -t 192.168.1.63:80 -r 192.168.1.62 -g -w 10
[root@xuegod63 ~]# ipvsadm -a -t 192.168.1.63:80 -r 192.168.1.64 -g -w 20
测试: 在物理机上,刷新9次这个链接:http://192.168.1.63/
# 一共9次连接, xuegod62:xuegod64 是 1:2 关系。 说明权重越大,获得的连接说越多。
例2:如果一个real server 的权重是0,将不再分配给他客户端的请求
[root@xuegod63 ~]# ipvsadm -C
[root@xuegod63 ~]# ipvsadm -A -t 192.168.1.63:80 -s wrr
[root@xuegod63 ~]# ipvsadm -a -t 192.168.1.63:80 -r 192.168.1.62 -g -w 0
[root@xuegod63 ~]# ipvsadm -a -t 192.168.1.63:80 -r 192.168.1.64 -g -w 20
在物理机上,刷新9次这个链接:http://192.168.1.63/
查看:
#发现进来的包是有的,但是出去的包为0 .有 0 是因为数据包出去时,直接交给了real server,而没有交给Director
ipvsadm 更多参数说明 |
|
参数 |
说明 |
-A –add-service |
在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也 |
-E –edit-service |
编辑内核虚拟服务器表中的一条虚拟服务器记录。 |
-D –delete-service |
删除内核虚拟服务器表中的一条虚拟服务器记录。 |
-C –clear |
清除内核虚拟服务器表中的所有记录。 |
-R –restore |
恢复虚拟服务器规则 |
-S –save |
保存虚拟服务器规则,输出为-R 选项可读的格式 |
-a –add-server |
在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器 |
-e –edit-server |
编辑一条虚拟服务器记录中的某条真实服务器记录 |
-d –delete-server |
删除一条虚拟服务器记录中的某条真实服务器记录 |
-L|-l –list |
显示内核虚拟服务器表 |
-Z –zero |
虚拟服务表计数器清零(清空当前的连接数量等) |
–set tcp tcpfin udp |
设置连接超时值 |
–start-daemon |
启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的VRRP 功能。 |
–stop-daemon |
停止同步守护进程 |
-h –help |
显示帮助信息 |
-t –tcp-service service-address |
说明虚拟服务器提供的是tcp 的服务 |
-u –udp-service service-address |
说明虚拟服务器提供的是udp 的服务 |
-f –fwmark-service fwmark |
说明是经过iptables 标记过的服务类型。 |
-s –scheduler scheduler |
使用的调度算法,有这样几个选项 rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq, 默认的调度算法是: wlc. |
-p –persistent [timeout] |
持久稳固的服务。这个选项的意思是来自同一个客 |
-r –real-server server-address |
真实的服务器[Real-Server:port] |
-g –gatewaying |
指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式) |
-i –ipip |
指定LVS 的工作模式为隧道模式 |
-m –masquerading |
指定LVS 的工作模式为NAT 模式 |
-w –weight weight |
真实服务器的权值 |
–mcast-interface interface |
指定组播的同步接口 |
-c –connection |
显示LVS 目前的连接 如:ipvsadm -L -c |
–t timeout |
显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L –timeout |
–daemon |
显示同步守护进程状态 |
–stats |
显示统计信息 |
–rate |
显示速率信息 |
-n –numeric |
输出IP 地址和端口的数字形式 |
–sort |
对虚拟服务器和真实服务器排序输出 |
-L -n |
查看规则,显示内核虚拟服务器表 |
-L -n -c |
查看客户端连接分发器和real server 的情况 |
例1:查看客户端连接分发器和real server 的情况
例2:查看速率
例3:-Z --zero 虚拟服务表计数器清零(清空当前的连接数量等)
例4:删除一条记录
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
实战: 同时处理1000个请求。 一次要执行1000个并发请求
Linu下的ab网站压力测试命令参数详解 |
|
格式 |
./ab [options] [http://]hostname[:port]/path |
参数 |
作用 |
-c |
在测试会话中所执行的请求个数。默认时,仅执行一个请求 |
-t |
一次产生的请求个数。默认是一次一个 |
-p |
测试所进行的最大秒数 |
-T |
包含了需要POST的数据的文件. |
-v |
POST数据所使用的Content-type头信息 |
-V |
设置显示信息的详细程度 |
-w |
显示版本号并退出。 |
-i |
以HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。 |
-C |
以HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。 |
-P |
对一个中转代理提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即, 是否发送了401认证需求代码),此字符串都会被发送 |
-n |
在测试会话中所执行的请求总个数。默认时,仅执行一个请求 |
语法: ab -n 数字 -c 数字 http://链接
-n requests Number of requests to perform
#在测试会话中所执行的请求总个数。默认时,仅执行一个请求
-c concurrency Number of multiple requests to make #一次产生的请求个数。默认是一次一个。
实战: 同时处理1000个请求。 一次要执行1000个并发请求。
在xuegod64:测试VIP:
[root@xuegod64 ~]# ab -n 1000 -c 1000 http://192.168.1.63/index.html
linux下ab网站压力测试命令
[root@xuegod63 ~]# ab -n 1000 -c 1000 http://192.168.1.63/index.html
可以测试一下后面两机器的负载情况。
查看状态:
[root@xuegod63 ~]# ab -n 1000 -c 1000 http://192.168.1.63/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.1.63 (be patient 耐心)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 630 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests #完成1000个请求
Server Software: Apache/2.2.15 #被测试的httpd服务器版本://平台apache 版本2.2.15
Server Hostname: 192.168.1.63 #服务器主机名
Server Port: 80 #服务器端口
Document Path: /index.html #测试的页面文档
Document Length: 13 bytes #文档大小
【说明:在xuegod62查看index.html大小。确实是13字节
[root@xuegod62 html]# ll -h
-rw-r--r-- 1 root root 13 May 5 17:57 index.html】
Concurrency(并发) Level: 1000 #并发数
Time taken for tests: 2.166 seconds #整个测试花费的时间
Complete requests: 1000 #完成的请求数量
Failed requests: 0 #失败的请求数量
Write errors: 0
Total transferred: 281120 bytes #整个测试过程中总传输字节数
HTML transferred: 13052 bytes #整个场景中的HTML内容传输量
Requests per second: 461.77 [#/sec] (mean) #每秒处理请求数。//大家最关心的指标一,相当于服务器中的每秒事务数 ,后面括号中的 mean 表示这是一个平均值
Time per request: 2165.597 [ms] (mean) # 大家最关心的指标二,平均请求响应时间 ,后面括号中的 mean 表示这是一个平均值
Time per request: 2.166 [ms] (mean, across all concurrent requests) #每个请求的时间:2.166[毫秒](意思是说,在所有的并发请求) //每个请求实际运行时间的平均值。 由于对于并发请求,cpu实际上并不是同时处理的,而是按照每个请求获得的时间片逐个轮转处理的,所以基本上第一个Time per request时间约等于第二个Time per request时间乘以并发请求数
Transfer rate: 126.77 [Kbytes/sec] received #传输速率://平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题
Percentage of the requests served within a certain time (ms) #在一定的时间内提供服务的请求的百分比(毫秒)
50% 581
66% 1053
75% 1075
80% 1089
90% 1393
95% 1793
98% 1800
99% 1804
100% 1807 (longest request)
//整个场景中所有请求的响应情况。在场景中每个请求都有一个响应时间,其中50%的用户响应时间小于1093 毫秒,60%的用户响应时间小于1247 毫秒,最大的响应时间小于7785 毫秒