具体实施方式
为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本发明所述方案作进一步地详细说明。
参见图1,图1为本发明实现聚合口负载分担流程图。具体步骤为:
步骤101,交换机检测各聚合口的转发缓存水位,将转发缓存水位小于预设值的聚合口的状态标识为空闲状态,将缓存水位大于预设值的聚合口的状态标识为繁忙状态,并分别为当前每个状态为空闲状态的聚合口分配唯一的映射值,其中,繁忙状态的聚合口不分配映射值。
步骤102,交换机收到新流量转发请求时,根据当前状态为空闲状态的聚合口的个数,并采用哈希算法计算出哈希值,将计算出的哈希值与为聚合口分配的映射值进行匹配,将匹配到的映射值对应的聚合口作为目的聚合口,并将接收到的新流量从目的聚合口转发出去。
这里对各聚合口的检测,可以是实时检测,也可以根据实际需要自行设置检测周期进行周期检测。如果当前状态为繁忙状态的聚合口已分配过映射值,将已分配的映射值删除。
交换机在检测各聚合口的转发缓存水位时,将转发缓存水位大于预设告警值的聚合口的状态标识为负载分担繁忙状态,如果当前状态为负载分担繁忙状态的聚合口已分配过映射值,将已分配的映射值删除,根据当前状态为空闲状态的聚合口的个数,并采用哈希算法计算出哈希值,将计算出的哈希值与为当前聚合口分配的映射值进行匹配,将匹配到的映射值对应的聚合口作为第一负载分担聚合口,将第一负载分担聚合口的状态标识为负载分担空闲状态,将已为第一负载分担聚合口分配的映射值删除,将当前状态为负载分担繁忙状态的聚合口正在转发的全部流量切换到第一负载分担聚合口转发出去;并分别为当前每个状态为空闲状态的聚合口分配唯一的映射值。
这里在检测到聚合口的状态变化,或从空闲聚合口中选择出聚合口都要重新进行标识就重新标识,并将已分配的映射值删除。并且重新给当前状态为空闲状态的聚合口分配映射值,其它状态的聚合口不分配映射值。
交换机在检测各聚合口的转发缓存水位时,若检测到第一负载分担聚合口的转发缓存水位大于预设告警值时,将第一负载分担聚合口的状态标识为负载分担繁忙状态;且检测到当前状态为负载分担繁忙状态的聚合口的转发缓存水位未达到预设值,将状态为负载分担繁忙状态的聚合口的状态标识为负载分担空闲状态,将当前第一负载分担聚合口正在转发的流量切换回与第一负载分担聚合口负载分担同一流量转发的当前状态为负载分担空闲状态的聚合口转发出去。
这里描述的是该流量由这两个聚合口转发已经足够,检测这两个参与负载分担的聚合口转发缓存水位,总是将流量从状态为负载分担繁忙的聚合口切换到状态为负载分担空闲的聚合口进行轮流转发。
交换机在检测各聚合口的转发缓存水位时,若检测到第一负载分担聚合口的转发缓存水位大于预设告警值时,将第一负载分担聚合口的状态标识为负载分担繁忙状态;且检测到当前状态为负载分担繁忙状态的聚合口的转发缓存水位大于预设值时,根据当前状态为空闲状态的聚合口的个数,并采用哈希算法计算出哈希值,将计算出的哈希值与为当前聚合口分配的映射值进行匹配,并将匹配到的映射值对应的聚合口作为第二负载分担聚合口,将确定的第二负载分担聚合口的状态标识为负载分担空闲状态,将已为当前确定的目的聚合口分配的映射值删除,将第一负载分担交换机正在转发的全部流量切换到确定第二负载分担聚合口;并分别为当前每个状态为空闲状态的聚合口分配唯一的映射值。
这里描述的是该流量由两个聚合口转发,还是会溢出,这样就需要再选择一个空闲的聚合口继续分担该流量的转发,以此类推,直到可以将该流量完全转发出去,不会发生丢包。
交换机在检测自身各聚合口的转发缓存水位时,如果在预设时间检测到状态为负载分担空闲状态的聚合口的转发缓存水位都未达到预设值时,将状态为负载分担空闲状态的聚合口的状态标识为空闲状态,并分别为当前每个空闲状态的聚合口重新分配唯一的映射值。也就是说参与某一流量负载分担的聚合口在预设时间没有流量切换到该聚合口进行转发,或则未再收到该流量,则把这样的聚合口退出负载分担,并将状态直接标识为空闲状态,分配映射值,以备参与新流量的转发。
下面参见附图,并举具体实施例,来详细描述本发明实现交换机聚合口负载分担过程。
通过检测各聚合口转发缓存水位,判断各聚合口是否还有能力对新流量进行转发。本实施例中分别以01、00、11和10标识聚合口的繁忙、空闲、负载分担繁忙和负载分担空闲四个状态。
如果转发缓存水位大于预设值则表明该聚合口转发能力达到上限,将该聚合口的状态标识为繁忙状态,用01表示,不为该聚合口分配映射值,这里所分配的映射值是哈希运算出的哈希值能够匹配到的值。其中,预设值可以根据经验进行设置,比如80%。
如果转发缓存水位未达到预设值,表明聚合口还有转发能力,将聚合口的状态标识为空闲状态,用00表示,并分配映射值。
当一个聚合口的带宽无法满足流量的转发需要时,会选择多个聚合口轮流进行转发,对该流量进行负载分担。参与负载分担的聚合口检测转发缓存水位大于预设值时,则表明暂时无法转发更多流量,将该聚合口的状态标识为负载分担繁忙状态,用11表示,且不为该聚合口分配映射值。
当一个聚合口的带宽无法满足流量的转发需要时,会选择多个聚合口轮流进行转发,对该转发流量进行负载分担。参与携带相同源MAC和目的MAC的流量的负载分担的聚合口转发缓存水位未达到预设值时,表明该聚合口还有转发能力,将该聚合口的状态标识为负载分担空闲状态,用10表示,且不为该聚合口分配映射值,但负载分担的转发流量可从此聚合口转发。
参见图2,图2为四网口组网示意图。图2中,交换机202和存储设备201通过4口bonding聚合连接,四个聚合口分别为:聚合口Eth 1/0/9、Eth 1/0/13、Eth 1/0/18、Eth 1/0/27,EC203和EC204通过交换机202向存储设备201发送流量,EC203和EC204分别通过聚合口Eth 1/0/13和Eth 1/0/27来转发流量,由于EC203发来的流量较大,检测该聚合口的转发缓存水位大于预设值,但是该聚合口还是可以转发EC203发来的流量,不会发生丢包。将该聚合口的状态标识为繁忙状态。EC204发来的流量较小,检测聚合口Eth 1/0/27的转发缓存水位小于预设值,因此将该聚合口的状态标识为空闲状态,并分配映射值。而其他两个聚合口未有流量转发,将其他两个聚合口的状态均标识为空闲状态,并分配映射值。各聚合口具体状态情况参见表1,表1为交换机聚合口转发状态表。表1用来保存各聚合口的状态以及分配的映射值。
聚合口名称 |
聚合口状态 |
映射值 |
Eth 1/0/27 |
00 |
0 |
Eth 1/0/9 |
00 |
1 |
Eth 1/0/13 |
01 |
128 |
Eth 1/0/18 |
00 |
2 |
表1
表1中,聚合口Eth 1/0/13的状态为繁忙状态,映射值填充为128,为了本实施例在实施时方便,为该聚合口分配了128,由于聚合数的限制,一般不会超过128个,在本实施例中为未分配映射值的聚合口赋值128,这样哈希运算出的哈希值不会匹配到该值128。因此达到了除状态为空闲状态的聚合口都不会在进行哈希运算的结果中匹配到。
交换机同时会维护一张流量转发表,用来记录各聚合口及各聚合口转发的对应流量的源MAC地址和目的MAC地址。转发时通过此表获取转发聚合口信息,并查表得知收到的流量是否为新流量。在二层网络中,新流量携带的目的MAC地址和源MAC地址中至少存在一个与流量转发表中保存的不一致。如果都一致,则继续在原转发该流量的聚合口进行转发。参见表2,表2为交换机流量转发表。
源MAC地址 |
目的MAC地址 |
聚合口名称 |
01:48:3c:52:00:94 |
01:48:3c:36:12:36 |
Eth 1/0/27 |
01:61:5c:42:00:5f |
01:48:3c:36:12:26 |
Eth 1/0/13 |
表2
表2中,可以看到聚合口Eth 1/0/27和Eth 1/0/13有流量在转发,聚合口Eth 1/0/27转发的是EC204发来的流量,EC204的源MAC地址和目的MAC地址分别为01:48:3c:52:00:94和01:48:3c:36:12:36;聚合口Eth 1/0/27转发的是EC203发来的流量,EC203的源MAC地址和目的MAC地址分别为01:61:5c:42:00:5f和01:01:48:3c:36:12:26。
表2中只是举例了在二层网络中判断新流量的参数,在三层网络中,新流量携带的源IP、目的IP、源聚合口和目的聚合口中至少存在一个与流量转发表中保存的不一致。在交换机流量转发表中保存源IP、目的IP、源聚合口和目的聚合口,查表过程等相似,这里不再赘述。
参见图2中,现将EC205接入,并需要向存储设备201发送流量。交换机202收到EC205发来的要发送给存储设备201的流量,查找交换机流量转发表,未查找到目的MAC地址和源MAC地址都一致的流量正在转发,表明该交换机发来的流量为新流量。交换机首先对EC205流量的源MAC地址和存储端目的MAC地址进行XOR运算,并查询交换机Bonding转发状态表项,发现只有三个聚合口处在空闲状态,则将参与哈希运算的聚合口的个数确定为3个,并对XOR所得值进行取余,得到的余数与聚合口状态转发表中的映射值进行匹配,如果得到的结果为0,则将新流量通过聚合口Eth 1/0/27进行转发。同时检测聚合口Eth 1/0/27转发缓存水位是否大于等于预设值,但是小于预设告警值,如果是,则在聚合口状态转发表中将聚合口Eth 1/0/27的状态改为01,同时映射值设置为128,并重新分配映射值。如果未达到预设值,则保持状态转发表中原值不变。
如果此时EC205的流量较大,聚合口Eth 1/0/27的转发缓存水位大于等于预设告警值,在聚合口状态转发表中将Eth 1/0/27的状态标识为11。交换机进行聚合口HASH运算。本例中只有两个聚合口的状态为00,假设通过HASH运算确定的目的聚合口为聚合口Eth 1/0/18,聚合口Eth 1/0/27的数据将通过Eth 1/0/18同时进行转发,以提高带宽,同时在聚合口状态转发表中将Eth1/0/27和Eth 1/0/18的状态将分别被标识为11和10。此时各聚合口的状态参见表3,表3为新流量加入后聚合口转发状态表。参见表4,表4为新流量加入后流量转发表。
聚合口名称 |
聚合口状态 |
映射值 |
Eth 1/0/27 |
11 |
128 |
Eth 1/0/9 |
00 |
1 |
Eth 1/0/13 |
01 |
128 |
Eth 1/0/18 |
10 |
128 |
表3
表4
当检测到聚合口Eth 1/0/27的转发缓存水位小于预设值时,而聚合口Eth1/0/18转发缓存水位大于等于预设告警值时,分别对这两个聚合口进行状态标识,并将这两个聚合口负载分担的源MAC为23:bc:41:94:32:08的流量切换回聚合口Eth 1/0/27进行转发。
如果两个聚合口的转发能力还不能满足EC205发来的流量,则用上述同样的方法再确定一个状态为空闲状态的聚合口来负载分担EC205发来的流量。以此类推,直到流量能够在不丢包的情况下全部被转发,或者该交换机不能再提供聚合口来转发该流量。
上文以一个聚合口的状态从空闲状态到繁忙状态,到负载分担繁忙,到负载分担空闲状态,再到空闲状态为例详细说明聚合口负载分担过程。在实际应用中,各聚合口的处理过程同上述的聚合口,这里不再一一赘述。
参见图2,当图2中的EC205退出了组网,无流量发来请求转发时,在聚合口Eth 1/0/27和Eth 1/0/18的转发缓存水位都达不到预设值,预设一个时间值,如果在该预设时间之间内这两个聚合口的转发缓存水位一直未达预设值,则修改这两个聚合口的状态值和映射值,并修改流量转发表。修改后的聚合口状态转发表参见表1;修改后的流量转发表参见表2。
如果EC205并未退出组网,只是流量减小,有一个聚合口转发能力已经可以足够转发,则会检测到至少有一个聚合口的转发缓存水位在预设时间内一直未达预设值。如果两个都未达预设值,则将这两个聚合口的状态都标识为空闲状态,假设聚合口Eth 1/0/18转发缓存水位大于等于预设值,但并未达到预设告警值,则将聚合口Eth 1/0/18的状态标识为繁忙状态。同时聚合口的状态变换后重新为状态为空闲状态的聚合口分配映射值。该种情况下聚合口状态转发表参见表5,聚合口流量转发表参见表6。
聚合口名称 |
聚合口状态 |
映射值 |
Eth 1/0/27 |
00 |
0 |
Eth 1/0/9 |
00 |
1 |
Eth 1/0/13 |
01 |
128 |
Eth 1/0/18 |
01 |
128 |
表5
源MAC地址 |
目的MAC地址 |
聚合口名称 |
01:48:3c:52:00:94 |
01:48:3c:36:12:36 |
Eth 1/0/27 |
01:61:5c:42:00:5f |
01:48:3c:36:12:26 |
Eth 1/0/13 |
23:bc:41:94:32:08 |
01:48:3c:36:11:30 |
Eth 1/0/18 |
表6
上文只是为了描述方便,以接入一个新的EC转发流量可能遇到的情况来详细描述各聚合口负载分担过程,在实际应用中当多个聚合口状态、流量发生变化时,过程同上,这里不再一一描述。
基于上述同样的发明构思,本发明还提出了一种实现聚合口负载分担的交换机。参见图3,图3为本发明实现聚合口负载分担的交换机结构示意图。该交换机包括:检测单元301、标识分配单元302,接收单元303和选取转发单元304;
检测单元301,与标识分配单元302相连,用于检测自身所在的交换机的各聚合口的转发缓存水位;
标识分配单元302,与选取转发单元304相连,用于将检测单元301检测到转发缓存水位小于预设值的聚合口的状态标识为空闲状态,将缓存水位大于预设值的聚合口的状态标识为繁忙状态,并分别为当前每个状态为空闲状态的聚合口分配唯一的映射值;其中,繁忙状态的聚合口不分配映射值;
接收单元303,与选取转发单元304相连,用于接收新流量的转发请求;
选取转发单元304,用于在接收单元303接收到新流量的转发请求时,根据当前状态为空闲状态的聚合口的个数,并采用哈希算法计算出哈希值,将计算出的哈希值与为当前聚合口分配的映射值进行匹配,将匹配到的映射值对应的聚合口作为目的聚合口,并将接收到的新流量从目的聚合口转发出去。
较佳地,选取转发单元304,进一步用于若检测单元301检测到转发缓存水位大于预设告警值的聚合口时,根据当前状态为空闲状态的聚合口的个数,并采用哈希算法计算出哈希值,将计算出的哈希值与为当前聚合口分配的映射值进行匹配,将匹配到的映射值对应的聚合口作为目的聚合口,将状态为负载分担繁忙状态的聚合口的正在转发的全部流量切换到目的聚合口转发出去;
标识分配单元302,进一步用于将检测单元301检测到转发缓存水位大于预设告警值的聚合口的状态标识为负载分担繁忙状态,如果当前状态为繁忙状态的聚合口已分配过映射值,将已分配的映射值删除;将选取转发单元确定的目的聚合口的状态标识为负载分担空闲状态,将已为当前确定的目的聚合口分配的映射值删除;并分别为当前每个状态为空闲状态的聚合口分配唯一的映射值。
较佳地,标识分配单元302,进一步用于若检测单元301检测到第一负载分担聚合口的转发缓存水位大于预设告警值时,将第一负载分担聚合口的状态标识为负载分担繁忙状态;当检测单元301检测到当前状态为负载分担繁忙状态的聚合口的转发缓存水位未达到预设值时,将状态为负载分担繁忙状态的聚合口的状态标识为负载分担空闲状态;
选取转发单元304,进一步用于将第一负载分担聚合口正在转发的流量切换回与所述第一负载分担聚合口负载分担同一流量转发的当前状态为负载分担空闲状态的聚合口转发出去;
或,
选取转发单元304,进一步用于若检测单元301检测到第一负载分担聚合口的转发缓存水位大于等预设告警值,且当前状态为负载分担繁忙状态的聚合口的转发缓存水位大于预设值时,根据当前状态为空闲状态的聚合口的个数,并采用哈希算法计算出哈希值,将计算出的哈希值与为当前聚合口分配的映射值进行匹配,并将匹配到的映射值对应的聚合口作为第二负载分担聚合口,将第一负载分担聚合口正在转发的全部流量切换到第二聚合口转发出去;
标识分配单元302,进一步用于当检测单元301检测到第一负载分担聚合口的转发缓存水位大于预设告警值时,将第一负载分担聚合口的状态标识为负载分担繁忙状态;将第二负载分担聚合口的状态标识为负载分担空闲状态,将已为第二负载分担聚合口分配的映射值删除,并分别为当前每个状态为空闲状态的聚合口分配唯一的映射值;
较佳地,标识分配单元302,进一步用于在检测单元301在预设时间检测当前状态为负载分担空闲状态的聚合口的转发缓存水位都未达到预设值时,将当前状态为负载分担空闲状态的聚合口的状态标识为空闲状态,并分别为当前每个空闲状态的聚合口分配唯一的映射值。
上述实施例的单元可以集成于一体,也可以分离部署;可以合并为一个单元,也可以进一步拆分成多个子单元。
综上所述,本发明,建立聚合口转发状态表,通过实时或周期检测各聚合口的转发缓存水位,判断聚合口的繁忙状态。繁忙状态的聚合口不参加哈希运算,即新流量不会通过繁忙状态的聚合口进行转发,避免了新流量叠加到该聚合口,致使流量过大发生丢包。同时建立流量转发表项,以记录现有转发流量对应的转发聚合口。当需要转发的流量大于单一聚合口的转发能力时,从空闲状态聚合口中通过哈希运算在匹配一个空闲聚合口来负载分担该聚合口的转发流量。两个聚合口轮流转发流量,如果两个聚合口还不够,按相同的方法再确定一个聚合口参与该流量的负载分担转发,直到该流量可以在不丢包情况下能够全部转发。本发明的这种实现负载分担的方法在转发流量时,能够实现各聚合口负载分担且不会发生丢包。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。