A10负载均衡和会话保持
在大多数的企业级应用中,客户端与服务器经常需要通过多次的交互才能完成一次事务处理或一笔交易。由于这些交互与用户的身份是紧密相关的,因此,与这个客户端相关的应用请求,往往需要转发至一台服务器完成,而不能被负载均衡器转发至不同的服务器上进行处理。为了实现这一机制,我们需要在负载均衡上配置会话保持(Session Persistence)机制,以确保客户端与应用系统之间的交互不会因为部署了负载均衡而发生问题。
实际上,会话保持机制与负载均衡的基本功能是完全矛盾的。负载均衡希望将来自客户端的连接、请求均衡的转发至后端的多台服务器,以避免单台服务器负载过高;而会话保持机制却要求将某些请求转发至同一台服务器进行处理。因此,在实际的部署环境中,我们要根据应用环境的特点,选择适当的会话保持机制。
 
连接和会话的区别
在介绍会话保持技术之前,我们必须先花点时间弄清楚一些概念:什么是连接(Connection)
、什么是会话(Session),以及这二者之间的区别。
需要特别强调的是,如果我们仅仅是谈论负载均衡,会话和连接往往具有相同的含义。但是,如果我们和开发人员沟通这些术语时,这两个术语却具有截然不同的含义。希望广大读者能够注意这其中的区别。在本文中,我想着重说明的是开发人员眼中的连接及会话的含义。
通常,在普通的客户端或服务器上,我们把具有相同[源地址:端口],和相同[目的地址:端口]的数据包定义为一个连接。下表是Windows系统中用命令 netstat –an输出的部分系统连接状态。
 
1.C:\>netstat -an 
2. 
3.活动连接 
4. 
5. 协议 本地地址          外部地址        状态 
6. 
7....<省略部分输出内容>... 
8.  TCP    172.31.20.53:47669     122.225.67.240:80      ESTABLISHED 
9.  TCP    172.31.20.53:47670     122.225.67.240:80      ESTABLISHED 
10.  TCP    172.31.20.53:47671     122.228.243.240:80     ESTABLISHED 
11.  TCP    172.31.20.53:47672     110.75.34.138:80       TIME_WAIT 
12.  TCP    172.31.20.53:47673     110.75.34.138:80       TIME_WAIT 
13.  TCP    172.31.20.53:47674     110.75.34.138:80       TIME_WAIT 
14.  TCP    172.31.20.53:47675     122.225.67.240:80      ESTABLISHED 
15.  TCP    172.31.20.53:47676     122.225.67.240:80      ESTABLISHED 
16.  TCP    172.31.20.53:47677     122.228.243.240:80     ESTABLISHED 
17.  TCP    172.31.20.53:47679     110.75.24.105:80       ESTABLISHED 
18.  TCP    172.31.20.53:47681     122.225.67.240:80      ESTABLISHED 
19.  TCP    172.31.20.53:47682     122.225.67.240:80      ESTABLISHED 
20.  TCP    172.31.20.53:47683     60.191.143.240:80      ESTABLISHED 
21.  TCP    172.31.20.53:47684     60.191.143.240:80      ESTABLISHED 
22.  TCP    192.168.1.4:18231      203.208.46.29:443      CLOSE_WAIT 
23....<省略部分输出内容>... 
对于负载均衡来说,情况则稍微发生了一些变化。负载均衡会将来自相同[源IP:端口],发送到相同[目的IP:端口]的数据包,通过NAT技术做一些转换后,转发至后端的某台固定的
服务器。如下表所示,虽然两个TCP连接具有相同的源地址,但源端口不同,AX负载均衡仍然将其识别为两个不同的连接,并且转发至两台不同的服务器进行处理。
 
1.AX#show session 
2....<省略部分输出内容>... 
3. 
4.Prot Forward Source         Forward Dest           Reverse Source         Reverse Dest           Age Hash 
5.----------------------------------------------------------------------------------------------------------- 
6.Tcp  103.104.157.122:1619   61.22.215.151:80       172.30.2.83:80         103.104.157.122:1619   60     1     
7. 
8.Tcp  103.104.157.122:1621   61.22.215.151:80       172.30.2.84:80         103.104.157.122:1621   120     3     
9. 
负载均衡器的作用10....<省略部分输出内容>... 
对于同一个连接中的数据包,负载均衡会将其进行NAT转换后,转发至后端固定的服务器进行处理,这是负载均衡最基本、最原始的功能。负载均衡系统内部会专门有一张表来记录这些连接的状况,包括:[源IP:端口]、[目的IP:端口]、[服务器IP:端口]、空闲超时时间(Idle Timeout)等等。这里需要特别说明一下超时时间的意义和定义。
由于负载均衡内部记录连接状态的这张表需要消耗系统的内存资源,因此,这张表不可能无限大,所有厂家都会有一定的限制。这张表的大小一般称之为最大并发连接数,也就是系统同时能够容纳的连接数量。考虑到建立这些连接的客户端或服务器会发生一些异常状况,导致这些连接不能被正常终结掉,因此,负载均衡的当前连接状态表项中,设计了一个空闲超时时间的参数。这个参数定义为,当该连接在一定时间内无流量通过时,负载均衡会自动删
除该连接条目,释放系统资源。在AX中,这个空闲超时时间一般设置为120秒。也就是说,如果在120秒内,对于某个连接,AX没有收到任何来自客户端或服务器端的数据包,AX会主动删除该连接,以释放系统资源。
之所以在这里强调这个参数,是为了和后面介绍会话保持机制时提到的会话保持时间有所区别。
理解了连接的概念,那么对于会话的概念就会比较容易理解一些。在开发人员眼中,会话一般是指从用户登录应用系统,进行事务处理,直至退出应用系统的整个过程。因此,对于相同的会话,客户端可能会建立多个连接进行处理。如果在客户端和服务器之间部署了负载均