连接的相关性
到现在为止,我们假设每个连接都相互独立的,所以每个连接被分配到一个服务器,跟过去和现在的分配没有任何关系。但是,有时由于功能或者性能方面的原因,一些来自同一用户的不同连接必须被分配到同一台服务器上。
FTP是一个因为功能设计导致连接相关性的例子。在FTP使用中,客户需要建立一个控制连接与服务器交互命令,建立其他数据连接来传输大量的数据。在主动的FTP模式下,客户通知FTP服务器它所监听的端口,服务器主动地建立到客户的数据连接,服务器的端口一般为20。IPVS调度器可以检查报文的内容,可以获得客户通知FTP服务器它所监听的端口,然后在调度器的连接Hash表中建立一个相应的连接,这样服务器主动建立的连接可以经过调度器。但是,在被动的FTP模式下,服务器告诉客户它所监听的数据端口,服务器被动地等待客户的连接。在VS/TUN或VS/DR下,IPVS调度器是在从客户到服务器的半连接上,服务器将响应报文直接发给客户,IPVS调度器不可能获得服务器告诉客户它所监听的数据端口。
SSL(Secure Socket Layer)是一个因为性能方面原因导致连接相关性的例子。当一个SSL连接请求建立时,一个SSL的键值(SSL Key)必须要在服务器和客户进行选择和交换,然后数据的传送都要经过这个键值进行加密,来保证数据的安全性。因为客户和服务器协商和生成SSL Key是非常耗时的,所以SSL协议在SSL Key的生命周期内,以后的连接可以用这个SSL Key和服务器交换数据。如果IPVS调度器将以后的连接调度到其他服务器,这会导致连接的失败。
我们现在解决连接相关性的方法是持久服务(Persistent Service)的处理。使用两个模板来表示客户和服务器之间的持久服务,模板〈protocol, client_ip, 0, virtual_ip, virtual_port, dest_ip, dest_port〉表示来自同一客户client_ip到虚拟服务〈virtual_ip, virtual_port〉的任何连接都会被转发到目标服务器〈dest_ip, dest_port〉,模板〈protocol, client_ip, 0, virtual_ip, 0 dest_ip, 0〉表示来自同一客户client_ip到虚拟服务器virtual_ip的任何连接都会被转发到目标服务器dest_ip,前者用于单一的持久服务,后者用于所有端口的持久服务。当一个客户访问一个持久服务时,IPVS调度器会在连接Hash表中建立一个模板,这个模板会在一个可设置的时间内过期,如果模板有所控制的连接没有过期,则这个模板不会过期。在这个模板没有过期前,所有来自这个客户到相应服务的任何连接会被发送到同一台服务器。
持久服务还可设置持久的粒度,即可设置将来自一个C类地址范围的所有客户请求发送到同一台服务器。这个特征可以保证当使用多个代理服务器的客户访问集群时,所有的连接会被发送到同一服务器。
虽然持久服务可能会导致服务器间轻微的负载不平衡,因为持久服务的一般调度粒度是基于每个客户机的,但是这有效地解决连接相关性问题,如FTP、SSL和HTTP Cookie等。