此时客户端2的五元组为tuple1,携带sessionID2,由sessionID2计算得到的real server本应该是real server2,但是由于命中了僵尸conn1,它将被负载到real server1,此时客户端2更改了IP地址,它的五元组变成了tuple2',经过conn_schedule计算后,它匹配到了real server2,由于为它服务的初始real server为real server1,这将导致连接切换。这就是没有删除通知机制导致的问题。
问题的解决似乎比较简单,办法有二,第一种办法就是为ip_vs_protocol结构体增加一个五元组变更通知的回调函数,比如叫做conn_in_update/conn_out_update,或者直接增加一个conn_in_delete/conn_out_delete,要么就是一种更加彻底的解决方案,即直接用sessionID来记录连接。而这后者正是我正准备为Linux的nf_conntrack所做的一个外科手术。
当然,我不会走火入魔到彻底放弃五元组的连接跟踪方式,我只是为nf_conntrack增加了一种选择,正如conntrack增加了zone的支持一样。我相信,即便我不动手,过一个一年半载,肯定会有人这么做的,以往的事实预示了这一点。
?