K8 的 Infinispan 分布式缓存模式

问题描述 投票:0回答:1

我正在使用 infinispan 缓存来通信 K8 中部署的多个服务。我希望这些缓存是

  1. 仅复制到少数服务(不是全部),以便当一个服务终止时,它应该能够在重新启动时从另一个服务恢复其缓存)
  2. 可在特定服务中进行读/写/驱逐。

下面是我正在使用的缓存配置,此配置在使用公共库的所有服务中共享。

@PostConstruct
    public void init(){
        if(defaultCacheManager==null){
            defaultCacheManager = cacheManager();
        }
        for(String cacheName:cacheNames){
            createCache(defaultCacheManager,cacheName);
        }
    }

public Cache<String, String> createCache(DefaultCacheManager cacheManager, String cacheName) {
        return this.buildCache(cacheName, cacheManager, cacheExpiringEvictingConfig(cacheManager));
    }

    private Configuration cacheExpiringEvictingConfig(DefaultCacheManager cacheManager) {
        ConfigurationBuilder confBuilder = new ConfigurationBuilder();
        confBuilder.expiration().lifespan(200, TimeUnit.HOURS);
        confBuilder.memory().maxCount(1000000).whenFull(EvictionStrategy.REMOVE);
        confBuilder.clustering().cacheMode(CacheMode.DIST_ASYNC);
        return confBuilder.build();
    }

 private <K, V> Cache<K, V> buildCache(String cacheName, DefaultCacheManager cacheManager, Configuration configuration) {
        cacheManager.defineConfiguration(cacheName, configuration);
        Cache<K, V> cache = cacheManager.getCache(cacheName);
        return cache;
    }

如果有人可以完成此操作并为我提供更好的配置,该配置可以提供最佳性能(更快的读/写),因为我的服务严重依赖缓存。我还可以看到分布式在我的本地机器上使用单个 jvm 运行良好,但是当部署在 k8 中时。缓存未同步。

java spring-boot infinispan
1个回答
0
投票

为了使多个 Infinispan 实例相互连接,您需要在 DefaultCacheManager 的 GlobalConfiguration 中配置传输。

要配置在 Kubernetes 中工作的传输,您可以利用 Infinispan 附带的

jgroups-kubernetes.xml
堆栈。您可以按如下方式配置:

  GlobalConfiguration globalConfig = new GlobalConfigurationBuilder()
    .transport()
        .defaultTransport()
        .addProperty("configurationFile", "default-configs/default-jgroups-kubernetes.xml")
        .build();
  DefaultCacheManager cacheManager = new DefaultCacheManager(globalConfig)

此配置将利用 JGroups DNS_PING 协议基于 k8s 服务建立集群成员资格。您需要创建一个引用所有包含 Infinispan 的应用程序 pod 的无头 k8s 服务,然后通过设置 java 属性

-Djgroups.dns.query=$SERVICE_NAME.$NAMESPACE.svc.cluster.local
来配置 DNS_PING 协议。

有关工作示例,请参阅我们的 Kubernetes 简单教程

© www.soinside.com 2019 - 2024. All rights reserved.