Infinispan 集群 REPL_ASYNC 缓存:命令在两个节点之间无限期地反弹
Infinispan clustered REPL_ASYNC cache: command indefinitely bounced between two nodes
Im 运行 spring 在 2 节点集群中使用 infinispan 10.1.8 启动应用程序。 2 个节点通过 jgroups TCP 进行通信。我配置了几个REPL_ASYNC.
问题:
其中一个缓存在某些时候导致两个节点一遍又一遍地交换相同的消息,从而导致高 CPU 和内存使用率。停止这种情况的唯一方法是停止两个节点之一。
更多细节,这里是配置。
org.infinispan.configuration.cache.Configuration replAsyncNoExpirationConfiguration = new ConfigurationBuilder()
.clustering()
.cacheMode(CacheMode.REPL_ASYNC)
.transaction()
.lockingMode(LockingMode.OPTIMISTIC)
.transactionMode(TransactionMode.NON_TRANSACTIONAL)
.statistics().enabled(cacheInfo.isStatsEnabled())
.locking()
.concurrencyLevel(32)
.lockAcquisitionTimeout(15, TimeUnit.SECONDS)
.isolationLevel(IsolationLevel.READ_COMMITTED)
.expiration()
.lifespan(-1) //entries do not expire
.maxIdle(-1) // even when they are idle for some time
.wakeUpInterval(-1) // disable the periodic eviction process
.build();
其中一个缓存(名为 formConfig
)导致我在两个节点之间通信异常,这是发生了什么:
- 我使用 jmeter 生成仅针对节点 1 的流量负载
- 有一段时间节点 2 通过 SingleRpcCommand 从节点 1 接收缓存条目,没有异常,甚至
formConfig
缓存行为正常
- 一段时间后,一个新的缓存条目被发送到
formConfig
缓存
此时,同一条消息似乎一直在两个节点之间跳动:
- 节点1发送条目
mn-node1.company.acme-develop sending command to all: SingleRpcCommand{cacheName='formConfig', command=PutKeyValueCommand{key=SimpleKey [form_config,MECHANICAL,DESIGN,et,7850]
- 节点 2 收到条目
mn-node2.company.acme-develop received command from mn-node1.company.acme-develop: SingleRpcCommand{cacheName='formConfig', command=PutKeyValueCommand{key=SimpleKey [form_config,MECHANICAL,DESIGN,et,7850]
- 节点 2 将条目发送回节点 1
mn-node2.company.acme-develop sending command to all: SingleRpcCommand{cacheName='formConfig', command=PutKeyValueCommand{key=SimpleKey [form_config,MECHANICAL,DESIGN,et,7850]
- 节点 1 收到条目
mn-node1.company.acme-develop received command from mn-node2.company.acme-develop: SingleRpcCommand{cacheName='formConfig', command=PutKeyValueCommand{key=SimpleKey [form_config,MECHANICAL,DESIGN,et,7850],
- 节点 1 将条目发送到节点 2,依此类推...
其他一些事情:
- 系统没有负载,jmeter 运行只有少数用户并行
- 即使停止 jmeter 这个循环也不会停止
formConfig
是唯一以这种方式运行的缓存。所有其他 REPL_ASYNC 缓存都正常工作。我只停用了 formConfig 缓存,系统工作正常。
- 我无法在我的机器上重现两个节点 运行 的问题
这里有更多 complete log file 包括来自两个节点的日志。
其他信息:
- opendjdk 11 热点
- spring 引导 2.2.7
- infinispan spring 引导程序 2.2.4
- 使用JbossUserMarshaller
我怀疑
- 与事务配置相关的东西
- 或者缓存对象serialization/deserialization相关的东西
唯一可能发生这种情况的情况是 SimpleKey
具有不同的 hashCode()
。
日志中是否有任何异常?在密钥的序列化和反序列化之后,您能否检查 hashCode()
是否相同?
Im 运行 spring 在 2 节点集群中使用 infinispan 10.1.8 启动应用程序。 2 个节点通过 jgroups TCP 进行通信。我配置了几个REPL_ASYNC.
问题: 其中一个缓存在某些时候导致两个节点一遍又一遍地交换相同的消息,从而导致高 CPU 和内存使用率。停止这种情况的唯一方法是停止两个节点之一。
更多细节,这里是配置。
org.infinispan.configuration.cache.Configuration replAsyncNoExpirationConfiguration = new ConfigurationBuilder()
.clustering()
.cacheMode(CacheMode.REPL_ASYNC)
.transaction()
.lockingMode(LockingMode.OPTIMISTIC)
.transactionMode(TransactionMode.NON_TRANSACTIONAL)
.statistics().enabled(cacheInfo.isStatsEnabled())
.locking()
.concurrencyLevel(32)
.lockAcquisitionTimeout(15, TimeUnit.SECONDS)
.isolationLevel(IsolationLevel.READ_COMMITTED)
.expiration()
.lifespan(-1) //entries do not expire
.maxIdle(-1) // even when they are idle for some time
.wakeUpInterval(-1) // disable the periodic eviction process
.build();
其中一个缓存(名为 formConfig
)导致我在两个节点之间通信异常,这是发生了什么:
- 我使用 jmeter 生成仅针对节点 1 的流量负载
- 有一段时间节点 2 通过 SingleRpcCommand 从节点 1 接收缓存条目,没有异常,甚至
formConfig
缓存行为正常 - 一段时间后,一个新的缓存条目被发送到
formConfig
缓存
此时,同一条消息似乎一直在两个节点之间跳动:
- 节点1发送条目
mn-node1.company.acme-develop sending command to all: SingleRpcCommand{cacheName='formConfig', command=PutKeyValueCommand{key=SimpleKey [form_config,MECHANICAL,DESIGN,et,7850]
- 节点 2 收到条目
mn-node2.company.acme-develop received command from mn-node1.company.acme-develop: SingleRpcCommand{cacheName='formConfig', command=PutKeyValueCommand{key=SimpleKey [form_config,MECHANICAL,DESIGN,et,7850]
- 节点 2 将条目发送回节点 1
mn-node2.company.acme-develop sending command to all: SingleRpcCommand{cacheName='formConfig', command=PutKeyValueCommand{key=SimpleKey [form_config,MECHANICAL,DESIGN,et,7850]
- 节点 1 收到条目
mn-node1.company.acme-develop received command from mn-node2.company.acme-develop: SingleRpcCommand{cacheName='formConfig', command=PutKeyValueCommand{key=SimpleKey [form_config,MECHANICAL,DESIGN,et,7850],
- 节点 1 将条目发送到节点 2,依此类推...
其他一些事情:
- 系统没有负载,jmeter 运行只有少数用户并行
- 即使停止 jmeter 这个循环也不会停止
formConfig
是唯一以这种方式运行的缓存。所有其他 REPL_ASYNC 缓存都正常工作。我只停用了 formConfig 缓存,系统工作正常。- 我无法在我的机器上重现两个节点 运行 的问题
这里有更多 complete log file 包括来自两个节点的日志。
其他信息:
- opendjdk 11 热点
- spring 引导 2.2.7
- infinispan spring 引导程序 2.2.4
- 使用JbossUserMarshaller
我怀疑
- 与事务配置相关的东西
- 或者缓存对象serialization/deserialization相关的东西
唯一可能发生这种情况的情况是 SimpleKey
具有不同的 hashCode()
。
日志中是否有任何异常?在密钥的序列化和反序列化之后,您能否检查 hashCode()
是否相同?