知识卡片
会话迁移与服务器亲和的取舍
内容
集群环境下处理同一会话的多次请求,有两种截然相反的思路。会话迁移:允许一次会话的不同请求被不同服务器接力处理,好处是能更细粒度地均衡各服务器负载(尤其在会话较长的情况下效果明显),但服务器会话状态天然很难支持这种迁移,因为只有真正处理过这次会话的那台服务器才容易直接找到它的状态——想同时用服务器会话状态又支持迁移,往往不得不模糊服务器会话状态和数据库会话状态之间的界限。服务器亲和:强制某次特定会话的所有请求始终由同一台服务器处理,实现相对简单,但会带来一个容易被忽视的副作用——集群系统未必总能准确判断每个请求到底属于哪个会话,通常只能退而求其次靠客户端IP地址来做亲和绑定;一旦客户端通过代理访问(大量真实用户共享同一个出口IP),这些原本毫不相干的用户就会被系统误判成”同一批”、全部绑定到同一台服务器上——发现某台服务器负载异常集中时,这往往就是问题所在。可迁移启发:任何依赖客户端标识(IP、设备指纹等)做请求路由或亲和绑定的设计,都要提前设想”多个真实主体共享同一个标识”这种情况可能带来的负载倾斜,而不能假设标识与用户是一一对应的。
参考来源
- 位置:《企业应用架构模式》第一部分"表述"之"第6章 会话状态"之"6.3 存储会话状态的方法"(源文件:_epub-src/OEBPS/Text/000044.html)
- 结论依据:原文说明"会话迁移(session migration)允许一次会话从一台服务器转移到另一台服务器……然而用服务器会话状态很难支持会话迁移,因为只有处理会话的那个服务器才能容易地找到会话的状态……在尽量保证服务器亲和时,服务集群系统并不能总是判断出每个请求所在的会话。因此,集群系统不得不提高亲和力,把来自同一个客户端的所有请求交给同一台应用服务器。通常是通过客户机的IP地址,当客户端使用代理时,将有很多的客户端使用同一个IP地址访问服务器,并因而都被绑定到同一个特定服务器上",直接支撑本卡结论。
- 原始内容:当你发现大量的负载集中在某台服务器上时,就知道情况会变得多糟糕。