nginx+tomcat+memcached (msm)实现 session同步复制

来源:互联网 发布:手机淘宝如何出售二手 编辑:程序博客网 时间:2024/06/04 00:30

这里重点强调如何实现linux服务器上 服务器session共享,软件安装不再赘述。
首先我们需要对 cookie 和session的工作机制非常了解,如果不了解其中的原理,就算配置成功,也毫无意义。换了工作换了环境,重新配置起来
仍然需要重头来过,事倍功半。
cookie是怎样工作的?
例如,我们创建了一个名字为login的Cookie来包含访问者的信息,创建Cookie时,服务器端的Header如下面所示,这里假设访问者的注册名是“Michael Jordan”,
同时还对所创建的Cookie的属性如path、domain、expires等进行了指定。
Set-Cookie:login=Michael Jordan;path=/;domain=msn.com;
expires=Monday,01-Mar-99 00:00:01 GMT

上面这个Header会自动在浏览器端计算机的Cookie文件中添加一条记录。浏览器将变量名为“login”的Cookie赋值为“Michael Jordon”。注意,在实际传递过程中这个
Cookie的值是经过了URLEncode方法的URL编码操作的。
这个含有Cookie值的HTTP Header被保存到浏览器的Cookie文件后,Header就通知浏览器将Cookie通过请求以忽略路径的方式返回到服务器,完成浏览器的认证操作。

此外,我们使用了Cookie的一些属性来限定该Cookie的使用。例如Domain属性能够在浏览器端对Cookie发送进行限定,具体到上面的例子,该Cookie只能传到指定的服
务器上,而决不会跑到其他的如www.hp.com的Web站点上去。Expires属性则指定了该Cookie保存的时间期限,例如上面的Cookie在浏览器上只保存到1999年3月1日1秒。
当然,如果浏览器上Cookie太多,超过了系统所允许的范围,浏览器将自动对它进行删除。至于属性Path,用来指定Cookie将被发送到服务器的哪一个目录路径下。
说明:浏览器创建了一个Cookie后,对于每一个针对该网站的请求,都会在Header中带着这个Cookie;不过,对于其他网站的请求Cookie是绝对不会跟着发送的。而
且浏览器会这样一直发送,直到Cookie过期为止。

session又是如何工作的?
由于http是无状态的协议,你访问了页面A,然后在访问B,http无法确定这2个访问来自一个人,因此要用cookie或session来跟踪用户,根据授权和用户身份来
显示不同的页面。比如用户A登陆了,那么能看到自己的个人信息,而B没登陆,无法看到个人信息。还有A可能在购物,把商品放入购物车,此时B也有这个过程,
你无法确定A,B的身份和购物信息,所以需要一个session ID来维持这个过程。
cookie是服务器发给客户端,并且保持在客户端的一个文件,里面包含了用户的访问信息(账户密码等),可以手动删除或设置有效期,在下次访问的时候,会
返给服务器。注意:cookie可以被禁用,所以要想其他办法,这就是session。比如:你去商场购物,商场会给你办一张会员卡,下次你来出示该卡,会有打折优惠
。该卡可以自己保存(cookie),或是商场代为保管,由于会员太多,个人需要保存卡号信息(session ID)。

为什么要持久化SESSION?
在客户端每个用户的Session对象存在Servlet容器中,如果Tomcat服务器重起/当机的话该session就会丢失,而客户端的操作应为session的丢失而造成数据丢失,而且
当前用户访问量巨大,每个用户的Session里存放大量的数据的话,那么就很占用服务器大量的内存,从而是服务器的性能受到影响。

番外篇
session 是非常重要的数据,非常宝贵。但是session同样也是缺憾满身,在大规模集群服务器中,最好使用其他替代方案。比如淘宝网。

对nginx的了解?
nginx 是一款非常优秀的服务器软件,其优秀程度这里不过多赘述。

进入正题
session 实现共享的方法分为多种
对于WEB应用集群的技术实现而言,最大的难点就是如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块。要实现这一点,
大体上有两种方式,一种是把所有Session数据放到一台服务器上或者数据库中,集群中的所有节点通过访问这台Session服务器来获取数据;另一种就是在集群中的所有节
点间进行Session数据的同步拷贝,任何一个节点均保存了所有的Session数据。

一 使用tomcat自身集群特性完成session共享
这种方式是使用tomcat自身广播的特点来进行session同步拷贝,优点是简单,缺点是一旦tomcat集群数量过多,很容易引发广播风暴。
详细配置 请参照 博客 http://zyycaesar.iteye.com/blog/296606
粗略配置如下 tomcat/server.xml

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"                channelSendOptions="8">          <Manager className="org.apache.catalina.ha.session.DeltaManager"                   expireSessionsOnShutdown="false"                   notifyListenersOnReplication="true"/>          <Channel className="org.apache.catalina.tribes.group.GroupChannel">             <Membership className="org.apache.catalina.tribes.membership.McastService"                     address="224.0.0.0"                     port="45564"                     frequency="500"                     dropTime="3000"/>             <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"                      address="192.168.0.223"                      port="4001"                      autoBind="100"                      selectorTimeout="5000"                      maxThreads="6"/>             <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">                 <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>             </Sender>             <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>             <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>          </Channel>          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"                 filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>          <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>        </Cluster>

二 使用数据库持久化session
这里又分为物理数据库和内存数据库 物理数据库备份session,由于其性能的原因,这里不作介绍。 内存数据库 可以暂分为 redis 和 memcached 这里我们只介绍memcached 多个tomcat各种序列化策略配置如下:

一、java默认序列化tomcat配置

conf/context.xml添加 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"       memcachedNodes="n1:192.168.100.208:11211 n2:192.168.100.208:11311"         lockingMode="auto"    sticky="false"     requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"        sessionBackupAsync= "false"       sessionBackupTimeout= "100"          transcoderFactoryClass="de.javakaffee.web.msm.JavaSerializationTranscoderFactory"            />lib增加jar包: spymemcached-2.10.3.jar    memcached-session-manager-1.7.0.jar    memcached-session-manager-tc7-1.7.0.jar

二、javolution序列化tomcat配置

conf/context.xml添加 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"       memcachedNodes="n1:192.168.100.208:11211 n2:192.168.100.208:11311"       lockingMode="auto"    sticky="false"     requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"        sessionBackupAsync= "false"       sessionBackupTimeout= "100"      copyCollectionsForSerialization="true"       transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"            />lib增加jar包 msm-javolution-serializer-cglib-1.3.0.jar    msm-javolution-serializer-jodatime-1.3.0.jar    spymemcached-2.10.3.jar    javolution-5.4.3.1.jar    msm-javolution-serializer-1.7.0.jar    memcached-session-manager-1.7.0.jar    memcached-session-manager-tc7-1.7.0.jar

三、xstream序列化tomcat配置

conf/context.xml添加 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"       memcachedNodes="n1:192.168.100.208:11211 n2:192.168.100.208:11311"       lockingMode="auto"    sticky="false"     requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"        sessionBackupAsync= "false"       sessionBackupTimeout= "100"    transcoderFactoryClass="de.javakaffee.web.msm.serializer.xstream.XStreamTranscoderFactory"            />lib增加jar包 xmlpull-1.1.3.1.jar    xpp3_min-1.1.4c.jar    xstream-1.4.6.jar    msm-xstream-serializer-1.7.0.jar    spymemcached-2.10.3.jar    memcached-session-manager-1.7.0.jar    memcached-session-manager-tc7-1.7.0.jar

四、flexjson序列化tomcat配置

conf/context.xml添加 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"       memcachedNodes="n1:192.168.100.208:11211 n2:192.168.100.208:11311"         lockingMode="auto"    sticky="false"     requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"        sessionBackupAsync= "false"       sessionBackupTimeout= "100"          transcoderFactoryClass="de.javakaffee.web.msm.serializer.json.JSONTranscoderFactory"            />lib增加jar包 flexjson-3.1.jar    msm-flexjson-serializer-1.7.0.jar    spymemcached-2.10.3.jar    memcached-session-manager-1.7.0.jar    memcached-session-manager-tc7-1.7.0.jar

五、kryo序列化tomcat配置

conf/context.xml添加 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"       memcachedNodes="n1:192.168.100.208:11211 n2:192.168.100.208:11311"       lockingMode="auto"    sticky="false"     requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"        sessionBackupAsync= "false"       sessionBackupTimeout= "100"        copyCollectionsForSerialization="true"       transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"            />lib增加jar包 kryo-1.04.jar    minlog-1.2.jar    asm-3.2.jar    reflectasm-1.01.jar    kryo-serializers-0.11.jar    msm-kryo-serializer-1.7.0.jar    spymemcached-2.10.3.jar    memcached-session-manager-1.7.0.jar    memcached-session-manager-tc7-1.7.0.jar

官网介绍说 使用kryo 序列化tomcat的效率最高 所以这里只介绍kryo序列化。具体效率对比,还需要进一步验证。 1 修改tomcat/context.xml文件 新增如下代码

阅读全文
0 0
原创粉丝点击