天天看点

SIP负载均衡 != 基于IP的负载均衡

     本文为翻译,原文参见: http://blog.tekelec.com/blog/bid/32558/SIP-Load-Balancing-IP-Based-Load-Balancing

     在需要对一个SIP基础设施进行扩容时,规划网络的技术人员很可能会问自己:DNS不是一个足以胜任的方案,那么一个简单的基于IP的负载均衡器可以吗?

      一个简单的IP负载均衡器会充当SIP集群的前端,所有进入SIP集群的流量会通过该负载均衡器。这可以通过为SIP集群建立一条DNS注册条目达到,该DNS条目映射集群的URL和一个由该负载均衡器所服务的IP地址。该IP负载均衡器接下来会使用一些诸如循环法或基于源IP地址哈希值的负载分配机制对进入的SIP流量进行分配。

      这种方法对于集群中的SIP节点是事务无状态SIP代理的情形可能足够。但对于所有其他的情形,这种简单的方法不行:

  •  同一个事务的响应和请求应穿越相同的节点。因此,负载均衡器至少应能基于VIA头路由响应,否则响应会抵达一个对该事务一无所知的SIP节点,这很可能会丢掉该响应或产生一个错误。这意味着该负载均衡器会有必要充当一个事务无状态代理,并至少解析VIA头。
  •  万一属于同一对话的请求期望集群中的同一服务器处理,则使用循环法或源IP地址哈希值的做法也不会工作。为什么说循环法不是一个选项的原因应该很清楚。使用源地址的一个哈希值来确定SIP节点在理想情况下可能工作。但一个SIP客户端可能在同一对话更改其IP地址,或者集群的大小会改变。例如,如果集群增加或移除一台服务器,则这种哈希机制会导致错误结果。
  • 在诸如PSTN网关集群的场景中,集群的节点它们本身会产生呼叫。在这种情况下,负载均衡器会需要将进入响应路由至正确节点的能力。这会要求负载均衡器能处理SIP头,并使用VIA头路由响应。

       因此,总而言子,一个SIP节点的集群的负载均衡器必须有一些SIP逻辑。然而,这种SIP逻辑的水平会依赖使用的场景、集群中服务器类型,以及运营者的期望。

        一般地,实现一个SIP负载均衡器的方法可以是如下两种方案中一个:

  •  透明的(Transparent):该负载均衡器的存在对于客户端和服务器均透明。客户端将它们的流量发送至该负载均衡器,负载均衡器不增加任何SIP头就将流量转发至服务器。服务器使用负载均衡器挑选某个路由器来把它们的响应发送回客户端。离开负载均衡器的SIP消息中的VIA和Record-Route头会包括该负载均衡器的IP地址。要么通过使集群中节点明白在增加一个VIA或Record-Route头时使用负载均衡器的IP地址,要么通过让负载均衡器操作离开集群的消息并用它自己的地址替换消息中包括的IP地址来实现。
  • 非透明的(Non-Transparent):该负载均衡器充当接收来自客户端流量的外出代理,然后增加VIA和可能的RR头,并转发流量至某些服务器。

        透明模式的优点是客户端看不见集群中节点的地址,并提供这种方式拓扑隐藏。而且,在集群中服务器支持NAT穿越时,在对称式NAT的情形下,客户端期望进入的呼叫路由穿过处理注册和该客户端外拨呼叫的同一SIP服务器。采用非透明方式,负载均衡器自己会不得不处理NAT穿越。采用透明方式,集群中的不同服务器会各自负责客户端子集,这会保持负载均衡器的低复杂性和高容量。

        非透明方式的主要优点是负载均衡器充当一个SIP代理,例如,这样能重新路由被一个过载服务器拒绝的请求至另一个服务器。

继续阅读