本文是Nginx系列(二),将介绍Nginx如何实现会话一致性,负载均衡算法等知识,了解如何搭建负载均衡服务器可以查看《Nginx系列(一):Nginx+Apache 实现反向代理和负载均衡》的文章。

1. 会话一致性

会话一致性是指在负载均衡器上有一种机制,在作负载均衡的同时,还保证同一用户相关连的访问请求会被分配到同一台服务器上。

1.1 会话一致性的作用

如果有一个用户访问请求被分配到服务器A,并且在服务器A登录了,并且在很短的时间,这个用户又发出了一个请求,如果没有会话一致性功能的话,这个用户的请求很有可能会被分配到服务器B去,这个时候在服务器B上是没有登录的,所以你要重新登录,但是用户并不知道自己的请求被分配到了哪里,用户的感觉就是登录了,怎么又要登录,用户体验很不好。 因此,会话一致性在web应用上很重要的。而保持会话一致性一般都是通过session保持的;,接下来介绍三种session同步的方法。

1.2 利用数据库同步 session

数据库同步 session 有以下两种方法:

  1. 用一台服务器专门建立数据库存放web服务器的 session ,或者,把这个专门的数据库建在文件服务器上,用户访问web服务器时,会去这个专门的数据库 check 一下 session 的情况,以达到 session 同步的目的。
  2. 把存放 session 的表和其他数据库表放在一起,如果 mysql 也做了集群了话,每个 mysql 节点都要有这张表,并且这张session表的数据表要实时同步。

    说明:用数据库来同步session,会加大数据库的负担,数据库本来就是容易产生瓶颈的地方,如果把session还放到数据库里面,无疑是雪上加霜。

session 是文件的形势存放在服务器端的,cookie 是文件的形势存在客户端的,把用户访问页面产生的 session 放到 cookie 里面,就是以 cookie 为中转站。你访问web服务器A,产生了session把它放到cookie里面了,你访问被分配到web服务器B,这个时候,web服务器B先判断服务器有没有这个session,如果没有,在去看看客户端的cookie里面有没有这个session,如果也没有,说明session真的不存,如果cookie里面有,就把cookie里面的sessoin同步到web服务器B,这样就可以实现session的同步了。

说明:这种方法实现起来简单,方便,也不会加大数据库的负担,但是如果客户端把cookie禁掉了的话,那么session就无从同步了,这样会给网站带来损失;cookie的安全性不高,虽然它已经加了密,但是还是可以伪造的。

1.4 利用 memcache 同步 session

memcache 可以做分布式,用来做 session 同步。他可以把 web 服务器中的内存组合起来,成为一个”内存池”,不管是哪个服务器产生的sessoin 都可以放到这个”内存池”中,其他的都可以使用。
优点:以这种方式来同步session,不会加大数据库的负担,并且安全性比用cookie大大的提高,把session放到内存里面,比从文件中读取要快很多。
缺点:memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片,如果存储块不足,还会产生内存溢出。

2. 负载均衡

实现负载均衡的方法,可分为两种,一种是用软件来实现负载均衡,另一种是硬件实现负载均衡(包括结合硬件和软件);用软件来实现负载均衡,实现负载均衡的过程,自身也要消耗一些系统资源,响应时间增加。例如:LVS、nginx、haproxy、apache等这些基于应用层的负载均衡软件,用硬件来实现负载均衡是最明志的选择。

2.1 负载均衡算法
  1. 轮循(Round Robin): 将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
  2. 最少连接数(Least Connections): 跟踪后端服务器当前的活跃连接数目,最少的连接数目说明这个后端服务器负载最轻,将请求分配给他,这种方式会考虑到配置中给每个upstream分配的weight权重信息;
  3. 最短响应时间(Least Time): 请求会分配给响应最快和活跃连接数最少的后端服务器;
  4. 源IP哈希(ip_hash): 这种方式通过生成请求源IP的哈希值,并通过这个哈希值来找到正确的真实服务器。这意味着对于同一主机来说他对应的服务器总是相同。使用这种方式,你不需要保存任何源IP。但是需要注意,这种方式可能导致服务器负载不平衡。
  5. 源URL哈希(url_hash): 以用户自定义资源(比如URL)的方式计算hash值完成分配,其可选consistent关键字支持一致性hash特性。

最后更新: 2017年11月19日 20:17

原始链接: http://blog.minhow.com/2017/01/02/server/nginx-session-coherence/

× 请我吃糖~
打赏二维码