路由应用-使用路由实现负载流量均衡

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介:

1.问题

要实现负载流量均衡,有很多方法,在Linux上LVS是一种不错的选择,然则配置却相对复杂,其实现原理很奇怪,在Netfilter的INPUT链上实现了一个HOOK,然后处理后再将数据包OUTPUT出去。我们知道Netfilter的HOOK方式虽然功能强大,几乎无所不能(你甚至可以在里面注册一个USB设备检测程序),然而过多的条件判断和处理逻辑在网络多并发大负载的情况下会严重影响性能,因此对于性能要求高的需求,还是对Netfilter的方案敬而远之吧,比如,在部署IPSec时,虽然FreeSWAN几乎完全兼容了IPSec标准,然而由于它是Netfilter实现的,性能上会大打折扣。
      我们希望用原生的协议栈特性来实现负载均衡。我首选路由,因为路由的灵活性最高,它完全是用户自己配置的,而不像协议解析时是标准规定的。正如《使用策略路由实现访问控制》里面的方案一样,本文使用路由来实现本应该由第三方协议栈过滤驱动实现的负载均衡模块

2.原理

所谓高可用性负载均衡本质的一个解释就是将本应该由一个服务处理的请求分担给多个服务器,其实现的要点首先就是将请求数据包分离,然后导向不同的服务器,这种方式是最平滑的,我们知道,路由是专门将数据包分离到不同的路径的。

2.1.分离到不同的目的地址

实现请求数据包的分离的根本就是将目的地址分离,比如本来是一个目的地址addr,现在需要将其分离为addr1,addr2,addr3,...addrn。我们知道,做到这点,最好的办法就是做DNAT。Linux的NDAT是用Netfilter做的,然而它的实现却和filter不同,DNAT基于IP_CONNTRACK,而CONNTRACK状态的维护是hash表做的,实现很高效,再者,CONNTRACK是基于状态的,只有对每个流的第一个数据包才会经过所有的规则,后续的包只须匹配到流,然后直接取target结果,而匹配到流是hash完成的,十分高效。
     本文讨论是一种方案,并不限于Linux,Cisco系统,H3C系统的DNAT实现可能都比Linux更高效,这样再配合其高效的路由系统,负载均衡就更完美了。

2.2.配置分离后地址的路由

比如一个地址addr被DNAT随机分离成了addr1,addr2,那么我们就可以配置到达addr1和addr2的路由,使之到达不同的服务器。这条原理十分简单。

2.3.链路层复用

上述的addr1,addr2,...addrn,并不一定要通过不同的网卡出去,我们知道链路层是可以被不同IP网段的流量所复用的,也就是说,一个用交换机互联(hub亦可)的以太网上可以配置多个IP网段,交换机对arp通信是完全通透的,因此即使负责负载均衡的机器中只有两个网卡,那么也可以使用另一块网卡来作为总的出口,然后将addr1,addr2...addrn等n台服务器部署在一个以太网中。
2.4.使用30位子网掩码省去路由的配置
上述的方案需要手动配置到达addr1,addr2,addrn的路由,当然你也可以在链路层复用的情况下手动配置一条默认路由。然而有没有办法不用配置路由呢?答案是肯定的,我们考虑一个30为掩码的网段,其中共有4个IP地址,除去全0的网络地址和全1的广播地址,剩下两个主机地址,可以将这两个主机地址中其中的一个配置在负载均衡器上,另一个配置在真实的服务器上,也就是DNAT的目的地址的那个。当然这种方案虽然不用配置路由,然而却需要用30位(如果不怕浪费IP地址,你也可以用更短掩码的IP地址)的配置ip地址,并且在dnat的时候需要一个不连续IP地址的ip-pool。

3.配置

3.1.直接路由方式配置(拥有不同的以太网)

配置dnat:
iptables -t nat -A PREROUTING -d 1.2.3.1 -p tcp --dport 1234 -j DNAT --to 2.3.4.1-2.3.4.3
配置路由:
route add -host 2.3.4.1 dev eth1
route add -host 2.3.4.2 dev eth2
route add -host 2.3.4.3 dev eth3

3.2.链路层复用配置

很简单,略

3.3.使用30位掩码(非链路层复用)

如果使用链路层复用的话,和本节的配置是一样的,故不再单列讨论
配置dnat:
将目的地址分离为一个pool中的地址,该pool中的地址暂定为:1.2.3.2和1.2.3.5
配置IP地址
ip addr add dev eth1 1.2.3.1/30
ip addr add dev eth2 1.2.3.5/30

4.问题

这种使用路由的方式实现负载均衡很直接,又很高效,然而对于审计的支持却不是很好,也没有什么地方可以很好的记录日志,因为本来dnat模块或者路由模块就是一个综合的模块,而不是一个专门用于负载均衡的模块,这样的话,出了问题也不好排查,相比之下,LVS就好得多。



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1270966

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
4月前
|
网络虚拟化 网络架构
静态路由实现路由负载分担
配置思路 采用如下的思路配置静态路由实现路由负载分担: 1. 创建VLAN并配置各接口所属VLAN,配置各VLANIF接口的IP地址。 2. 配置数据流来回两个方向的静态路由。 3. 在各主机上配置IP地址和默认网关。
|
12月前
|
负载均衡 算法 云计算
深入理解负载均衡:优化你的网络性能
在今天的数字时代,网络性能和可用性对于任何企业或组织都至关重要。负载均衡是一个关键的网络架构组件,可以帮助分散流量、提高可靠性和确保系统的高可用性。本文将深入探讨负载均衡的概念、工作原理以及在现代网络中的应用。
|
4月前
|
Dubbo 应用服务中间件 测试技术
流量路由技术
流量路由,顾名思义就是将具有某些属性特征的流量,路由到指定的目标。流量路由是流量治理中重要的一环,本节内容将会介绍流量路由常见的场景、流量路由技术的原理以及实现。我们可以基于流量路由标准来实现各种业务场景,如标签路由、金丝雀发布、同机房优先路由等。标签路由标签路由是按照标签为维度对目标负载进行划分,...
流量路由技术
|
弹性计算 Kubernetes 负载均衡
使用集群内流量保持来防止流量在集群之间串门
作为业内首个全托管Istio兼容的阿里云服务网格产品ASM,一开始从架构上就保持了与社区、业界趋势的一致性,控制平面的组件托管在阿里云侧,与数据面侧的用户集群独立。ASM产品是基于社区Istio定制实现的,在托管的控制面侧提供了用于支撑精细化的流量管理和安全管理的组件能力。通过托管模式,解耦了Istio组件与所管理的K8s集群的生命周期管理,使得架构更加灵活,提升了系统的可伸缩性。从2022年4月1日起,阿里云服务网格ASM正式推出商业化版本, 提供了更丰富的能力、更大的规模支持及更完善的技术保障,更好地满足客户的不同需求场景,详情可进入阿里云官方网站 - 搜索服务网格ASM。
使用集群内流量保持来防止流量在集群之间串门
|
网络协议 应用服务中间件 数据安全/隐私保护
阿里云SLB七层负载 流量跑满处理
阿里云SLB七层负载 流量跑满处理
阿里云SLB七层负载 流量跑满处理
|
应用服务中间件 nginx
请求分发负载
下面的nginx配置文件nginx.conf配置的不是轮询策略做tomcat集群负载,而是定向请求,也算做了个简单的请求分发负载。比如app单独请求一个服务器(tomcat),web单独请求一个服务器(tomcat),管理后台单独请求一个服务器(tomcat),后期轮询配置也会进行整理。
|
弹性计算 负载均衡 算法
WAF+SLB负载不均衡案例分享
问题演变过程 时间点1:高防+WAF+SLB+2台ECS时间点2:高防+WAF+SLB+4台ECS 问题描述 在时间点1时,没有发现明显的负载不均衡的情况。在时间点2时,出现大部分请求都打到了其中一台ECS上。
WAF+SLB负载不均衡案例分享
|
负载均衡
过载保护+异构服务器的负载均衡,怎么设计?
负载均衡是指,将请求/数据分摊到多个操作单元上执行,关键在于均衡。
677 0
|
应用服务中间件 nginx 弹性计算
实测阿里云slb转发策略的健康检查
小白实测阿里云slb的转发策略功能的健康检查问题
3973 0
|
负载均衡 应用服务中间件 nginx