从“金融中心”国贸,到“宇宙中心”五道口是绝大多数北京人都走过的路线,也是北京日常最堵的线路之一。同样的事情还发生再上海的中环路、深圳的深南大道等等一线城市交通之中。为了解决城市热点地区之间的交通问题,每个城市都会在热点地区之间修建多条线路,以保证高峰期的交通不至于瘫痪。
其实,数据中心也面临着相同的情况。尤其在北向流量汇集的网络出口侧,网络拥堵也时常发生。同样的,为解决这一问题,数据中心设计者们也会构建很多与北向出口相连的其他路径。在专业中,这种方式叫等价多路径。
交通系统当中,每个司机都会根据自己自身对道路状况的预判或者导航软件来选择从A到B的不同路径,并由此实现不同道路对车流的共同分担;但在数据中心当中,数据封包或者数据流上并没有一个会思考的“司机”,所以,如何在等价多路径当中实现不同路径的负载均衡就成了一个必须解决的问题。
而Hash——哈希散列正是为了解决这一问题而生。
为了提升业务弹性扩容能力和可靠性,数据中心通常会采用CLOS架构的网络结构。这种结构当中存在二层LACP等价路径、三层ECMP等价路径。
而Hash一般称为哈希散列,是通过交换机或路由器的芯片内置算法将一段任意的输入(通常是一个非常大的集合)转化成一个固定长度输出(通常是一个小的集合)。在网络架构中,这种方法可以用来解决多个等价路径上的负载均衡问题,并由此提升数据中心内的资源利用率。
某款ASIC芯片的Hash流程简示:
ASIC提取报文字段值以及转发端口等信息,由Hash多项式计算出Hash值,再映射到等价路径下一跳。
虽然总体原理相同,但不同的厂商的不同设备均有着不同的Hash实现方法。下面我们就结合Hash的发展阶段,以新华三交换机操作系统为例,来为大家逐一介绍Hash的五种实现方法,以及更高级的智能Hash。
Hash一直随着网络应用的发展而进化,因此,Hash也在不同的阶段出现了五种不同的实现方法。那么下面就让我们来逐一解析。
1. 逐包 Hash与逐流Hash?
逐包Hash转发,不考虑同一特征的流量转发路径的一致性,把所有报文都逐个hash、转发,这样能够做到更均匀的负载分担。但是,在上下游网络组网结构不均衡、时延不均衡的环境中,逐包Hash的数据包会经过不同路径到达目的地,不同路径的时延抖动差异较大,会造成接收方的报文到达乱序,从而影响通信的效率。
而逐流Hash会把同一条流特征的流量(例如五元组:源IP地址、源端口、目的IP地址、目的端口、传输层协议类型),分发到固定一条路径,避免了乱序问题;如果设备Hash转发的N条流的带宽占比没有失衡,则逐流Hash总体是平均的负载分担;但是在大象流和老鼠流的场景,大象流具有少量的流数量却占用大量的带宽,Hash不均衡。
2. 内层Hash
对于GRE、VxLAN等封装报文的Hash,封装的外层字段的信息是固定的,例如SIP/DIP就是隧道的起始设备/终结设备的Loopback IP,不变化,不利于Hash;所以需要设备具有刺探到内层字段(封装之前的原始报文)的能力,通过内层字段进行Hash,保证Hash的均衡性。
3. Hash极化
多组流量经过两次或两次以上的Hash,会出现后续转发设备Hash极化、流量只走一半链路的极化现象,这种现象往往出现在第一次Hash和第二次Hash的设备极为类似(例如同一芯片型号、同样的Hash算法)的情况下。
如下图,第一次Hash时,A设备通过Hash值得mod 2动作把流量分成了两类:Hash值分为为奇数、偶数。到了第二次Hash时,B设备处理的流量的Hash值全部都为奇数,所以全部流量都走左侧链路,留下右侧链路空置。同样,C设备也出现极化,把所有流量都Hash到了右侧链路,留下左侧链路空置。
对于Hash极化现象,通常的处理办法是调整Algorithm算法hash因子,只需微调便可避免第一次和第二次的Hash结果雷同。
在新华三交换机操作系统当中,我们可以通过如下语句来显示可用的Hash算法选项:
[H3C]ip load-sharing mode per-flow algorithm ?
INTEGER<0-13> Specify the algorithm type ID
新华三常用的Hash算法调整:
3: 16 bit crc16 using bisync polynomial
4: upper 8-bits of crc16 and 8-bit xor1
5: upper 8-bits of crc16 and 8-bit xor2
6: upper 8-bits of crc16 and 8-bit xor4
7: upper 8-bits of crc16 and 8-bit xor8
8: 16 bit XOR
9: 16 bit crc16 using ccitt polynomial
10: 16 LSB's of computed CRC32
11: 16 msb's of computed CRC32
4. 对称Hash
对于网络设备,对称Hash指的是:对于同一个业务的来回双向流量,予以分配同宿同源的转发端口。
在某些场景下,例如交换机旁挂两台FW对流量进行安全防护,交换机根据五元组Hash分发流量给两台FW,在两台FW各自为自己负责的流量(占总流量的一半)建立了session;而返程流量到达交换机时将被再次Hash分发,如若返程Hash分发与去程Hash分发不一致(不对称),则FW上会重复建立session,不仅浪费了FW的资源,而且对流量的安全防护做得不够准确。所以在该场景下,需要启用“对称Hash”以保证双向流量走相同的链路。
新华三对称hash设置:
[H3C]ip load-sharing symmetric
5. Hash的弹性自适应能力
在某些场景例如LVS集群场景,可能存在128台服务器与交换机建立等价路由(通过OSPF/BGP协议),业务流量从交换机分发到128台服务器,各台服务器维护了各自流量的session信息,需要稳定的Hash,避免Hash路径频繁变更导致session频繁切换服务器。
采用普通Hash算法时,当等价路径的其中一条或者多条路径失效时,会对所有流量进行重新Hash计算、流量分发,会导致LVS集群业务session全部重建,业务受影响极大,效果见下图。
采用弹性自适应Hash算法时,当等价路径的其中一条或者多条路径失效时,只将失效路径上的业务流量将被重新Hash分发给剩余可用路径,而可用路径上转发的业务流量不做变更,以保持业务的连续性。
[H3C]ecmp mode enhanced
H3C等价路由增强模式:Enhanced模式下,每个等价组具有128个下一跳,用实际的下一跳轮流填写这128个寄存器字段,某个下一跳失效后,它的位置被其他下一跳轮流替代;效果见下图,链路1失效后,它的位置由链路2/3/4轮流填补上。
智能Hash实现的关键在于DLB(Dynamic load balance,动态负载均衡)。DLB突破传统静态Hash机理的限制,通过引入时间戳、实时负载度量(端口带宽负载、队列大小)因子,在时间、带宽空间两个维度优化了负载均衡效果,提供了动态、智能的Hash机制。
传统静态Hash的效果缺陷:
1. 静态时间:静态Hash分配结果固定、终身不变,特定流走特定路径,根据报文特征计算出Hash Value来决定转发路径成员端口,后续不再动态变化,无论该特征的流量是否中断、链路负载是否已经不均衡。
2. 静态带宽空间:静态Hash不关心转发路径的负载轻重程度,主要考虑“流量特征与转发路径”,当各个微观流量带宽差异较大、动态变化时,宏观上则会体现出各转发链路的负载轻重差异较大、负载不均衡状况。典型的例子为,在给大象流与老鼠流分配Hash路径时,同等对待,未度量巨大的带宽差异,造成链路负载不均衡。
在应用流量类型繁多与动态变化的移动互联网时代,动态智能Hash及时出现,弥补了这些缺陷。
H3C的动态智能Hash介绍:
[H3C]ecmp mode eligible
1. 具有一定特征的流量第一次进入设备转发,则被认为是新的流,设备为之创建Flowset;同时为之设置flowset-inactive-time老化计时器,取值范围为16~32000us。
2. 设备在flowset-inactive-time周期内,计算出当前等价路由组中负载较轻的路径,转发该流量,在该周期内,具有相同特征的流量会使用相同的转发路径,并实时刷新flowset-inactive-time老化计时器,维持本Flowset为有效状态(会话保持)。
3. 超过flowset-inactive-time老化时间周期,如若未有流量维持该Flowset有效,则该Flowset记录被老化,即使后续再有该Flowset相同特征的流量到来,设备认为是一个新的流,创建新的Flowset,重新hash到负载较轻的路径。
身处任何一个城市,交通都是一个任何数据中心或基础设施的管理当中,负载均衡都是一个必须解决的关键问题。而伴随数据中心负载类型的多样化,负载均衡的难度和实现方式也会进入全新温度。所以,只要数据中心的算力和应用在变化,负载均衡的实现也会跟着演变。而在这个持续进化的领域当中,Hash的实现同样没有终点。
作为数据中心网络产品技术领域的领航者,新华三在不断的部署实践当中始终关心应用的演变,更重视应用变迁背后所诞生的网络需求变化。
虽然本期Hash与负载均衡故事即将告一段落,但面对永无止境的网络应用,本栏目还将继续以最硬核的方式为您解读网络,窥见未来。