简介
本文档介绍端口通道负载均衡中可能出现极化的场景,并提供如何防止极化的建议。
先决条件
要求
Cisco 建议您了解以下主题:
使用的组件
本文档不限于特定的软件和硬件版本。
本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您的网络处于活动状态,请确保您了解所有命令的潜在影响。
背景
极化是散列算法选择网络中的特定路径而未使用冗余路径的问题。
拓扑
配置
N7K1和N7K2在VPC中连接,Po100、Po200、Po300和Po301在VPC端口通道中。
N7K1和N7K2充当纯L2交换机,这些交换机上不会发生路由。
所有交换机都运行相同的端口通道负载均衡算法。
从N7K1和N7K2发出的流量出现极化问题,无论从源到目的地的流量是否位于同一个VLAN中(无路由),也不管它们是否位于不同的VLAN中(路由发生在N7K3或N7k4上)。
流量传输
源设备向目的设备发送多个数据流(使用多个源和目的IP地址,L4端口信息也因数据包而异)。使用良好的流量混合可确保理想情况下流量在端口通道成员接口之间均匀分布。
来自源的流量到达N7k3/N7k4,然后通过N7K1/N7K2到达目的地。
N7K1和N7K2上Po100和Po200的成员链路中的一个链路发出几乎99%的流量,另一个链路保持空闲。也就是说,在每台交换机N7K1和N7K2上,4/2和4/3中的一个链路传输99%的单播流量,而另一个链路传输不到1%。同样,9/2和9/3之间的一条链路可传输99%的流量,而另一条链路的传输流量不到1%。故障排除部分的输出显示N7K1上Po100和Po200成员接口上的流量。在N7K2上可以看到类似的输出。
无论使用的端口通道负载均衡算法的类型如何,只要N7K1/N7K2对和N7K3/N7K4对上使用相同的端口通道负载均衡算法,即可发现此问题。用于检查端口通道负载均衡算法的命令如下所示:
N7K1# show port-channel load-balance
Warning: Per Packet Load balance configuration has higher precedence
System config:
Non-IP: src-dst mac
IP: src-dst ip-l4port-vlan rotate 0
Port Channel Load-Balancing Configuration for all modules:
Module 1:
Non-IP: src-dst mac
IP: src-dst ip rotate 0
Module 2:
Non-IP: src-dst mac
IP: src-dst ip rotate 0
Module 3:
Non-IP: src-dst mac
IP: src-dst ip rotate 0
Module 4:
Non-IP: src-dst mac
IP: src-dst ip-l4port-vlan rotate 0
Module 7:
Non-IP: src-dst mac
IP: src-dst ip-l4port-vlan rotate 0
Module 8:
Non-IP: src-dst mac
IP: src-dst ip-l4port-vlan rotate 0
Module 9:
Non-IP: src-dst mac
IP: src-dst ip-l4port-vlan rotate 0
故障排除
如果端口通道出现负载均衡不均衡,则可能是由于极化。
当流量到达N7K3和N7K4交换机时,将通过N7K4的Po301和N7K3的Po300将它们转发到N7K1/N7K2交换机。在这里,负载均衡算法生效,一些流转发到N7K1,其他流转发到N7K2。
最初,所有流量进入eth1/1上的交换机N7K3/N7K4,根据src-dst IP地址和l4端口信息,在指向N7K1的链路上散列某些流,在指向N7K2的链路上散列其他流。哈希根据交换机计算出的rbh值来完成。为简单起见,让我们假设根据使用的负载均衡算法,交换机将传入流量分成两个流(流X和流Y)。流X从一个端口通道成员链路发出,流Y从另一个端口通道成员链路发出。
现在,当流量落在N7K1/N7K2对上时,可能存在两种可能性。(考虑X和Y可以互换。)
案例1:
N7K3将流X发送到N7K1并将流Y发送到N7K2
N7K4将流Y发送到N7K1并将流X发送到N7K2
案例2:
N7K3将流X发送到N7K1并将流Y发送到N7K2
N7K4将流X发送到N7K1并将流Y发送到N7K2
在情况1中,N7K1和N7K2接收两种类型的流(流X和流Y),即使在使用与N7K3/N7K4相同的端口通道负载均衡算法之后,也不会看到极化,因为流会从不同链路上的Po100和Po200外出。因此,我们看到端口通道成员接口之间的流量分配更佳。
在例2中,N7K1仅接收流X,N7K2仅接收流Y,如果这些交换机上使用的端口通道负载均衡算法与N7K3/N7K4对中使用的算法相同,则这会导致极化。由于N7K1和N7K2使用相同的端口通道负载均衡算法,因此N7K1仅在Po100/Po200的一个成员链路上发送流X,而另一个成员链路不转发任何流量。同样,N7K2只在Po100/Po200的一个成员链路上发送流Y,而另一个成员链路不转发任何流量。
由于交换机N7K1和N7K2接收的流量已分类为begin,因此仅使用一个端口通道成员链路将所有传入流量从交换机N7K1/N7K2发送出去,而不会从另一个成员链路发送任何流量。如果传入流量速率超过单端口通道链路的带宽,则其他端口通道成员链路不会转发此流量,因此可以丢弃额外的流量。
当port-channel中使用两个以上的链路时,也会出现类似问题。例如,如果端口通道中使用四个链路,则根据发生的散列情况,要么不会发生极化,要么会看到部分极化,即四个端口通道成员链路中只有两个将用于转发所有传入流量。其他两个链接不会转发任何内容
极化是由设计引起的,因此对设计进行分析以确保不存在极化。输出表明N7k1上的Po100和Po200上发生极化(类似的输出也可以在N7K2上看到)。
N7K1# show port-channel summary | i 200
200 Po200(SU) Eth LACP Eth9/2(P) Eth9/3(P)
N7K1# show port-channel traffic interface port-channel 200
NOTE: Clear the port-channel member counters to get accurate statistics
ChanId Port Rx-Ucst Tx-Ucst Rx-Mcst Tx-Mcst Rx-Bcst Tx-Bcst
------ --------- ------- ------- ------- ------- ------- -------
200 Eth9/2 0.0% 99.99% 44.44% 4.00% 0.0% 100.00%
200 Eth9/3 0.0% 0.00% 55.55% 96.00% 0.0% 0.0%
N7K1# show port-channel summary | i 100
100 Po100(SU) Eth LACP Eth4/2(P) Eth4/3(P)
N7K1# show port-channel traffic interface port-channel 100
NOTE: Clear the port-channel member counters to get accurate statistics
ChanId Port Rx-Ucst Tx-Ucst Rx-Mcst Tx-Mcst Rx-Bcst Tx-Bcst
------ --------- ------- ------- ------- ------- ------- -------
100 Eth4/2 0.0% 99.99% 40.55% 7.00% 0.0% 100.00%
100 Eth4/3 0.0% 0.00% 54.44% 93.00% 0.0% 0.0%
解决方法
本节介绍一些用于确保不会发生极化的解决方法。
- 正确设计:由于极化的主要原因是设计不当,因此最好确保我们更改网络设计,以确保拓扑中没有出现极化的余地。
如果对设计无法进行更改,我们可以执行以下操作。
- 在交换机的每个级别上使用不同的端口通道负载均衡算法(N7K1/N7k2对使用一种算法,N7K3//N7k4对使用另一种算法)。当负载均衡算法更改时,N7k1/N7k2交换机现在会根据除N7k3/N7k4交换机所用的信息以外的某些其他信息对传入流量进行散列。因此,传出流量使用所有端口通道成员链路。(选择哪种算法取决于交换机接收的流量类型。)
- 如果要使用相同的负载均衡算法,请在交换机的每个级别使用不同的轮换值。
rotate 命令通过用用户配置的字节偏移散列输入,在散列算法中引入随机性,有助于避免极化。(对于N7k1/N7k2对,使用不同的旋转值;对于N7k3/N7k4对,使用不同的旋转值。)