使用 Apache ignite 的 Web 会话集群。会话在命中第二台服务器时无效
Web session clustering using Apache ignite. session invalid on hitting the 2nd server
以下是使用的组件
- 负载均衡器 - spring 启动 zuul ribbon
- 服务器 - tomcat7
- Web 应用程序 - spring 版本 4.1
- 缓存模式 - 分区
- 没有。节点数 - 2
- Web集群配置
https://apacheignite-mix.readme.io/docs/web-session-clustering
我有一个使用粘性会话的 Web 应用程序,我想使用 apache ignite 迁移到非粘性会话。我按照 apache ignite "web session clustering" 指南来实施更改。添加了一个负载均衡器,它以循环机制将流量路由到配置的节点列表。我 运行 节点 1 在端口 8080 上,节点 2 在端口 9090 上。两个节点都配置在功能区负载平衡器中。
按照指南中的说明更改配置后,我能够成功 运行 单节点。我能够在 visor
中使用以下命令查看 apache ignite 缓存中的会话和值
./ignitevisorcmd.sh
cache session-cache -scan
但是当我启动第二个节点并且请求到达节点 2 时,会话变得无效并且应用程序由于会话信息不可用而抛出错误。
我怀疑 tomcat 的节点 2 在调用 "apache-ignite" WebSessionFilter.class 之前创建了一个新会话,并且 tomcat 不知道 ignite 中已经存在一个会话。然后当 org.apache.ignite.cache.websession.WebSessionFilter 被调用时,它用 org.apache.ignite.cache.websession.WebSessionV2 包装新创建的 HttpSession 并作为新会话推送到缓存存储。仅供参考,我确实使用 SessionListener 用几个对象初始化会话。
以下是checks/trials我在发帖前所做的
- 我的配置与文档完全匹配。
- WebSessionFilter 在过滤器顺序中排在第一位
- 确认两个节点都已连接,使用状态命令
- 尝试缓存模式为"replicated"
- 尝试了 tomcat8 并发现了同样的问题。
默认-config.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
Alter configuration below as needed.
-->
<bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="cacheConfiguration">
<bean id="igniteCacheConfiguration" class="org.apache.ignite.configuration.CacheConfiguration">
<!-- Cache name. -->
<property name="name" value="session-cache"/>
<!-- Cache mode. -->
<property name="cacheMode" value="PARTITIONED"/>
<property name="backups" value="2"/>
<property name="statisticsEnabled" value="true"/>
<property name="managementEnabled" value="true" />
</bean>
</property>
</bean>
web.xml
<listener>
<listener-class>org.apache.ignite.startup.servlet.ServletContextListenerStartup</listener- class>
</listener>
<filter>
<filter-name>IgniteWebSessionsFilter</filter-name>
<filter-class>org.apache.ignite.cache.websession.WebSessionFilter</filter-class>
</filter>
<!-- You can also specify a custom URL pattern. -->
<filter-mapping>
<filter-name>IgniteWebSessionsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Specify Ignite configuration (relative to META-INF folder or Ignite_HOME). -->
<context-param>
<param-name>IgniteConfigurationFilePath</param-name>
<param-value>default-config.xml </param-value>
</context-param>
<!-- Specify the name of Ignite cache for web sessions. -->
<context-param>
<param-name>IgniteWebSessionsCacheName</param-name>
<param-value>session-cache</param-value>
</context-param>
pom.xml
<ignite.version>2.6.0</ignite.version>
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-core</artifactId>
<version> ${ignite.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-web</artifactId>
<version> ${ignite.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-log4j</artifactId>
<version>${ignite.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-spring</artifactId>
<version>${ignite.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
<version>1.1.0</version>
</dependency>
我需要了解需要做什么才能使 Web 会话与 2 个节点一起工作。
发现问题的根本原因是我们正在使用正在访问会话信息的 SessionRequestListeners。这些侦听器在 Apache Ignite WebFilter 之前被调用,导致在 Ignite 可以在 Ignite 的缓存中找到会话之前创建一个新会话。当调用 Apache Ignite WebFilter 时有一个新的会话可用,它只使用现有的会话并缓存它。
解决方案 - 使用过滤器代替关键侦听器并删除非关键侦听器及其现在的工作。
例如
已删除 org.springframework.web.context.request.RequestContextListener
在 IgniteFilter 之后按顺序添加 org.springframework.web.filter.RequestContextFilter
以下是使用的组件
- 负载均衡器 - spring 启动 zuul ribbon
- 服务器 - tomcat7
- Web 应用程序 - spring 版本 4.1
- 缓存模式 - 分区
- 没有。节点数 - 2
- Web集群配置 https://apacheignite-mix.readme.io/docs/web-session-clustering
我有一个使用粘性会话的 Web 应用程序,我想使用 apache ignite 迁移到非粘性会话。我按照 apache ignite "web session clustering" 指南来实施更改。添加了一个负载均衡器,它以循环机制将流量路由到配置的节点列表。我 运行 节点 1 在端口 8080 上,节点 2 在端口 9090 上。两个节点都配置在功能区负载平衡器中。
按照指南中的说明更改配置后,我能够成功 运行 单节点。我能够在 visor
中使用以下命令查看 apache ignite 缓存中的会话和值./ignitevisorcmd.sh cache session-cache -scan
但是当我启动第二个节点并且请求到达节点 2 时,会话变得无效并且应用程序由于会话信息不可用而抛出错误。
我怀疑 tomcat 的节点 2 在调用 "apache-ignite" WebSessionFilter.class 之前创建了一个新会话,并且 tomcat 不知道 ignite 中已经存在一个会话。然后当 org.apache.ignite.cache.websession.WebSessionFilter 被调用时,它用 org.apache.ignite.cache.websession.WebSessionV2 包装新创建的 HttpSession 并作为新会话推送到缓存存储。仅供参考,我确实使用 SessionListener 用几个对象初始化会话。
以下是checks/trials我在发帖前所做的
- 我的配置与文档完全匹配。
- WebSessionFilter 在过滤器顺序中排在第一位
- 确认两个节点都已连接,使用状态命令
- 尝试缓存模式为"replicated"
- 尝试了 tomcat8 并发现了同样的问题。
默认-config.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
Alter configuration below as needed.
-->
<bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="cacheConfiguration">
<bean id="igniteCacheConfiguration" class="org.apache.ignite.configuration.CacheConfiguration">
<!-- Cache name. -->
<property name="name" value="session-cache"/>
<!-- Cache mode. -->
<property name="cacheMode" value="PARTITIONED"/>
<property name="backups" value="2"/>
<property name="statisticsEnabled" value="true"/>
<property name="managementEnabled" value="true" />
</bean>
</property>
</bean>
web.xml
<listener>
<listener-class>org.apache.ignite.startup.servlet.ServletContextListenerStartup</listener- class>
</listener>
<filter>
<filter-name>IgniteWebSessionsFilter</filter-name>
<filter-class>org.apache.ignite.cache.websession.WebSessionFilter</filter-class>
</filter>
<!-- You can also specify a custom URL pattern. -->
<filter-mapping>
<filter-name>IgniteWebSessionsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Specify Ignite configuration (relative to META-INF folder or Ignite_HOME). -->
<context-param>
<param-name>IgniteConfigurationFilePath</param-name>
<param-value>default-config.xml </param-value>
</context-param>
<!-- Specify the name of Ignite cache for web sessions. -->
<context-param>
<param-name>IgniteWebSessionsCacheName</param-name>
<param-value>session-cache</param-value>
</context-param>
pom.xml
<ignite.version>2.6.0</ignite.version>
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-core</artifactId>
<version> ${ignite.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-web</artifactId>
<version> ${ignite.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-log4j</artifactId>
<version>${ignite.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-spring</artifactId>
<version>${ignite.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
<version>1.1.0</version>
</dependency>
我需要了解需要做什么才能使 Web 会话与 2 个节点一起工作。
发现问题的根本原因是我们正在使用正在访问会话信息的 SessionRequestListeners。这些侦听器在 Apache Ignite WebFilter 之前被调用,导致在 Ignite 可以在 Ignite 的缓存中找到会话之前创建一个新会话。当调用 Apache Ignite WebFilter 时有一个新的会话可用,它只使用现有的会话并缓存它。
解决方案 - 使用过滤器代替关键侦听器并删除非关键侦听器及其现在的工作。
例如 已删除 org.springframework.web.context.request.RequestContextListener 在 IgniteFilter 之后按顺序添加 org.springframework.web.filter.RequestContextFilter