Nginx,Tengine,Tomcat,Terracotta,Haproxy,Memcached,Redis会话处理策略

在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理。如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A、B两台服务器,用户在第一次访问网站时,Nginx通过其负载均衡机制将用户请求转发到A服务器,这时A服务器就会给用户创建一个Session。当用户第二次发送请求时,Nginx将其负载均衡到B服务器,而这时候B服务器并不存在Session,所以就会将用户踢到登录页面。这将大大降低用户体验度,导致用户的流失,这种情况是项目绝不应该出现的。

我们应当对产生的Session进行处理,通过Session保持,Session复制或Session共享,Session持久化,Terracotta等方式保证用户的体验度。

分类:

1
2
3
4
1、会话保持(Nginx,Haproxy,Tengine)
2、会话复制(Tomcat,Terracotta)
3、会话共享(Memcached,Redis)
4、会话持久化(写入到数据库)

原理:

1
2
3
4
5
6
7
8
9
10
11
1、会话保持
会话保持是指将用户锁定到某一个服务器上,比如上面说的例子,用户第一次请求时,负载均衡器将用户的请求转发到了A服务器上,如果负载均衡器设置了粘性session的话,那么用户以后的每次请求都会转发到A服务器上,相当于把用户和A服务器粘到了一块,这就是粘性session机制。

2、会话复制
任何一个服务器上的session发生改变(增删改),该节点会把这个 session的所有内容序列化,然后广播给所有其它节点,不管其他服务器需不需要session,以此来保证session同步。

3、会话共享
使用分布式缓存方案比如memcached、redis

4、会话持久化
拿出一个数据库,专门用来存储session信息。保证session的持久化。

一、Nginx做负载均衡的会话保持

主要是用ip_hash这个均衡策略,根据来源ip进行hash,同一个ip进入同一个后端服务器,配置文件如下:

1
2
3
4
5
upstream nong {
ip_hash;
server192.168.0.11:80;
server192.168.0.12:80;
}

二、Haproxy做负载均衡的会话保持

Haproxy作为一个优秀的反向代理和负载均衡软件,也提供了多种Session保持的方法,下面列举了两种最常用的:

1、源地址 Hash
  • haroxy 将用户IP经过hash计算后指定到固定的真实服务器上(类似于nginx 的ip_hash 指令)
    配置指令:balance source
2、使用cookie 进行识别
  • 也就是Haproxy在用户第一次访问的后在用户浏览器插入了一个Cookie,用户下一次访问的时候浏览器就会带上这个Cookie给Haproxy,Haproxy进行识别。
  • 配置语法: cookie SESSION_COOKIE insert indirect nocache

配置例子如下:

1
2
3
cookie SERVERID insert indirect nocache
server web01 192.168.56.11:8080 check cookie web01
server web02 192.168.56.12:8080 check cookie web02

三、Tengine会话保持

  • 除了nginx的ip_hash模块以外还支持ngx_http_upstream_session_sticky_module模块,通过cookie实现客户端与后端服务器的会话保持, 在一定条件下可以保证同一个客户端访问的都是同一个后端服务器。

配置:

1
2
3
4
5
6
7
8
9
10
11
upstream foo {
server 192.168.0.1;
server 192.168.0.2;
session_sticky;
}

server {
location / {
proxy_pass http://foo;
}
}

四、Tomcat会话复制

配置:

1
2
1、设置Tomcat,server.xml开启tomcat集群功能
2、在应用里增加信息:通知应用当前处于集群环境中,支持分布式

五、Tomcat会话共享

我们可以使用MSM(Memcached SessionManager)来实现把session存放到Memcached中

六、Terracotta会话复制

Terracotta的基本原理是对于集群间共享的数据,当在一个节点发生变化的时候,Terracotta只把变化的部分发送给Terracotta服务器,然后由服务器把它转发给真正需要这个数据的节点。Terracotta作为一个JVM级的开源群集框架,不仅提供HTTP Session复制,它还能做分布式缓存,POJO群集,跨越群集的JVM来实现分布式应用程序协调等。

七、会话持久化

拿出一个专门的数据库,专门用来存储session信息,保证session持久化,如果网站的访问量很大,把session存储到数据库中,会对数据库造成很大压力,还需要增加额外的开销维护数据库。

八、Memcached,Redis会话共享

对于session来说,肯定是频繁使用的,虽然你可以把它存放到数据库中,但是真正生产环境中我更推荐存放在更快速的KV数据中,例如Memcached、Redis

1、PHP配置使用Memcached保存session(需要安装PHP的memcached插件)
1
2
3
4
修改php.ini

session.save_handler = memcache
session.save_path = "tcp://192.168.56.11:11211"
2、PHP配置使用Redis保存session(需要安装PHP的redis插件)
1
2
3
4
修改php.ini

session.save_handler = redis
session.save_path ="tcp://localhost:6379"
3、Tomcat使用MSM来实现把session存放到Memcached
博主QQ:1012405802
技术交流QQ群:830339411
版权声明:网站内容有原创和转载,如有侵权,请联系删除,谢谢!!
感谢打赏,93bok因你们而精彩!!(支付宝支持花呗)
0%