ECMP 亲和性与持续性
等价多路径 (ECMP) 路由只是分配数据流;它不理解用户、Cookie、登录会话或应用事务。请在能够感知应用的应用层设计应用持续性,而不要将稳定的 ECMP 哈希当成一种会话持续性功能。
哈希标识的是数据流,而不是用户
Section titled “哈希标识的是数据流,而不是用户”许多路由器根据网际协议 (IP) 和传输层首部中的字段来选择等价路径。常见的输入是五元组:源地址、目的地址、协议、源端口和目的端口。确切的字段、哈希种子和行为方式取决于具体平台。
在 ECMP 下一跳组保持稳定时,具有相同选中字段的报文通常会沿相同路径转发。新连接可能会使用不同的源端口,从而选择另一个 CE。HTTP/1.0、HTTP/1.1、HTTP/2、浏览器连接重用、代理以及网络地址转换 (NAT) 都会改变用多少个传输层连接来代表一个表面上的用户会话。
这种行为仅是“流亲和性” (flow affinity)。它不是源地址持续性、Cookie 持续性或会话状态复制。
省略源端口会改变权衡
Section titled “省略源端口会改变权衡”某些路由器可以从 ECMP 哈希中省略源端口。这样做可以更频繁地将具有相同源和目的地址的连接保持在同一条路径上,但它减少了可用于分流的取值空间。这样,位于同一个 NAT 地址后面的大量用户可能会集中到单个 CE 上。
这种配置依然无法保证应用层持续性:
- 路径集的改变可能会重新映射哈希值;
- CE 故障会将新流量迁移到其他 CE;
- 客户端地址可能会发生改变;
- 路由器不会在 CE 之间复制应用状态。
将严格的持续性置于正确的层级
Section titled “将严格的持续性置于正确的层级”当应用程序需要将用户带回同一个处理上下文时,请使用支持的应用层持续性机制或将会话状态外部化。示例包括 Cookie 持续性、由应用感知的负载均衡器实现的源地址持续性,以及共享的会话存储。
准确阐述需求:
| 需求 | 适用机制 |
|---|---|
| 将同一个传输流中的报文保持在一条路径上 | ECMP 流哈希 |
| 将来自同一地址的新连接保持在同一个目标上 | 源地址亲和性,需理解 NAT 集中 |
| 将同一已认证用户保持在同一个应用实例上 | 应用层持续性 |
| 容忍所选 CE 或应用实例丢失并正常存活 | 复制的或外部的会话状态,加上健康感知的故障转移 |
用实际流量验证,而不要凭空假设
Section titled “用实际流量验证,而不要凭空假设”生成多个独立的连接,并对比逐路径或逐 CE 计数器。测试应包括 NAT 后的客户端、范围内的每个 HTTP 版本、长连接以及路径集变化。请求成功仅证明了可达性;它并不代表分流均匀或实现了会话持续性。
有关路径集变化的路由侧行为,请参阅 路由和故障转移。
RFC 2992 描述了一种将流分配到等价下一跳的模型,以及下一跳集改变时造成的业务中断。