添加序列化配置后Infinispan Server在K8s中启动失败
Infinispan配置serialization标签后启动失败的解决方法
问题根因
你配置的JavaSerializationMarshaller与Infinispan默认的ProtostreamMarshaller序列化格式不兼容。之前服务启动时,持久化存储(比如SingleFileStore)里的数据是用Protostream格式写入的,切换为Java序列化Marshaller后,启动过程中重建索引时无法解析旧数据,因此抛出java.io.StreamCorruptedException: invalid stream header: 9801ED07错误。
解决方案
1. 清理旧持久化数据(数据可丢弃时)
如果存储的数据不需要保留,直接删除Kubernetes中Infinispan对应的PersistentVolumeClaim(PVC),重新启动Pod即可。新的配置会用Java序列化格式写入全新的数据,不会再出现解析错误。
2. 针对特定缓存配置Java序列化(需保留全局默认格式时)
如果需要保留全局默认的Protostream序列化,仅对特定缓存使用Java序列化,可修改配置如下:
<infinispan> <cache-container> <!-- 全局保持默认的ProtostreamMarshaller --> <local-cache name="target-cache"> <!-- 仅该缓存使用Java序列化 --> <serialization marshaller="org.infinispan.commons.marshall.JavaSerializationMarshaller"> <allow-list> <class>org.keycloak.cluster.infinispan.WrapperClusterEvent</class> <class>java.time.Instant</class> <regex>.*</regex> </allow-list> </serialization> </local-cache> </cache-container> </infinispan>
3. 数据迁移(需保留旧数据且全局切换序列化时)
如果必须全局使用JavaSerializationMarshaller同时保留旧数据,需要先通过Infinispan的导出工具将旧数据导出为通用格式,然后切换配置后再导入数据。
补充说明
Infinispan 13.x默认采用Protostream作为序列化方案,相比Java序列化,它具备更高的性能和安全性。除非有兼容旧系统等特殊需求,不建议全局替换为JavaSerializationMarshaller。
内容的提问来源于stack exchange,提问作者satanshiro
相关产品推荐
相关产品推荐

