tomcat session共享之memcached-session-manage

283 阅读3分钟

文档地址:github.com/magro/memca…

配置 tomcat

tomcat 的配置需要两件事:您需要在您的$CATALINA_HOME/lib/WEB-INF/lib/目录中放入一些 jar,并且您必须在相关<Context>元素中(例如在META-INF/context.xml应用程序文件内部)配置 memcached 会话管理器。

将 memcached-session-manager jar 添加到 tomcat

无论选择哪种序列化策略,您始终都需要memcached-session-manager-version.jar](https://repo1.maven.org/maven2/de/javakaffee/msm/memcachedsessionmanager/)[memcachedsessionmanagertc6{version}.jar](https://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/)和[memcached-session-manager-tc6-{version}.jar(用于 tomcat6)、memcached-session-manager-tc7-version.jar](https://repo1.maven.org/maven2/de/javakaffee/msm/memcachedsessionmanagertc7/)(用于tomcat7(注意:tomcat7.0.23+))、[memcachedsessionmanagertc8{version}.jar](https://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc7/)(用于 tomcat7(注意:tomcat 7.0.23+))、[memcached-session-manager-tc8-{version}.jar(用于 tomcat8)或memcached-session-manager-tc9-${version}.jar(用于 tomcat9)。

如果你正在使用 memcached,你还需要spymemcached-${version}.jar。已测试至 v2.12.3。

如果你使用的是couchbase,你还需要这些jar: couchbase-client-1.4.0.jar jettison-1.3.jar、 commons-codec-1.5.jar、 httpcore-4.3.jar、 httpcore-nio-4.3.jar、 netty-3.5.5.Final.jar

如果您使用 Redis,则需要jedis-3.0.0.jar

请下载适当的 jar 并放入$CATALINA_HOME/lib/

向您的 Web 应用添加自定义序列化程序(可选)

如果您想使用 Java 的内置序列化,则无需执行任何其他操作。如果您想使用自定义序列化策略(例如,由于性能更好),则必须将其与您的 Web 应用程序一起部署,以便它们在 中可用WEB-INF/lib/

由于 msm 在 maven central(groupId 下)中可用,因此de.javakaffee.msm您可以使用构建系统的依赖管理将其拉入。使用 maven,您可以为 kryo-serializer 使用以下依赖定义:

<dependency>
    <groupId>de.javakaffee.msm</groupId>
    <artifactId>msm-kryo-serializer</artifactId>
    <version>1.9.7</version>
    <scope>runtime</scope>
</dependency>

对于 javolution ,artifactId 是msm-javolution-serializer,对于 xstream msm-xstream-serializer,对于 flexjson ,它是msm-flexjson-serializer

如果你没有使用基于 maven 存储库的依赖项管理,那么这些是不同序列化器所需的 jar:

配置 memcached-session-manager 为 <Context>管理器

更新<Context>元素(在META-INF/context.xml或您选择的上下文定义中,请检查相关的tomcat 文档)以使其包含Managermemcached-session-manager 的配置,如下例所示。

以下示例展示了使用 memcached 服务器的粘性会话和非粘性会话以及使用 membase 的非粘性会话的配置。使用 memcached 服务器的示例假设有两个 memcached 正在运行,一个在 host1 上,另一个在 host2 上。所有示例配置都假设您想要使用基于 kryo 的序列化。

粘性会话 + kryo 示例

以下示例显示了第一个 tomcat 的配置,假设它在 host1 上运行,同时运行 memcached“n1”。该属性failoverNodes="n1"告诉 msm 最好将会话存储在 memcached“n2”中,并且只有在没有其他 memcached 节点(这里只有 n2)可用时才将会话存储在“n1”(在同一主机/机器上运行)(即使 host1 完全关闭,会话仍然在 memcached“n2”中可用,并且可以由 host2 上的 tomcat 提供服务)。对于第二个 tomcat(在 host2 上),您只需将故障转移节点更改为“n2”,以便它优先使用 memcached“n1”。其他所有内容都应保持不变。

<Context>
  ...
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"
    failoverNodes="n1"
    requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>

非粘性会话 + kryo 示例

以下示例显示了非粘性会话的配置。在这种情况下,不需要failoverNodes,因为会话由所有 tomcat 循环提供服务,并且它们不绑定到单个 tomcat。对于非粘性会话,配置(针对两个/所有 tomcat)将如下所示:

<Context>
  ...
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"
    sticky="false"
    sessionBackupAsync="false"
    lockingMode="uriPattern:/path1|/path2"
    requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>

非粘性会话 + kryo + Redis 示例

以下示例显示了使用 URL 为“redis.example.com”的 Redis 服务器存储非粘性会话的配置。此处的配置(针对两个/所有 tomcat)如下所示:

<Context>
  ...
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="redis://redis.example.com"
    sticky="false"
    sessionBackupAsync="false"
    lockingMode="uriPattern:/path1|/path2"
    requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>

配置支持将 userinfo 作为受密码保护的 Redis 节点的 URI 的一部分。格式为“redis://: password@redis.example.com :portnumber”。如果未指定 portnumber,则使用默认端口 6379。Redis 的内置支持目前不允许连接到多个 Redis 节点,也不支持 failoverNodes 属性。但是,使用 Redis,可以通过构建 Redis 集群直接在 Redis 中实现自动故障转移。例如,Amazon ElastiCache for Redis 实现了故障转移模式,该模式不断将所有数据从主节点复制到一个或多个从属节点,然后,如果主节点发生故障,则将另一个节点提升为主节点,并在此过程中更改主节点的 DNS 条目以指向新的主节点。MSM 通过在连接断开时自动重新连接到 Redis 服务器来支持此模式,可能会获取新的 DNS 设置并因此连接到新的主节点。将来可能会添加对 Redis Sentinel 或 Redis Cluster 的支持。

使用 Couchbase + kryo 的非粘性会话示例

要连接到 membase bucket“bucket1”,配置如下:

<Context>
  ...
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="http://host1.yourdomain.com:8091/pools"
    username="bucket1"
    password="topsecret"
    memcachedProtocol="binary"
    sticky="false"
    sessionBackupAsync="false"
    requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>

多个上下文共享同一个会话 ID 的示例

如果您正在运行多个共享相同会话 ID 的 Web 应用程序/上下文(例如通过设置sessionCookiePath="/"- 或emptySessionPath="true"在 tomcat 6 中),则必须告诉 memcached 会话管理器在将会话存储在 memcached 中时向会话 ID 添加前缀。为此,您可以使用storageKeyPrefix此示例所示的属性(另请参阅下面更详细的属性描述):

<Context sessionCookiePath="/">
  ...
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"
    failoverNodes="n1"
    storageKeyPrefix="context"
    requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>

以下部分提供了所有配置属性的更多详细信息。

在元素中配置 msm 后Context/Manager,您可以启动应用程序,会话将按照配置存储在 memcached 节点或 membase 中。现在您应该使用模拟 tomcat 故障、memcached 节点重新启动等进行一些测试。- 玩得开心!:-)

示例

tomcat加入jar包

D:\apache-tomcat-8.5.40\lib

asm-9.7.jar

flexjson-3.3.jar

jedis-3.0.0.jar

memcached-session-manager-tc8-2.3.2.jarmemcached-session-manager-2.3.2jar

项目 maven依赖

<dependency>
    <groupId>de.javakaffee.msm</groupId>
    <artifactId>msm-kryo-serializer</artifactId>
    <version>1.9.7</version>
    <scope>runtime</scope>
</dependency>

配置 memcached-session-manager 为 管理器

D:\apache-tomcat-8.5.40\conf\context.xml

<Context> 
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 
	memcachedNodes="redis://:123456@127.0.0.1:6379"
	sticky="true"  
        sessionBackupAsync="false"  
        lockingMode="auto"  
	sessionBackupTimeout="5000"
        requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"  
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

    />
</Context>