交换机链路聚合负载均衡算法原理

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

初衷:

2011年初我学习交换机链路聚合技术的时候,心中一直有一个疑问:

交换机收到一个报文,到达聚合口的时候,是怎么选择成员口出去的呢?

是随机选的吗?还是按成员编号从小到大或从大到小轮循?如果选择源IP算法,是怎么实现不同源IP就走不同的端口的呢?那时网上也找不到介绍,这个疑问,直到2011年底做测试工程师时,才得到研发兄弟的回答,一直记在心里,总想找个时间发布到网上,让更多人知道,原来负载均衡算法其实是这么的简单!

链路聚合的主要作用是增加带宽,增加可靠性,防止二层环路。在这儿,我不讨论这技术为何而来与作何而用了,只说说报文到达聚合口时,是怎么选择出端口的。


感叹:

2012年底测试一个交换机项目时,和另一家公司(是大企业)是竞争关系,我负责测试本公司交换机(中小企业),名称就都不说了。

在进行入网测试时,工信部测试人员引入真实流量,分光成两份,分别进入两家厂商的交换机,交换机上配置同样的负载分担算法(如:都是SIP hash),同样的聚合组成员数(如:32个)。测试结果是:真实流10G两分钟,两家厂商各成员接口输出报文一模一样(判断出两家厂商负载均衡算法一模一样)。由此我才深深感叹,原来牛逼的厂商用的算法也不过如此而已(以前一直觉得大企业肯定很牛逼,事实最后的测试结果报告还不如我们)。


HASH表介绍:

在交换机内部,每创建一个聚合组时,底层同时创建对应该聚合组的一个hash表,该表存在于交换芯片上,hash表内容如下(简化)

左列index为芯片的硬性支持,现在一般是256,512,1024,更高的未见过。index数量越高,负载分担越均衡。

这儿以3个成员为例:

index

interface

0

eth0_0

1

eth0_1

2

eth0_2

3

eth0_0

4

 eth0_1

5

eth0_2

.

.

.

.

.

.

1022

eth0_0

1023

eth0_1


HASH表维护:

交换机里有专门的线程,实时检测聚合组有效成员,一旦成员状态发生变化,立即刷新hash表项。

顺便谈谈刷新HASH表这个技术。

工程师up/down成员口,底层就必须实时的刷新成员(这儿比较考验厂商技术),刷新速度越慢,成员状态变动时丢包越多。技术最强的如cisco,可以做到up/down成员口时,不丢包。而我公司最初会丢一秒钟的包(研发设计思路问题)。后来优化后才达到up/down成员端口,有0.0几秒的丢包,无法做到不丢包。

up/down分析:当工程师在命令行up/down聚合组成员时,底层表项会有那么一丁点儿的响应时间刷新表项,这丁点儿时间,已经down掉的接口还存在hash表里,而报文是一直都有的,正好被hash到这个无效的出端口的报文都会被丢弃!)


交换机负载均衡转发原理:

虽然底层有了一张HASH表,那么到底是怎么利用这张表的呢?

1)工程师设定端口成员与HASH算法,如SIPDIPSIP+DIPSIP+DIP+SP+DP等。

2)交换机根据成员生成HASH表,根据算法提取报文中相应内容。

3)使用特定HASH值的计算方法,把提取的内容计算出一个10bits的值。

4)找到底层HASH表项中该值对应的出端口。

5)把报文从这个出端口转发出去。



HASH值的计算方法:

 xor是异或运算,即两个值不相同,则异或结果为真;反之,为假。不同为1,相同为0

1SIP(源IP

 1SIP xor 0 得到一个32bit的值.

 2)然后作高16bits和低16bitsxor.

 3)再用16bits15-12bits11-8bitsxor,将得到的4bits替换到11-8bits,得到12bits右移2位得到10bitshash

注:10bits的值必然是0-1023里的一个数,该index对应的interface是多少,就从该接口转发出去。(相同的IP必然是相同的hash值)


2DIP(目的IP

SIP


3SIP+DIP(源IP+目的IP

1DIP xor SIP得到一个32bits的值。

2)然后作高16bits和低16bitsxor

3)再用16bits15-12bits11-8bitsxor,将得到的4bits替换到11-8bits,得到12bits右移2位得到10bitshash值。



4SIP+DIP+SP+DP(源地址 + 目的地址 + 源端口 + 目的端口)

1SIP xor DIP得到32bit的值value1

2hashtemp1的低16bits xor SP 得到32bithashtemp2

3hashtemp2 的低 16bit xor DP 得到 32bit hashtemp3

4)然后作高16bits和低16bitsxor

5)再用16bits1512bits118bits xor,将得到的4bits替换到118bits,得到12bits右移2位得到10bitshash


看完之后,是否发现,原来负载均衡算法是如此的容易!


很多看起来高端的技术,不是做不到,而是想不到。



     本文转自杨云1028 51CTO博客,原文链接:http://blog.51cto.com/yangrong/1330594,如需转载请自行联系原作者



相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
16天前
|
算法 Java
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
22 1
|
18天前
|
存储 传感器 算法
「AIGC算法」近邻算法原理详解
**K近邻(KNN)算法概述:** KNN是一种基于实例的分类算法,依赖于训练数据的相似性。算法选择最近的K个邻居来决定新样本的类别,K值、距离度量和特征归一化影响性能。适用于非线性数据,但计算复杂度高,适合小数据集。应用广泛,如推荐系统、医疗诊断和图像识别。通过scikit-learn库可实现分类,代码示例展示了数据生成、模型训练和决策边界的可视化。
13 0
「AIGC算法」近邻算法原理详解
|
25天前
|
算法 PHP
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
14 1
|
26天前
|
算法 安全 Java
Java中MD5加密算法的原理与实现详解
Java中MD5加密算法的原理与实现详解
|
5天前
|
算法 Java 调度
令牌桶算法的原理是什么
令牌桶算法的原理是什么
|
16天前
|
算法 Python
决策树算法详细介绍原理和实现
决策树算法详细介绍原理和实现
|
16天前
|
存储 算法 Java
Java面试题:解释JVM的内存结构,并描述堆、栈、方法区在内存结构中的角色和作用,Java中的多线程是如何实现的,Java垃圾回收机制的基本原理,并讨论常见的垃圾回收算法
Java面试题:解释JVM的内存结构,并描述堆、栈、方法区在内存结构中的角色和作用,Java中的多线程是如何实现的,Java垃圾回收机制的基本原理,并讨论常见的垃圾回收算法
15 0
|
21天前
|
设计模式 JavaScript 算法
vue2 原理【详解】MVVM、响应式、模板编译、虚拟节点 vDom、diff 算法
vue2 原理【详解】MVVM、响应式、模板编译、虚拟节点 vDom、diff 算法
27 0
|
26天前
|
机器学习/深度学习 自然语言处理 算法
分词算法在自然语言处理中的基本原理与应用场景
分词算法在自然语言处理中的基本原理与应用场景
|
26天前
|
自然语言处理 算法 Serverless
详尽分享贝叶斯算法的基本原理和算法实现
详尽分享贝叶斯算法的基本原理和算法实现
10 0