如何使用LVS+DR来搭建集群实现负载均衡


下文给大家带来如何使用LVS+DR来搭建集群实现负载均衡,希望能够给大家在实际运用中带来一定的帮助,负载均衡涉及的东西比较多,理论也不多,网上有很多书籍,今天我们就用开发云在行业内累计的经验来做一个解答。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发送的请求基本信息: IP192.168.1.101向目标vip发出请求,Director接收。此时IP包头及数据帧头信息如下: ② Director分发器根据负载均衡算法选择一台activerealserver(假设是192.168.1.62),将此RIP所在网卡的mac地址作为目标mac地址,发送到局域网里。此时IP包头及数据帧头信息如下: ③ realserver(192.168.1.62)在局域网中收到这个帧,脱掉数据帧后发现目标IP(VIP)本地匹配,是处理这个报文。随后重新封装报文,发送到局域网。此时回复请求的IP包头及数据帧头信息如下: 如果clientVS同一网段,那么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.63DIP:eth0192.168.1.70Real server xuegod62: RIP:eth0: 192.168.1.62VIP:lo:1 192.168.1.63Real server xuegod64: RIP:eth0: 192.168.1.64 VIP:lo:1 192.168.1.63 2iptables -F , 清除规则3selinux关闭4:red had 6.5版本 64位操作系统四:实验代码
分发器-xuegod631:配置DIPRIP地址DIP :[root@xuegod63 ~]# ifconfig eth0 192.168.1.70VIP :[root@xuegod63 ~]# ifconfig eth0:1 192.168.1.63 [root@xuegod63 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 #以配置以下信息 IPADDR=192.168.1.70NETMASK=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.63Bcast: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模式需要开启路由转发功能。 DRTUN模式需要开启。 4LVS的规则配置文件:/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 RealServerxuegod62 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 RealServerxuegod641, 配置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 参数调度算法-srr 轮循法 默认算法-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-BasedLeast 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算法。这个必须举例来说了
ABC三台机器分别权重123 ,连接数也分别是123。那么如果使用WLC算法的话一个新请求进入时它可能会分给ABC中的任意一个。使用sed算法后会进行这样一个运算
A(1+1)/1
B(1+2)/2
C(1+3)/3
根据运算结果,把连接交给C
10:最少队列调度(Never Queue Scheduling NQ(NQ)无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要在进行sed运算注:调度算法配置后立即生效,就像iptables配置规则一样。测试不同的调度算法1:测试LVSLVS-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 ~]# ip开发云主机域名vsadm -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,而没有交给Directoripvsadm 更多参数说明参数说明-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。在这个功能上也可以采用keepalivedVRRP 功能。–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]持久稳固的服务。这个选项的意思是来自同一个客
户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。-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–ttimeout显示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的数据的文件. -vPOST数据所使用的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 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.15Server 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 毫秒看了以上关于如何使用LVS+DR来搭建集群实现负载均衡,如果大家还有什么地方需要了解的可以在开发云行业资讯里查找自己感兴趣的或者找我们的专业技术工程师解答的,开发云技术工程师在行业内拥有十几年的经验了。

相关推荐: 用cdn加速的一些理由

开发云内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上,由分布在不同区域的边缘节点云服务器群组成的分布式网络。开发云CDN分担源站压力,避免网络拥塞,确保在不同区域、不同场景下加速网站内容的分发,提高资源访问…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 04/01 12:07
下一篇 04/01 12:07