{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2020-01-07 20:00:30","updateBy":"admin","updateTime":"2020-01-07 20:00:30","remark":null,"id":13,"articleTitle":"LVS负载均衡","articleUrl":"lvs_slb","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220906/ead03235c356458c9e3fa664b3f5837f.jpg","articleFlag":"0","draftStatus":"1","reprintStatement":"1","articleSummary":"LVS是Linux Virtual Server的简称，也就是Linux虚拟服务器，是一个由章文嵩博士发起的自由软件项目，从Linux2.4内核心之后，已经完全内置了LVS的各个功能模块，无需给内核打任何补丁，可以直接使用LVS提供的各种功能。通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能，高可用的服务器群集，它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。","articleContent":"## LVS简介\n\nLVS（Linux Virtual Server）即Linux虚拟服务器，是由章文嵩博士主导的开源负载均衡项目，目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案，其体系结构如图1所示，终端互联网用户从外部访问公司的外部负载均衡服务器，终端用户的Web请求会发送给LVS调度器，调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器，比如，轮询算法可以将外部的请求平均分发给后端的所有服务器，终端用户访问LVS调度器虽然会被转发到后端真实的服务器，但如果真实服务器连接的是相同的存储，提供的服务也是相同的服务，最终用户不管是访问哪台真实服务器，得到的服务内容都是一样的，整个集群对用户而言都是透明的。最后根据LVS工作模式的不同，真实服务器会选择不同的方式将用户需要的数据发送到终端用户，LVS工作模式分为NAT模式、TUN模式、以及DR模式。\n\n## 三种负载均衡软件对比\n\n### Nginx\n\n- 工作在网络的7层（应用层）之上，可以针对http应用做一些分流的策略，比如针对域名、目录结构；\n- Nginx对网络的依赖比较小，理论上能ping通就就能进行负载功能；\n- Nginx安装和配置比较简单，测试起来比较方便；\n- 也可以承担高的负载压力且稳定，一般能支撑超过1万次的并发；\n- 对后端服务器的健康检查，只支持通过端口来检测，不支持通过url来检测。\n- Nginx对请求的异步处理可以帮助节点服务器减轻负载；\n- Nginx仅能支持http、https和Email协议，这样就在适用范围较小。\n- 不支持Session的直接保持，但能通过ip_hash来解决、对Big request header的支持不是很好，\n- 支持负载均衡算法：Round-robin（轮循）、Weight-round-robin（带权轮循）、Ip-hash（Ip哈希）\n- Nginx还能做Web服务器即Cache功能。\n\n### HAProxy\n\n- 支持两种代理模式：TCP（四层）和HTTP（七层），支持虚拟主机；\n- 能够补充Nginx的一些缺点比如Session的保持，Cookie的引导等工作\n- 支持url检测后端的服务器出问题的检测会有很好的帮助。\n- 更多的负载均衡策略比如：动态加权轮循(Dynamic Round Robin)，加权源地址哈希(Weighted Source Hash)，加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现\n- 单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。\n- HAProxy可以对Mysql进行负载均衡，对后端的DB节点进行检测和负载均衡。\n- 支持负载均衡算法：Round-robin（轮循）、Weight-round-robin（带权轮循）、source（原地址保持）、RI（请求URL）、rdp-cookie（根据cookie）\n- 不能做Web服务器即Cache。\n\n### LVS\n\n- 抗负载能力强。抗负载能力强、性能高，能达到F5硬件的60%；对内存和cpu资源消耗比较低\n- 工作在网络4层（传输层），通过vrrp协议转发（仅作分发之用），具体的流量由linux内核处理，因此没有流量的产生。\n- 稳定性、可靠性好，自身有完美的热备方案；（如：LVS+Keepalived）\n- 应用范围比较广，可以对所有应用做负载均衡；\n- 不支持正则处理，不能做动静分离。\n- 支持负载均衡算法：rr（轮循）、wrr（带权轮循）、lc（最小连接）、wlc（权重最小连接）\n- 配置 复杂，对网络依赖比较大，稳定性很高。\n\n## LVS三种工作模式\n\n### NAT模式\n\n1. 工作流程\n\n   - 当用户请求到达Director Server，此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP，目标IP为VIP\n   - PREROUTING检查发现数据包的目标IP是本机，将数据包送至INPUT链\n   - IPVS比对数据包请求的服务是否为集群服务，若是，修改数据包的目标IP地址为后端服务器IP，然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP，目标IP为RIP\n   - POSTROUTING链通过选路，将数据包发送给Real Server\n   - Real Server比对发现目标为自己的IP，开始构建响应报文发回给Director Server。 此时报文的源IP为RIP，目标IP为CIP\n   - Director Server在响应客户端前，此时会将源IP地址修改为自己的VIP地址，然后响应给客户端。 此时报文的源IP为VIP，目标IP为CIP\n\n2. 特性\n\n   - RS应该使用私有地址，RS的网关必须指向DIP\n   - DIP和RIP必须在同一个网段内\n   - 请求和响应报文都需要经过Director Server，高负载场景中，Director Server易成为性能瓶颈\n   - 支持端口映射\n   - RS可以使用任意操作系统\n\n**缺陷：**对Director Server压力会比较大，请求和响应都需经过director server\n\n### DR路由模式\n\n1. 工作流程\n\n   - 当用户请求到达Director Server，此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP，目标IP为VIP\n   - PREROUTING检查发现数据包的目标IP是本机，将数据包送至INPUT链\n   - IPVS比对数据包请求的服务是否为集群服务，若是，将请求报文中的源MAC地址修改为DIP的MAC地址，将目标MAC地址修改RIP的MAC地址，然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改，仅修改了源MAC地址为DIP的MAC地址，目标MAC地址为RIP的MAC地址\n   - 由于DS和RS在同一个网络中，所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址，那么此时数据包将会发至Real Server。\n   - RS发现请求报文的MAC地址是自己的MAC地址，就接收此报文。处理完成之后，将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP，目标IP为CIP\n   - 响应报文最终送达至客户端\n\n2. 特性\n\n   - 保证前端路由将目标地址为VIP报文统统发给Director Server，而不是RS\n   - RS可以使用私有地址；也可以是公网地址，如果使用公网地址，此时可以通过互联网对RIP进行直接访问\n   - RS跟Director Server必须在同一个物理网络中\n   - 所有的请求报文经由Director Server，但响应报文必须不能进过Director Server\n   - 不支持地址转换，也不支持端口映射\n   - RS可以是大多数常见的操作系统\n   - RS的网关绝不允许指向DIP(因为我们不允许他经过director)\n   - RS上的lo接口配置VIP的IP地址\n\n**缺点：**必须保证RS与DS在同一机房内\n\n\n### TUN隧道模式\n\n- IP隧道技术又称为IP封装技术，它可以将带有源和目标IP地址的数据报文使用新的源和目标IP进行第二次封装，这样这个报文就可以发送到一个指定的目标主机上；\n- VS/TUN模式下，调度器和后端服务器组之间使用IP隧道技术。当客户端发送的请求(CIP-->VIP)被director接收后，director修改该报文，加上IP隧道两端的IP地址作为新的源和目标地址，并将请求转发给后端被选中的一个目标；\n- 当后端服务器接收到报文后，首先解封报文得到原有的CIP-->VIP，该后端服务器发现自身的tun接口上配置了VIP，因此接受该数据包。\n- 当请求处理完成后，结果将不会重新交给director，而是直接返回给客户端；在后端服务器返回给客户端数据包时，由于使用的是普通网卡接口，根据一般的路由条目，源IP地址将是该网卡接口上的地址，例如是RIP。因此，要让响应数据包的源IP为VIP，必须添加一条特殊的路由条目，明确指定该路由的源地址是VIP。\n\n生产环境中应用较多的是NAT模式与路由模式，所以对TUN模式不做过多介绍\n\n## LVS负载均衡策略\n\n1. 轮叫调度 rr\n\n   这种算法是最简单的，就是按依次循环的方式将请求调度到不同的服务器上，该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的，调度器会将所有的请求平均分配给每个真实服务器，不管后端 RS 配置和处理能力，非常均衡地分发下去。\n\n2. 加权轮叫 wrr\n\n   这种算法比 rr 的算法多了一个权重的概念，可以给 RS 设置权重，权重越高，那么分发的请求数越多，权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充， LVS 会考虑每台服务器的性能，并给每台服务器添加要给权值，如果服务器A的权值为1，服务器B的权值为2，则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器，处理的请求越多。\n\n3. 最少链接 lc\n\n   这个算法会根据后端 RS 的连接数来决定把请求分发给谁，比如 RS1 连接数比 RS2 连接数少，那么请求就优先发给 RS1\n\n4. 加权最少链接 wlc\n\n   这个算法比 lc 多了一个权重的概念。\n\n5. 基于局部性的最少连接调度算法 lblc\n\n   这个算法是请求数据包的目标 IP 地址的一种调度算法，该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器，如果这台服务器依然可用，并且有能力处理该请求，调度器会尽量选择相同的服务器，否则会继续选择其它可行的服务器\n\n6. 复杂的基于局部性最少的连接算法 lblcr\n\n   记录的不是要给目标 IP 与一台服务器之间的连接记录，它会维护一个目标 IP 到一组服务器之间的映射关系，防止单点服务器负载过高。\n\n7. 目标地址散列调度算法 dh\n\n   该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系，出现服务器不可用或负载过高的情况下，发往该目标 IP 的请求会固定发给该服务器。\n\n8. 源地址散列调度算法 sh\n\n   与目标地址散列调度算法类似，但它是根据源地址散列算法进行静态分配固定的服务器资源。\n\n\n## 配置LVS\n\n### NAT模式配置\n\n1. 环境设置\n\nDS：172.16.254.136,192.168.100.1\\\nRS1：192.168.100.11\\\nRS2：192.168.100.12\\\nRS的网关必须指向DS的第二个IP\n\n2. DS上开启路由转发功能\n\n   ```bash\n   echo 1 > /proc/sys/net/ipv4/ip_forward\n   ```\n\n3. 关闭ICMP重定向\n\n   ```bash\n   echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects\n   echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects\n   echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects\n   echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects\n   ```\n\n4. 配置转发规则\n\n   ```bash\n   ipvsadm -A -t 172.16.254.136:80 -s rr      # 指定负载均衡算法\n   ipvsadm -a -t 172.16.254.136:80 -r 192.168.100.11 -m\n   ipvsadm -a -t 172.16.254.136:80 -r 192.168.100.12 -m\n   ```\n\n### DR模式配置\n\n1. 环境设置\n\n```bash\nDS:192.168.10.10\\\nRS1:192.168.10.11\\\nRS2:192.168.10.12\n\nVIP:192.168.10.20\n```\n\n\n\n2. DS配置\n\n   ```bash\n   ipvsadm -A -t 192.168.10.20:80 -s rr    #-A为ADD   -t为tcp   -s rr为设置算法为轮叫算法\n   ```\n\n   ```bash\n   #添加2台real_server主机\n   ipvsadm -a -t 192.168.10.20:80 -r 192.168.10.11:80 -g #-a为add   -t为tcp   -r为realserver   -g为DR路由模式\n   ipvsadm -a -t 192.168.10.20:80 -r 192.168.10.12:80 -g #-a为add   -t为tcp   -r为realserver   -g为DR路由模式\n   \n   #配置网卡的子网口为vip，ip地址为192.168.10.20\n   ifconfig ens33:0 192.168.10.20 broadcast 192.168.10.20 netmask 255.255.255.255 up\n   \n   #添加路由（访问192.168.10.20都走ens33:0这个网卡)\n   route add -host 192.168.10.20 dev ens33:0\n   ```\n\n3. RS配置\n\n   ```bash\n   #在回环地址的子网口上配置服务ip(vip)\n   ifconfig lo:0 192.168.10.20 broadcast 192.168.10.20 netmask 255.255.255.255 up\n   \n    #添加路由\n    route add -host 192.168.10.20 dev lo:0\n    echo \"1\">/proc/sys/net/ipv4/conf/lo/arp_ignore\n    echo \"2\">/proc/sys/net/ipv4/conf/lo/arp_announce\n    echo \"1\">/proc/sys/net/ipv4/conf/all/arp_ignore\n    echo \"2\">/proc/sys/net/ipv4/conf/all/arp_announce\n\n    echo \"0\">/proc/sys/net/ipv4/conf/lo/arp_ignore\n    echo \"0\">/proc/sys/net/ipv4/conf/lo/arp_announce\n    echo \"0\">/proc/sys/net/ipv4/conf/all/arp_ignore\n    echo \"0\">/proc/sys/net/ipv4/conf/all/arp_announce\n\n    arp_ignore:定义接收到ARP请求时的响应级别\n        0：默认，只用本地配置的有响应地址都给予响应\n        1：仅仅在目标IP是本地地址，并且是配置在请求进来的接口上的时候才给予响应(仅在请求的目标地址配置请求到达的接口上的时候，才给予响应)\n\n    arp_announce：定义将自己的地址向外通告时的级别\n        0：默认，表示使用配置在任何接口的任何地址向外通告\n        1：尽量仅向目标网络通告与其网络匹配的地址\n        2：仅向与本地接口上地址匹配的网络进行通告\n   ```","categoryId":6,"viewCount":1369,"categoryName":"集群与高可用","author":"球接子","authorAvatar":null,"tagIds":[7,11],"tagNames":["负载均衡","高可用"]}}