手册下载
H3C数据中心交换机HASH负载分担专题-6W100-整本手册.pdf (456.89 KB)
H3C数据中心交换机HASH负载分担专题
S12500X-AF/S12500F-AF(H系列单板)
S12500R(H系列单板、K系列单板)
S6890
S6800/S6860
S6805/S6825/S6850/S9850
S9820-64H/S9820-8C
资料版本:6W100-20230626
Copyright © 2023 新华三技术有限公司 版权所有,保留一切权利。 非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部, 并不得以任何形式传播。本文档中的信息可能变动,恕不另行通知。 |
3.1 S12500X-AF(H系列)、S12500F-AF、S12500R(H系列、K系列)、S6890负载分担算法简介
3.2 S6800、S6860、S6805、S6825、S6850、S9850、S9820负载分担算法简介
5.4 跨IRF成员设备ECMP或聚合是否开启了本地优先转发功能
6.4 动态负载分担(DLB,Dynamic load balance,动态负载均衡)
哈希(Hash),也称为散列,是把任意长度的输入通过散列算法变换成固定长度的输出,该输出称为散列值。这种转换是一种压缩映射,即散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,通过输出值无法得出输入值。
哈希机制在交换机上主要有两方面的应用:
· 存储表项时计算Hash桶位置;
· 负载分担选路。
本文主要介绍报文/数据流负载分担选路相关内容。负载分担选路主要包括IP报文等价路由负载分担选路和聚合成员端口负载分担选路。
等价路由ECMP(Equal-Cost Multi-Path routing)是同一路由协议发现的、目的地址和开销值都相同的多条路由。匹配等价路由的流量可以在多条路径上实现负载分担,这不仅增加了传输带宽,并且可以无时延无丢包地备份失效链路的数据传输,从而提升了网络的可靠性。
以太网链路聚合通过将多条以太网物理链路捆绑在一起形成一条以太网逻辑链路,实现增加链路带宽的目的,同时这些捆绑在一起的链路通过相互动态备份,可以有效地提高链路的可靠性。聚合接口转发报文时可以在多条聚合成员端口之间进行负载分担。
图2-1 等价路由/聚合负载分担图示
设备转发匹配等价路由的报文或聚合接口转发报文时有两种负载分担方式:
· 按照报文接收顺序逐包分配到不同路径转发。使用该方式需要注意同一个数据流的多个数据包的转发路径可能不同,因此接收端可能会出现报文乱序的问题,在该模式下需确保接收端支持报文乱序重组的功能。
· 逐流转发:根据报文中的信息(如源IP地址、目的IP地址、源端口、目的端口、IP协议号和入端口)进行逐流负载分担。报文信息相同的报文会被分配到同一条链路进行转发。
图2-2 逐包负载分担
图2-3 逐流负载分担
交换机通过Hash算法实现负载分担的主要步骤有:
· 获取输入值,如Hash因子;
· 进行Hash计算;
· 根据Hash计算结果得到ECMP或者聚合的出接口。
按照Hash算法是否相似,可以将数据中心交换机分为两组,同组设备Hash算法相似:
· S12500X-AF、S12500F-AF、S12500R(H系列、K系列)、S6890为一组;
· S6800、S6860、S6805、S6825、S6850、S9850、S9820为一组。
S12500X-AF(H系列)、S12500F-AF、S12500R(H系列、K系列)、S6890 Hash计算的主要步骤如下:
(1) 根据设备配置选取报文信息作为Hash因子(如源MAC、目的MAC、源IP、目的IP、协议号)
(2) 根据Hash因子和设备配置的Hash算法进行计算,得到16 bit的Hash Key。
(3) 某些特征的流量计算出的Hash Key高位变化少,此时会出现明显的Hash不均,可以通过设置Shift(Hash key循环移位)解决。
(4) 通过offset = (key * size ) >> 16计算出接口。Size表示出接口数据,即等价路径条数或聚合选中端口数目。>>表示右移16位。
图3-1 S12500X-AF、S12500F-AF、S12500R(H系列、K系列)、S6890负载分担算法
表3-1 算法说明
命令行算法编号 |
算法说明 |
ECMP 0~5 聚合1~6 |
分别对应芯片6种不同的Hash算法,无法与流量特征建立详细对应关系,Hash不均时可以逐个切换尝试 需要注意ECMP 0和聚合1的算法是相同的,ECMP 1和聚合2的算法是相同的,依此类推,请勿将ECMP和聚合的算法配置为相同算法,否则可能出现Hash极化现象 |
ECMP 6~9 聚合7~10 |
芯片实际支持6种算法,这几个算法和前面编号的算法重复,命令行取值范围为了兼容老产品和老版本没有作修改 设置这几种算法时,设备默认设置的Shift值和前面编号的算法不同,因此设置这几种算法时相对前面编号的算法也有Hash结果的变化,Hash不均时也可以切换这几种算法尝试 |
ECMP 10 聚合 11 |
逐包Hash算法,可能引起报文乱序,不建议用户配置 |
ECMP 11~15 |
为特殊场景测试保留,适用只设置一个Hash因子字段,分别有2/4/8/16/32条等价路径的场景 不建议用户配置 |
上表中ECMP x表示ip load-sharing mode per-flow algorithm x配置的算法。聚合x表示link-aggregation global load-sharing algorithm x配置的算法。
S6800、S6860、S6805、S6825、S6850、S9850、S9820系列交换机ECMP和聚合负载分担计算流程类似:.
(1) 首先根据报文以太类型选择进行Hash计算的报文域(Field Selection)。Field Selection分为A和B两种,聚合使用Field Selection A,ECMP使用Field Selection B。
Field Selection A和Field Selection B都能生成一个有13个Hash bins组成的集合(这些集合包含了参加Hash计算的报文特征域);每一个Hash bin有16 bits宽。这13个hash bins总共有13*16 bits = 208bits。
(2) 基于208bits的Hash bins,根据配置的负载分担算法计算出ECMP的Hash结果(Hash B0和Hash B1)和聚合的Hash结果(Hash A0和Hash A1)。
我们无法为Hash算法和流量特征建立详细对应关系。Hash不均时,可以尝试调整Hash算法、调整seed值、调整shift值改变Hash计算结果Hash A0、Hash A1、Hash B0、Hash B1的值。
(3) 如图3-3所示:Hash A0(16bits)、Hash A1(16bits)、Hash B0(16bits)、Hash B1(16bits)、LBN(通过Ingress Port得到,4bits)、Destination Port(7bits,我司保留使用)、LBID(Load Balance ID,8bits)结合得到83bits的Hash Key,ECMP和聚合从83bits中选择子集进行出接口计算。
(4) 通过offset公式计算出接口。具体请参见图3-2。offset = ((hash value & 65535) % (ecmp_count + 1)) & 0x3FF。其中hash value & 65535是为了保证Hash值在有效取值范围内。& 0x3FF是为了保证出接口编号在有效取值范围内。
图3-2 S6800、S6860、S6805、S6825、S6850、S9850、S9820 ECMP负载分担算法
图3-3 S6800、S6860、S6805、S6825、S6850、S9850、S9820 Hash Key计算方法
在负载分担不均时,可以通过调整Hash算法、seed值、shift值调整Hash计算结果。
表3-2 Hash负载分担调整命令
调整项目 |
ECMP Hash |
聚合Hash |
Hash因子 |
ip load-sharing mode |
S12500X-AF(H系列)、S12500F-AF、S12500R(H系列、K系列)、S6890: · link-aggregation global load-sharing mode(系统视图) · link-aggregation load-sharing mode(接口视图) S6800/S6860/S6805/S6825/S6850/S9850/S9820-64H/S9820-8C有两种方法,建议采用方法一: 方法一: · link-aggregation load-sharing ignore 方法二(本调整方法对广播报文无效): · link-aggregation global load-sharing mode(系统视图) · link-aggregation load-sharing mode(接口视图) 采用方法二调整Hash因子后,聚合的Hash计算过程会发生较大的变化,变化后的计算方式不是推荐的计算方式 |
Hash算法 |
ip load-sharing mode per-flow algorithm |
link-aggregation global load-sharing algorithm |
Seed 当网络中存在多个厂商设备时,建议不同厂商配置为一致 |
ip load-sharing mode per-flow algorithm algorithm-number seed seed-number |
link-aggregation global load-sharing seed |
Shift 当网络中存在多个厂商设备时,建议不同厂商配置为一致 |
ip load-sharing mode per-flow algorithm algorithm-number shift shift-number |
link-aggregation global load-sharing offset (本命令行里的offset相当于图3-1中的Shift) S12500R不支持本配置 |
表3-3 S12500X-AF(H系列)、S12500F-AF、S12500R(H系列、K系列)、S6890 Hash负载分担缺省值和取值范围
项目 |
缺省值 |
取值范围 |
Hash因子 |
ECMP:dest-ip、 dest-port、ingress-port(S12500R不支持)、ip-pro、src-ip、src-port、flow-lab 聚合: 按照报文类型自动选择所采用的聚合负载分担类型: 转发二层报文时: · 如果存在IP头,则采用的聚合负载分担类型包括源MAC地址、目的MAC地址、源IP地址、目的IP地址、源服务端口、目的服务端口和协议号 · 如果不存在IP头,则采用的聚合负载分担类型包括源MAC地址、目的MAC地址 转发三层报文时,采用的聚合负载分担类型包括源IP地址、目的IP地址、源服务端口、目的服务端口和协议号 |
ECMP:dest-ip、 dest-port、flow-label、ingress-port(S12500R不支持)、ip-pro、src-ip、src-port 聚合:destination-ip、destination-mac、destination-port、ingress-port(S12500R不支持)、ip-protocol、source-ip、source-mac、source-port |
Hash算法 |
ECMP:0 聚合:4 |
ECMP:0~15 聚合:1~11 |
Seed |
ECMP:0 聚合:0x1 |
ECMP:0-FFFF 聚合:0-FFFF |
Shift |
ECMP:0 聚合:0 |
ECMP:0~15 聚合:0~15 |
对于S12500X-AF(H系列)、S12500F-AF、S12500R(H系列、K系列)设备:等价路由和聚合hash选项使用相同的IP五元组寄存器,因此后配置的命令生效,建议用户对等价路由和聚合都进行相同的IP五元组配置。
表3-4 S6800/S6860/S6805/S6825/S6850/S9850/S9820-64H/S9820-8C Hash负载分担缺省值和取值范围
项目 |
缺省值 |
取值范围 |
Hash因子 |
ECMP:dest-ip、 dest-port、ingress-port、ip-pro、src-ip、src-port 聚合: 二层报文:destination-mac address、source-mac address、ethernet-type 三层报文:destination-ip address、source-ip address、 destination-port、source-port、ip-protocol |
ECMP:dest-ip、 dest-port、flow-label、ingress-port、ip-pro、src-ip、src-port 聚合:destination-ip、destination-mac、destination-port、ingress-port、mpls-label1、mpls-label2、source-ip、source-mac、source-port 对于S6805/S6825/S6850/S9850/S9820-64H:Hash因子的配置仅对已知单播报文生效 |
Hash算法 |
ECMP: S6800/S6860:未进行任何配置时算法编号为8,配置过算法再执行undo ip load-sharing mode命令后,算法编号为0),请通过display ip load-sharing mode命令查看当前生效的算法 S6805/S6825/S6850/S9850/S9820:8 聚合: S6800/S6860:5 S6805/S6825/S6850/S9850/S9820:0 |
ECMP: S6800/S6860:0~8 S6805/S6825/S6850/S9850/S9820:0~13 聚合: S6800/S6860:1~8 S6805/S6825/S6850/S9850/S9820:1~13 |
Seed |
ECMP:0 聚合:0x0 |
ECMP:0-FFFFFFFF 聚合:1-FFFFFFFF |
Shift |
ECMP:0 聚合:0 |
ECMP: S6800/S6860:0~63 S6805/S6825/S6850/S9850/S9820:0~15 聚合:1~63 |
配置ECMP和聚合的负载分担方式时,需要根据报文类型(如IPv4、MPLS、VXLAN)做相应配置。
图4-1 不同类型报文的负载分担方式
报文类型 |
建议负载分担方式 |
IPv4报文/IPv6报文 |
一般情况下采用缺省的哈希因子配置即可,Hash不均时可以分析流量特征,调整为变化丰富的项目 |
IPv4/IPV6组播报文 |
ECMP不涉及,配置ECMP哈希不影响组播报文 聚合可以调Hash算法,一般情况下使用缺省配置即可 |
MPLS报文 |
Ingress/Egress节点:根据原始报文信息进行负载分担 Transit节点: S12500X-AF(H系列)/S12500F-AF/S12500R(H系列)/S6890:三层报文根据MPLS Label+IP信息+L4 Port信息进行Hash,二层报文不能Hash S6800/S6860/S6805/S6825/S6850/S9850/S9820-64H/S9820-8C:三层报文根据MPLS Label+IP信息进行Hash,二层报文根据MPLS Label进行Hash S12500R(K系列)Transit节点的负载分担方式待验证 |
二层报文(非IPv4、非IPv6、非MPLS) |
destination-mac address、source-mac address、ethernet-type或destination-mac address、source-mac address |
隧道报文(GRE报文等) |
对于GRE、IPinIP等封装报文,由于封装的外层字段的信息是固定的,例如源IP地址和目的IP地址就是隧道的起始设备和终结设备的Loopback接口的IP地址,不发生变化,不能进行合理的负载分担。此时可以通过下面命令配置设备根据报文内层信息或内层和外层信息进行负载分担 ECMP:ip load-sharin mode per-flow tunnel { all | inner | outer } 聚合:link-aggregation global load-sharing tunnel { all | inner | outer } all参数的支持情况与设备型号有关,请以设备实际情况为准 |
VXLAN报文 |
加封装、解封装的设备根据原始报文进行负载分担。过路报文可以根据报文外层或者内层信息负载分担。下面命令可以调整过路报文的哈希方式: ECMP:ip load-sharin mode per-flow tunnel { all | inner | outer } 聚合:link-aggregation global load-sharing tunnel { all | inner | outer } all参数的支持情况与设备型号有关,请以设备实际情况为准 对于S12500X-AF(H系列)、S12500F-AF、S12500R(H系列、K系列)、S6890:过路报文Hash建议使用all参数 |
我们希望流量能较为均匀的分配到等价路由的多条路径或者聚合的多个成员端口转发,如果出现流量集中到1条或者其中几条路径转发,其他路径分配到很少的流量或者没有流量,即发生了负载分担不均。负载分担不均时,一是影响链路利用率,二是负载大的链路可能会发生业务异常。
优先调整本地ECMP或聚合Hash;本地调整无效时,调整上级设备的ECMP Hash算法,同时注意对下级设备的Hash影响。
建议按如下步骤调整:
(1) 排除Hash极化问题。Hash极化的处理建议请参考5.3 HASH极化。
(2) 调整哈希因子:
总体原则为分析流量变化的因子,将Hash因子配置为变化丰富的项目,例如转发报文的MAC地址变化,而设置的负载分担方式为source-ip,则无法负载分担。另外分析流量从多个端口进入的还是从单个端口进来的,如果是从多个端口进入,可以增加ingress port作为Hash因子。
(3) 调整Hash算法。
(4) 调整Seed值。
(5) 调整Shift值。
(6) 调整成员口数量,建议成员口总数为2的N次方。
Hash因子、Hash算法、Seed值、Shift值的配置方法请参考表3-2。
Hash极化是指流量进行2次或2次以上Hash后出现的Hash不均匀的情况。如下情况中可能出现Hash极化:
· 第一级设备进行ECMP Hash,第二级再设备进行ECMP Hash;
· 第一级设备进行ECMP Hash,第二级进行聚合Hash;
· 同一级设备,ECMP路径的其中一条或多条路径的出接口是聚合接口,流量先进行ECMP Hash,再进行聚合Hash。
如图5-1所示,SW1接收了2条流量,根据设备的负载分担配置可以将流量均匀的Hash到2个出接口。流量1(绿色标识)到达SW2后,如果SW2计算负载分担的方式和SW1一致或相似,可能出现流量仅Hash到部分接口,另外一部分接口完全Hash不到流量或流量很少的情况。SW3的情况类似。
(1) 多级设备组网中,相邻级别设备避免采用Hash算法相同和相似的设备。
按照Hash算法是否相似,可以将数据中心交换机分为两组,同组设备Hash算法相似:
¡ S12500X-AF、S12500F-AF、S12500R(H系列、K系列)、S6890为一组;
¡ S6800、S6860、S6805、S6825、S6850、S9850、S9820为一组。
例如:第二级设备为S6850,第一级设备为S12500X-AF,Hash极化风险低;第一级设备为S6850,第二级设备为S9820-8C,Hash极化风险高。
(2) 多级设备组网中,第一次Hash和第2次Hash配置不同的Hash算法/Hash因子。例如第一级设备采用算法1,第二级设备采用算法4;第一级设备基于源IP负载分担,第二级设备基于目的IP负载分担。
(3) 第1次Hash和第2次Hash的出接口数目互质
例如:第1级设备进行聚合Hash,存在2条物理出接口,第2级设备进行ECMP Hash,存在3条物理出接口,2和3互质。
跨IRF成员设备ECMP或聚合的转发流程如图5-2所示。ECMP或聚合采用本地优先转发时,本地设备出接口间可以负载均匀,不同设备间成员口负载不均匀。ECMP或聚合关闭本地优先转发时,流量可在所有成员设备的出接口间负载均匀。但是由于部分报文会经过IRF链路再转发,会增加IRF物理链路负担。
数据中心交换机的ECMP和聚合本地优先转发功能缺省处于开启状态。
ECMP和聚合本地优先转发功能配置命令如下,需要时可以调整配置。
· ip load-sharing local-first enable(系统视图)
· link-aggregation load-sharing mode local-first(系统视图)
图5-2 跨IRF成员设备ECMP或聚合负载分担转发流程
增加ECMP等价路径数目,或者聚合成员端口数量也可以改变负载分担结果。增加接口数量时,建议接口总数目为2的N次方。2的N次方个出口与报文发送周期的时隙更匹配,可以使负载分担更均匀。
等价路由增强模式和普通模式采用相同的HASH算法基于数据流选择链路,区别在于某条链路故障时:
· 普通模式会在剩余路径上重新分配所有的业务流量。这样可能会导致流量的转发路径发生变化,影响需要保持会话的业务。
· 增强模式只会重新分配故障链路上的流量。可以保证正常链路上的流量不受影响。
图6-1 正常情况下流量负载分担
图6-2 普通模式下,出现链路故障时,流量在所有可用路径重新分配
图6-3 增强模式下,出现链路故障时,仅故障链路的流量重新分配
等价路由增强模式配置命令为ecmp mode enhanced(系统视图)。
聚合弹性负载分担和等价路由增强功能类似,用于实现在聚合成员链路增加或减少时,尽量少的切换链路上的流量,只有部分流量进行链路切换。
例如,有一个聚合组中包含3条成员链路,根据聚合负载分担进行数据转发,其中一条链路故障无法转发数据时:
· 未配置弹性负载分担情况下另外两条链路会重新分配流量。
· 配置了弹性负载分担,另外两条链路上之前分配的流量不会发生变化,只是将故障链路上的流量大致均匀地分配到这两条链路上,这样对业务造成的影响较小。
当故障链路恢复后,会从这两条链路卸载一部分流量到故障恢复的这条链路上,各链路的流量分配和故障前流量分配也不会完全一致。
采用弹性负载分担后,如果链路没有增加或减少,则根据聚合缺省的负载分担方式对流量进行负载分担。
聚合弹性负载分担配置命令为:link-aggregation load-sharing mode resilient(聚合接口视图)。
仅S6800、S6860、S6805、S6825、S6850、S9850系列产品支持本功能。
开启对称Hash功能后,同一条数据流的往返报文将负载分担到同一条路径。
在某些场景下,例如交换机旁挂两台Firewall对流量进行安全防护,交换机Hash流量给两台Firewall,两台Firewall各自为自己负责的流量(占总流量的一半)建立了session;返程流量到达交换机时将被再次Hash分发,如若返程Hash分发与去程Hash分发不一致(不对称),则Firewall上会重复建立session,不仅浪费了Firewall的资源,而且对流量的安全防护做得不够准确。在该场景下,需要启用“对称Hash”以保证双向流量走相同的链路。
图6-4 交换机旁挂防火墙上行流量和下行流量对称Hash(一)
图6-5 交换机旁挂防火墙上行流量和下行流量对称Hash(二)
对称Hash的配置命令为ip load-sharing symmetric enable(系统视图)。
静态负载分担选路结果和报文特征绑定,不能根据实际的转发情况和链路负载情况变化。例如:
· 相同特征的流量总是选固定路径,不考虑符合特征的数据流是否已经停止发送。
· 不考虑链路的实际负载情况,当流量大小差异较大时可能较不均衡。典型情况如大象流和老鼠流同等对待,大象流所走路径负载较大。
动态负载分担通过引入时间戳、实时负载度量(端口带宽负载、队列大小)因子,在时间、带宽空间两个维度优化了负载均衡效果,提供了动态、智能的Hash机制。
动态负载分担有三种模式:
· Eligibility模式
· Spray模式
· 固定模式(Fixed模式)
Eligibility模式下,同一个数据流中时间间隔小于等于flowset-inactive-time的报文组成一个FlowSet。设备基于FlowSet选取当前负载较轻的成员链路进行转发,同一FlowSet中的数据包的转发链路相同。具体过程如下:
(1) 具有一定特征的流量第一次进入设备转发,则被认为是新的流,设备为之创建Flowset;同时为之设置flowset-inactive-time老化计时器。
(2) 设备在flowset-inactive-time周期内,计算出当前等价路由组中负载较轻的路径,转发该流量,在该周期内,具有相同特征的流量会使用相同的转发路径,并实时刷新flowset-inactive-time老化计时器,维持本Flowset为有效状态(会话保持)。
(3) 超过flowset-inactive-time老化时间周期,如若未有流量维持该Flowset有效,则该Flowset记录被老化,即使后续再有该Flowset相同特征的流量到来,设备认为是一个新的流,创建新的Flowset,重新hash到负载较轻的路径。
图6-6 Eligibility模式
Spray模式采用逐包负载分担机制,设备基于数据包选取当前等价路由组中负载最轻的路径进行转发。同一个数据流的多个数据包的转发链路可能不同,因此接收端可能会出现报文乱序的问题,在该模式下需确保接收端支持报文乱序重组的功能。
图6-7 Spray模式
固定模式会为数据流的第一个数据包选择负载较轻的路径,同一个数据流的后续数据包使用第一个数据包的转发路径。
图6-8 固定模式(Fixed模式)
ECMP动态负载分担配置命令为:ecmp mode { eligible [ flowset-inactive-time flowset-inactive-time ] | fixed | spray }。仅S6805/S6825/S6850/S9850/S9820-64H/S9820-8C交换机支持。
聚合动态负载分担的配置命令为:link-aggregation load-sharing mode dynamic { eligible [ flowlet-gap-time flowlet-gap-time ] | fixed | spray }。仅S6805/S6825/S6850/S9850/S9820-64H/S12500R交换机支持。