- 什么是负载分担
- 如何通过Hash算法实现负载分担
- 如何解决Eth-Trunk负载分担不均
- 成员数量是否为2的N次方
- 是否存在跨设施重叠
- 是否存在Hash极化问题
- 流量类型与负载分担模式是否匹配
什么是负载分担
在网络部署当中,当存在多条转发门路的时候,经常会部署负载分担性能。通过部署负载分担,设施能够基于报文内容等进行逐流转发,或者基于随机数、轮转形式进行逐包转发,以达到充分利用链路,进步转发效率的目标。
基于逐包负载分担形式的理论部署较少,因为该形式可能导致同一个用户的流量通过网络的不同门路传输后,达到目标设施呈现报文乱序或多份的状况。常见的负载分担形式个别抉择基于逐流进行负载分担。
逐流负载分担即依照肯定的规定,如依据五元组(源IP地址、目标IP地址、协定号、源端口号、目标端口号),将报文分成不同的流。同一条流的报文,通过Hash计算后,会在同一条链路上转发。
如图1-1所示,假如DeviceA上有6个报文要通过DeviceA和DeviceB之间的LinkA和LinkB进行负载分担,其发送程序为P1、P2、P3、P4、P5、P6,其中P2、P3和P5去往DeviceC,P1、P4、P6去往DeviceD。假如负载分担采纳逐流形式,则去往DeviceC的报文都通过LinkA发送,去往DeviceD的报文都通过LinkB发送;或者去往DeviceC的报文都通过LinkB发送,去往DeviceD的报文都通过LinkA发送。
图1-1 逐流负载分担示意图
如何通过Hash算法实现负载分担
常见的负载分担处理过程蕴含输出(流量、报文的有效字段)、解决(通过Hash算法进行计算)和输入(依据计算结果将流量通过相应的出接口转发)。其中,通过Hash计算的后果会间接影响负载分担的成果,因而如何利用好Hash算法进行计算,在负载分担部署当中就显得尤为重要。
图1-2 Hash算法流程
如图1-2所示,Hash计算的流程如下:
- 获取报文的信息,对于一般的IP报文,为源MAC、目标MAC、源IP、目标IP、VLAN、四层端口号等。依照配置的流量模型,将这些信息作为Hash因子的参考值。
- 依据Hash算法和Seed对Hash因子进行计算,失去Hash Key。
其中,Hash算法是芯片提供固定品种的算法,不同的算法对于不同的流量模型计算的成果不同,有多种算法以供选择,能够通过hash-mode hash-mode-id参数抉择Hash算法。
另外,Seed是一个数值,用于参加计算。在雷同Hash因子的状况下,Seed值会影响计算出的Hash Key的值,通过命令seed seed-data设置Seed值。
- 为了让同一个Hash因子衍生更多的变动,以更加灵便地适应不同的Hash场景,设施芯片能够对Hash Key的值进行0~15位的偏移,能够通过universal-id universal-id参数进行设置Hash Key的值。
- 将Hash Key转化为Offset值,Offset值与进口个数进行取余运算,依据后果决定报文从设施的哪一个接口收回去。
如何解决Eth-Trunk负载分担不均
失常状况下,流量在Eth-Trunk负载分担后,会被调配到多条链路上传输。Eth-Trunk负载分担不均是指流量通过负载分担后,仅被集中调配到一条或者某几条链路上传输,而其余链路无流量或者流量较少的状况。如果单条链路的流量较大,可能会影响业务的失常运行。
成员数量是否为2的N次方
Eth-Trunk每个发送周期有16个发送报文的时隙,Eth-Trunk成员口轮流应用这16个时隙发送报文。
当Eth-Trunk成员口数量是2的N次方时,能够使得负载分担更平均。例如,如果Eth-Trunk成员口数量是2、4或8(能够整除16),每个接口失去的发送报文的时隙是整数,负载分担就平均;如果成员口数量不是2的N次方(比方3个),在16个时隙里有1个接口失去了6次发送报文的机会,另外两个接口只失去5次发送报文的机会,负载分担就不平均。因而,Eth-Trunk成员口数量最好是2的N次方,保障负载分担更平均。
是否存在跨设施重叠
CE交换机在重叠场景下默认开启Eth-Trunk本地优先转发性能,即从本设施进入的流量,优先从本设施的出接口转发进来。本地优先转发能够升高转发延时,升高重叠链路的利用率。
如图1-3所示,SwitchA与SwitchB组成重叠,上下行退出到Eth-Trunk。如果没有本地优先转发,则从SwitchA进入的流量,会有一部分通过重叠线缆,从SwitchB的物理接口转发进来。设施启用本地优先转发之后,从SwitchA进入的流量,优先从SwitchA的接口转发。
图1-3 流量本地优先转发示意图
默认开启本地优先转发的状况下,同框的Eth-Trunk成员口负载分担平均,不同框的Eth-Trunk成员口负载分担不平均。要解决跨设施重叠场景中的不同设施的成员口负载分担不均问题,能够依照以下步骤解决。
- 在任意视图下,执行命令display interface eth-trunk [ trunk-id [ .subnumber ] | main ],查看Eth-Trunk成员口是否跨设施,如重叠场景下不同设施上的接口捆绑成Eth-Trunk端口。
如果Eth-Trunk成员口是跨设施的,去使能Eth-Trunk接口流量本地优先转发性能。即在Eth-Trunk接口视图下,执行命令local-preference disable。
<HUAWEI> system-view [~HUAWEI] interface eth-trunk 10 [*HUAWEI-Eth-Trunk10] local-preference disable [*HUAWEI-Eth-Trunk10] commit
敞开本地优先转发性能后,局部流量会跨设施之间的重叠链路,须要保障该链路带宽足够。
是否存在Hash极化问题
Hash极化,也被称为Hash不均,是指流量通过2次或2次以上Hash后呈现的负载分担不平均的景象。常见于跨设施的屡次Hash场景,即第一级进行Eth-Trunk Hash,第二级再进行ECMP Hash或者Eth-Trunk Hash。在同一设施上,若存在ECMP的出接口为多个Eth-Trunk也可能会呈现Hash极化。
图1-4 Hash极化示意图
如图1-4所示,Switch A的入接口有4种流量,出接口为2条等价链路,经Hash计算,流量1和流量2走下面的链路到Switch B;流量3和流量4走上面的链路到Switch C。在Switch B出接口同样为2条等价链路,若采纳与Switch A雷同或者相似的Hash算法,其Hash的后果将为流量1和流量2走下面的链路,而上面的链路没有流量。Switch C的状况相似。这种通过屡次Hash后,ECMP或者Eth-Trunk各成员口之间流量极度不平均的景象称为Hash极化。
实际上,交换机Hash性能的实现很大水平上取决于芯片,所以当应用同类型芯片的交换机位于网络中相邻的层级时,就可能会呈现Hash极化问题。因而,在多级网络中部署ECMP或者Eth-Trunk负载分担,须要思考呈现Hash极化问题的危险。
解决两级负载分担场景下的哈希极化问题,就是要防止两级设施应用雷同的负载分担参数。
如果流量有多个特色有较大变动时,能够让两级设施采纳不同的哈希因子,比方第一级Eth-Trunk应用源IP进行哈希,第二级应用目标IP进行哈希。
第一级Eth-Trunk应用源IP进行哈希。
<HUAWEI> system-view [~HUAWEI] load-balance profile default [~HUAWEI-load-balance-profile-default] ip src-ip [*HUAWEI-load-balance-profile-default] commit
第二级Eth-Trunk应用目标IP进行哈希。
<HUAWEI> system-view [~HUAWEI] load-balance profile default [~HUAWEI-load-balance-profile-default] ip dst-ip [*HUAWEI-load-balance-profile-default] commit
- 如果调整哈希因子后成果不显著,通过执行命令eth-trunk hash-mode hash-mode-id,调整两级的哈希算法为不同的算法。
- 如果调整哈希算法任然没有成果,通过执行命令eth-trunk universal-id universal-id,调整Eth-Trunk的偏移量universal-id。
流量类型与负载分担模式是否匹配
判断Eth-Trunk接口转发的报文特色和配置的负载分担形式是否匹配。如果不匹配,例如转发报文的MAC地址变动,而设置的负载分担形式为src-ip,则无奈负载分担。
辨认报文类型
- 确定报文的类型。
确定报文为IP报文、MPLS报文、TRILL报文、FCoE报文等。 - 不同报文的负载分担形式。
针对不同类型的报文,能够别离配置负载分担模式。以CE6856HI为例,负载分担形式如表1 不同报文的负载分担形式所示。例如,对于IPv4报文,默认状况下依据源IP、目标IP、目标端口号、源端口号进行负载分担,也能够通过命令行配置负载分担模式。须要获取其余款型的负载分担形式,请参考配置负载分担形式进行配置。
表1-1 不同报文的负载分担形式
配置负载分担形式
- 配置已知单播的负载分担形式
- 执行命令interface eth-trunk trunk-id,进入Eth-Trunk接口视图。
- 执行命令load-balance { dst-ip | dst-mac | random | round-robin | src-ip | src-mac | src-dst-ip | src-dst-mac | enhanced [ resilient ] profile profile-name },配置Eth-Trunk负载分担形式。
用户能够依据流量模型设置不同的负载分担形式来抉择各种负载分担模式,流量中该参数变动越频繁,抉择此负载分担模式的流量就越平衡。例如,在网络中,如果报文的IP地址变动较频繁,那么抉择基于dst-ip、src-ip或src-dst-ip的负载分担模式更有利于流量在各物理链路间正当的负载分担;如果报文的MAC地址变动较频繁,IP地址比拟固定,那么抉择基于dst-mac、src-mac或src-dst-mac的负载分担模式更有利于流量在各物理链路间正当的负载分担。
- 执行命令commit,提交配置。
- 配置未知单播的负载分担形式
- 执行命令load-balance unknown-unicast { mac | enhanced },配置未知单播的负载分担形式。
在网络中,对于未知单播,如果IP报文的源MAC地址或者目标MAC变动较频繁,而IP地址比拟固定,那么抉择参数mac对未知单播进行负载分担;如果IP报文的源IP地址或者目标IP地址变动较频繁,而MAC地址比拟固定,那么抉择参数enhanced对未知单播进行负载分担。
- 执行命令commit,提交配置。