当前位置: 首页 > Linux

LVS负载均衡(一)

时间:2023-04-06 22:32:54 Linux

博客参考http://www.jianshu.com/p/8a61de3f8be9http://itnihao.blog.51cto.com/1741976/752472负载均衡集群是负载均衡集群的简称,译翻译成中文就是负载均衡集群。常用的负载均衡开源软件有nginx、lvs、haproxy,商用硬件负载均衡设备F5、Netscale。这里主要是学习LVS,做一个详细的总结记录。负载均衡LVS基本介绍LB集群的结构和原理很简单,就是当用户的请求来的时候,直接分发到DirectorServer,然后它会智能的把用户的请求均匀的分发到后端按照设定的调度算法在真实服务器(realserver)上。为了避免用户在不同机器上请求的数据不同,需要共享存储来保证所有用户请求的数据是相同的。LVS是LinuxVirtualServer的缩写,即Linux虚拟服务器。这是一个由张文松博士发起的开源项目,其目前的LVS已经是Linux内核标准的一部分。使用LVS可以达到的技术目标是:通过LVS实现的负载均衡技术和Linux操作系统,实现高性能、高可用的Linux服务器集群,具有良好的可靠性、可扩展性和可操作性。结果是以低成本获得最佳性能。LVS是一个实现负载均衡集群的开源软件项目。LVS架构在逻辑上可以分为调度层、服务器集群层和共享存储。官网是http://www.linuxvirtualserver...LVS的基本工作原理当用户向负载均衡调度器(DirectorServer)发起请求时,调度器将请求发送到内核空间的PREROUTING链会先接收到用户请求,判断目标IP确定为本地IP,将数据包发送到INPUT链,IPVS工作在INPUT链上。当用户请求到达INPUT时,IPVS会将用户请求与自己定义的集群服务进行比较。如果用户请求的是定义好的集群服务,那么此时IPVS会强行修改数据包中的目标IP地址和端口,并将新的数据包发送到POSTROUTING链上。POSTROUTING链路收到数据包后,发现目标IP地址正好是自己的后端服务器,此时通过路由选择,最终将数据包发送给后端服务器LVS组成LVS由2个组成部分程序,包括ipvs和ipvsadm。ipvs(ipvirtualserver):有一段代码工作在内核空间,叫做ipvs,是真正生效实现调度的代码。ipvsadm:另一段工作在用户空间,叫做ipvsadm,负责编写ipvs内核框架的规则,定义谁是集群服务,谁是后端真实服务器(RealServer)LVS相关术语DS:Director服务器。指前端负载均衡器节点。RS:真实服务器。后端真正工作的服务器。VIP:直接对外面向用户请求,作为用户请求的目标IP地址。DIP:DirectorServerIP,主要用于与内部主机通信的IP地址。RIP:RealServerIP,后端服务器的IP地址。6CIP:ClientIP,接入客户端的IP地址。下面总结一下三种工作模式的原理和特点。LVS/NAT的原理和特点重点理解NAT模式的实现原理和数据包的变化。(A)。当用户请求到达DirectorServer时,请求的数据报文会首先进入内核空间的PREROUTING链。此时消息的源IP为CIP,目的IP为VIP(b)。PREROUTING检查数据包的目的IP是否为本地,将数据包发送到INPUT链(c)。IPVS比较数据包请求的服务是否为Cluster服务,如果是,则修改数据包的目标IP地址为后端服务器的IP,然后将数据包发送到POSTROUTING链。此时报文的源IP为CIP,目标IP为RIP(d)。POSTROUTING链选择路由并将数据包发送到RealServer(e)。RealServer对比发现目标是自己的IP,开始构建响应报文发送回DirectorServer。此时报文的源IP为RIP,目的IP为CIP(f)。DirectorServer在响应客户端之前,会将源IP地址修改为自己的VIP地址,然后再响应客户端。此时报文的源IP为VIP,目标IP为CIPLVS-NAT模型的特征。RS应该使用私有地址。RS的网关必须指向DIPDIP,RIP必须在同一网段。请求和响应消息都需要经过DirectorServer。在高负载场景下,DirectorServer很可能成为性能瓶颈。支持端口映射。RS可以使用任何操作系统。缺陷:对DirectorServer的压力会比较大,请求和响应都要经过directorserverLVS/DR原理和特点Re-targetrequestmessageMAC地址设置为所选RS的MAC地址(a)当用户请求到达DirectorServer,请求的数据包会首先进入内核空间的PREROUTING链。此时报文的源IP为CIP,目的IP为VIP(b)PREROUTING检查数据包的目的IP是否为本地,将数据包发送至INPUT链(c)IPVS比较是否数据包请求的服务是集群服务,如果是,修改请求报文中的源MAC地址为DIP的MAC地址,修改目标MAC地址为RIP的MAC地址,然后将数据包发送到POSTROUTING链。此时源IP和目的IP都没有被修改。只是源MAC地址修改为DIP的MAC地址,目的MAC地址修改为RIP的MAC地址。发送。POSTROUTING链检查目标MAC地址是否为RIP的MAC地址,此时将数据包发送给RealServer。(e)RS发现请求报文的MAC地址是自己的MAC地址,接收报文。处理完成后,将响应报文通过lo接口传给eth0网卡,然后发送出去。此时源IP地址为VIP,目标IP为CIP(f)。响应消息最终传递给客户端。LVS-DR模型的特点1:保证前端路由将所有目标地址的报文发送到DirectorServer,可以使用私有地址代替RSRS;也可以是公网地址。如果使用公网地址,可以直接通过Internet访问RIP。RS和DirectorServer必须在同一个物理网络中。所有请求报文都经过DirectorServer,但响应报文一定不能进入DirectorServer不支持地址转换,也不支持端口映射RS可以是大多数常见的操作系统。lo接口配置VIP的IP地址缺陷:RS和DS必须在同一机房特性1的解决方法:在前端路由器做静态地址路由绑定,只将VIP地址路由到DirectorServer有一个问题:用户可能没有对路由的操作权限,因为它可能是由运营商提供的,所以这种方法对于arptables可能不实用:在arp层进行ARP解析时实现防火墙规则,过滤RS响应ARP请求。这是iptables提供的修改RS上的内核参数(arp_ignore和arp_announce)来在lo接口的别名上配置RS上的VIP,限制其响应VIP地址解析请求。LVS/Tun的原理和特点在原始IP报文外封装了一层额外的IP头,内层IP头(源地址为CIP,目标IIP为VIP),外层IP头(源地址为DIP,目标IP为RIP))(a)当用户请求到达DirectorServer时,请求的数据包会首先进入内核空间的PREROUTING链。此时消息的源IP为CIP,目的IP为VIP。(b)PREROUTING检查数据包的目的IP是否为本机,将数据包发送到INPUT链(c)IPVS比较数据包请求的服务是否为集群服务,如果是,则重新-在请求报文的头部封装一层对于IP包,源IP封装为DIP,目的IP为RIP。然后发送到POSTROUTING链。此时源IP为DIP,目标IP为RIP(d)。传播)。此时源IP为DIP,目的IP为RIP(e)。RS收到报文后发现是自己的IP地址,然后接收报文。去掉最外层的IP后,会发现里面还有一层IP。Header,而target是自己的lo接口VIP,那么此时RS就开始处理这个请求,处理完成后,通过lo接口发送到eth0网卡,再传给外面。此时源IP地址为VIP,目的IP为CIP(f)。响应消息最终传递给客户端LVS-Tun模型特征。RIP、VIP、DIP都是公网地址。RS的网关不会也不能指向DIP。所有请求消息都经过DirectorServer,但响应消息不得经过DirectorServer。不支持端口映射RS的系统必须支持隧道。其实在企业中最常用的方法就是DR实现,NAT配置比较简单方便。在实践中,我们会总结一下DR和NAT的具体使用配置过程。VSround-robinschedulingrr的八种调度算法是最简单的算法,就是把请求按顺序循环的方式调度到不同的服务器上。该算法最大的特点是简单。轮询算法假设所有的服务器都具有相同的处理请求的能力,调度器会将所有的请求平均分配给每一个真实的服务器,而不管后端RS的配置和处理能力如何,非常均衡地分配。weightedround-robinwrr算法比rr算法多了一个权重概念。您可以设置RS的权重。权重越高,分发的请求就越多。权重的取值范围为0-100。主要是对rr算法的优化和补充。LVS会考虑每台服务器的性能,给每台服务器增加权重。如果服务器A的权重为1,服务器B的权重为2,那么派发给服务器B的请求数将是服务器A的两倍,权重高的服务器处理的请求也多。leastlinklc算法会根据后端RS连接数来决定把请求分发给谁。比如RS1的连接数小于RS2的连接数,那么请求会先发给RS1。加权最小链接wlc算法有比lc多一个权重的概念。Locality-BasedLeastConnectionSchedulingAlgorithmlblc该算法是一种请求数据包目的IP地址的调度算法。该算法首先根据请求的目的IP地址,使用目的IP地址搜索距离最近的所有服务器。如果这台服务器仍然可用并且有能力处理请求,调度器会尝试选择同一台服务器,否则会继续选择其他可行的服务器基于最小局部性的复杂连接算法lblcr记录不打算在targetIPandaserver会维护一个目标IP和一组服务器的映射关系,防止单个服务器过载。目的地址哈希调度算法dh该算法是根据目标IP地址,通过哈希函数建立目标IP与服务器之间的映射关系。当服务器不可用或负载过高时,发送到目标IP的请求将被发送到服务器。源地址哈希调度算法sh类似于目标地址哈希调度算法,但它是根据源地址哈希算法静态分配固定的服务器资源。用三台服务器练习LVSNAT模式实验环境,一台作为director,两台作为realserver。director有一个外网网卡(172.16.254.200)和一个内网ip(192.168.0.8),而两台realserver只有内网ip(192.168.0.18)和(192.168.0.28),而director的内网网关两台真实服务器需要设置为director的内网ip(192.168.0.8),在两台真实服务器上安装配置nginx服务#yuminstall-yinstallipvsadmonnginxDirector#yuminstall-yipvsadmDirectoreditnatimplementationscript#vim/usr/local/sbin/lvs_nat.sh#编辑写入以下内容:#!director服务器上的/bin/bash#启用路由转发功能:echo1>/proc/sys/net/ipv4/ip_forward#关闭icmp重定向echo0>/proc/sys/net/ipv4/conf/all/send_redirectsecho0>/proc/sys/net/ipv4/conf/default/send_redirectsecho0>/proc/sys/net/ipv4/conf/eth0/send_redirectsecho0>/proc/sys/net/ipv4/conf/eth1/send_redirects#directorsetupnatfirewalliptables-tnat-Fiptables-tnat-Xiptables-tnat-APOSTROUTING-s192.168.0.0/24-jMASQUERADE#directorsetipvsadmIPVSADM='/sbin/ipvsadm'$IPVSADM-C$IPVSADM-A-t172.16.254.200:80-swrr$IPVSADM-a-t172.16.254.200:80-r192.168.0.18:80-m-w1$IPVSADM-a-t172.16.254.200:80-r192.168.0.28:80-m-w1保存后直接在Director上运行这个脚本即可完成lvs/nat/bin/bash/usr/的配置local/sbin/lvs_nat.sh查看ipvsadm设置的规则ipvsadm-ln测试LVS的效果通过浏览器测试两台机器上的网页内容http://172.16.254.200为了区分,我们可以修改默认页面nginx这里:Execute#echo"rs1rs1">/usr/share/nginx/html/index.htmlonRS1Execute#echo"rs2rs2">/usr/share/nginx/html/index.htmlonRS2注意,记得要确保两个RS上要设置的网关IP为director的内网IP。三台机器练习LVSDR模式实验环境:Director节点:(eth0192.168.0.8vipeth0:0192.168.0.38)Realserver1:(eth0192.168.0.18viplo:0192.168.0.38)Realserver2:(eth0192.168.0.28viplo:0192.168.0.38)在两台真实服务器上安装nginx服务#yuminstall-ynginxDirectorinstallipvsadm#yuminstall-yipvsadmDirectorconfigurescript#vim/usr/local/sbin/lvs_dr.sh#!/bin/bashecho1>/proc/sys/net/ipv4/ip_forwardipv=/sbin/ipvsadmvip=192.168.0.38rs1=192.168.0.18rs2=192.168.0.28ifconfigeth0:0downifconfigeth0:0$vipbroadcast$vipnetmask255.255.255.255uprouteadd-host$vipdeveth0:0$ipv-C$ipv-A-t$vip:80-swrr$ipv-a-t$vip:80-r$rs1:80-g-w3$ipv-a-t$vip:80-r$rs2:80-g-w1执行脚本:#bash/usr/local/sbin/lvs_dr.sh在2rs上配置脚本:#vim/usr/local/sbin/lvs_dr_rs.sh#!/bin/bashvip=192.168.0.38ifconfiglo:0$vipbroadcast$vipnetmask255.255.255.255urouteadd-host$viplo:0echo"1">/proc/sys/net/ipv4/conf/lo/arp_ignoreecho"2">/proc/sys/net/ipv4/conf/lo/arp_announceecho"1">/proc/sys/net/ipv4/conf/all/arp_ignoreecho"2">/proc/sys/net/ipv4/conf/all/arp_announcers单独执行脚本:bash/usr/local/sbin/lvs_dr_rs.sh实验的测试方法同上,浏览器访问http://192.168.0.38注意:在DR模式下,两个rs节点的网关不需要设置为dir的IP节点