继上篇问题,Nginx除了通过绑定IP地址即ip_hash策略这种黏性session外,

还有其他两种策略,分别为session复制方案使用memcached或其他的额外空间方案

这里我们先讨论下ip_hash方案。

ip_hash策略好不好,其实,这确实是一种简单粗暴但很高效的方式,不需要做过多的配置工作,不过不好之处在于其容错性差,一旦所绑定的Tomcat服务器或者其他后端服务器出现了故障,那么用户的所有session将面临丢失。不过这个也因应用而异吧,毕竟每台服务器会出现故障的情况概率也是很小的,如果应用能过允许这样的一种错误概率,其实ip_hash策略也是一个不错的选择。

session复制方案

session复制方案,即只要某台服务器的session发生了改变,则他会向他所有其他的在服务器群上的服务器发出广播事件,让他们也把相应的session做出改变。已达到所有服务器群上的服务器的session保持一致的目的。优点,首先是具有容错性,另外就是不同服务器上保留着相同的session,用户如果发生切换服务器时session响应非常及时;但这样做也有一个致命的缺点,这个缺点是来自于服务器群间的网络广播事件,如果后端服务器群组比较多或者当session比较大时,网络广播会极大地消耗网络性能,甚至造成整个网络的瘫痪。

关于如何设置的问题,第一是先在Tomcat.server.xml中开启该复制选项,如下图所示,第二则是在应用中指定应用处于分布式部署环境之下。即在应用中,在web.xml代码中指定分布式环境,添加<distributable>字段;

这里我们可能得注意两个问题,一个是如端口号的问题,也就是说需要指明端口号,另外一个就是Tomcat服务器的内网地址与外网地址问题,我们知道,一个服务器一般至少都会存在两个ip地址,即内网地址与外网地址。如果我们的服务器群上绑定的是内网地址,那么我们需要进行说明,不然可能会出现错误的现象,这个时候我们可以在Channel中的Receiver进行说明,命令配置如下:

 

使用memcached或其他的额外空间方案:

每个服务器需要session时都去该空间读取信息。如可以使用memcached(依赖于libevent库)

Memcached方案也可以分为两种,一种是基于黏性session的memcached方案,(如图一)一种则是基于非黏性session的memcached方案(如图二)

 
 
 

 
黏性session的memcached方案的工作原理,假如用户的sessionA存入了Tomcat1,那么Tomcat1会把A存入自己的内存中,同时复制一份,提交给自己的memcached,(图中的memcached之间是互相广播的,他们之间的session值是相同的),假如Tomcat1发生了宕机现象,请求被转移到了Tomcat2上,那么Tomcat2会根据传过来的cookie去自己的内存中寻找sessionA,找不到时便会从自己依赖的memcached上进行读取,读取下来后便同样会做复制,将值存入自己的内存中,下次便可以直接从自己的内存中读取了。也就是说,在这种黏性session的memcached中,如果不发生宕机,memcached只扮演了一个备份的角色,读取修改操仍然在Tomcat中进行。

非黏性session的memcached方案的工作原理:假如用户的sessionA操作的是Tomcat1,那么Tomcat1会把值直接存入自己的备份memcached中,另一个用户访问Tomcat2,那么Tomcat2也会把值直接存入自己的备份memcached中。这些备份memcached会以广播的形式通知自己的主存储memcached,使得主存储memcached具有全部的session,当用户再次Tomcat1时,他会去主存储memcached中读取sessionA。也就是说,在这样一种模式下,Tomcat1并不起存储session的功能,所有的读取修改操作的关键依赖于主存储memcached,这就是非黏性session。

 

在配置时只需要去官网下载相关的Jar包即可,然后再Tomcat中配置Context即可,再哪里配置Context这个问题上,个人的看法是:

** **

**关于Context配置: **1.conf/context.xml下,属于全局配置,作用于所有应用;

2.conf/[enginename]/[hostname]/context.xml.default 全局配置,作用于指定host下全部应用;

3.conf/[enginename]/[hostname]/[contextpath].xml 只作用于contextpath指定的应用;

4.应用META-INF/context.xml只作用于本应用;

5.conf/server.xml <Host>下,作用于Context docBase指定的应用**

所有,只希望session管理作用于特定应用,最好用3,4 方式设置,希望能够作用于全体,可用于1,2,5设置


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/shadema/article/details/76038831