https://mp.weixin.qq.com/s/IUamaTBWGqjrn3uD90C6uw
可以看到,当client第一次进入到nginx匹配节点的时候,在给它分配一个节点的同时,会将这个节点的唯一标识进行md5后写入到cookie中一并返回,如果下次再发起请求的时候发现带有这个cookie值,就直接转发到该值所对应的节点上去。这个机制被专业的称之为「Session保持」。
除了cookie之外,还有2种方式也可以最终达到类似的效果。分别被称为「Session复制」、「Session共享」。
我们还可以通过将session信息存放到全局共享的存储介质中来达到一样的效果,如数据库、远程缓存等,这是一种中心化思想的解决方案。
- 优点:不管节点怎么增加和减少,100%不会产生会话丢失。
- 缺点:每次读写请求都需要增加额外共享储存调用,增加了网络I/O、序列化等操作,性能明显下降。另外,用作共享的存储介质除了增加了额外的维护成本外,还需要解决单点问题,以免产生系统性风险。
- Session 保持。原来在哪还是去哪。
- Session 复制。不管在哪都有一样的数据。
- Session 共享。所有节点共用一份数据。
越大型的系统,最终都会往「Session共享」这个方案上走,因为只要再对这个共享存储做横向扩展,理论上就可以支撑无穷大的用户了。如Redis、一系列的NOSQL以及NEWSQL等。就像下面这样,集「规模大」、「高可用」、「效果好」于一身。