用于第二个Hibernate缓存的Hazelcast实例在Kubernetes中无法稳定连接
Iam使用部署在Kubernetes(GKE)中的嵌入式Hazelcast在Spring Boot应用程序中启用二级缓存休眠。Spingboot应用程序使用扳手jdbc()连接到扳手。 我将1个服务(副本=2)部署到k8s,但是位于2个POD中的hazelcast实例无法稳定连接(它在服务器启动时工作,但之后似乎断开了连接,请查看下面的日志)。这导致2个吊舱之间无法共享2级缓存。有人能帮上忙吗?多谢各位用于第二个Hibernate缓存的Hazelcast实例在Kubernetes中无法稳定连接,hibernate,spring-boot,kubernetes,hazelcast,Hibernate,Spring Boot,Kubernetes,Hazelcast,Iam使用部署在Kubernetes(GKE)中的嵌入式Hazelcast在Spring Boot应用程序中启用二级缓存休眠。Spingboot应用程序使用扳手jdbc()连接到扳手。 我将1个服务(副本=2)部署到k8s,但是位于2个POD中的hazelcast实例无法稳定连接(它在服务器启动时工作,但之后似乎断开了连接,请查看下面的日志)。这导致2个吊舱之间无法共享2级缓存。有人能帮上忙吗?多谢各位 <groupId>com.hazelcast.poc</groupId&g
<groupId>com.hazelcast.poc</groupId>
<artifactId>hazelcast-poc</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hazelcast-poc</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>nl.topicus</groupId>
<artifactId>spanner-jdbc</artifactId>
<version>1.0.8</version>
</dependency>
<dependency>
<groupId>nl.topicus</groupId>
<artifactId>spanner-hibernate</artifactId>
<version>0.7</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast</artifactId>
<version>3.11</version>
</dependency>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-hibernate5</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-kubernetes</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.8.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.uuid</groupId>
<artifactId>java-uuid-generator</artifactId>
<version>3.1.5</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.0.1.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
}
deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hazelcast-embedded-0
spec:
replicas: 2
selector:
matchLabels:
app: hazelcast-embedded-0
template:
metadata:
labels:
app: hazelcast-embedded-0
spec:
volumes:
- name: hazelcast-key
secret:
secretName: hazelcast-key
containers:
- name: hazelcast-embedded
image: gcr.io/testproject-221915/hazelcast- poc@sha256:5a103d7e2e56c46e9e42617232e472891bda5d121139fe7e41057596bd71bf00
imagePullPolicy: Always
volumeMounts:
- name: hazelcast-key
mountPath: /var/secrets/google
env:
- name: GOOGLE_APPLICATION_CREDENTIALS
value: /var/secrets/google/key.json
ports:
- containerPort: 5701
- containerPort: 8080
apiVersion: v1
kind: Service
metadata:
name: hazelcast-embedded-0
spec:
type: LoadBalancer
selector:
app: hazelcast-embedded-0
ports:
- name: hazelcast
port: 5701
- name: app
port: 8080
扳手数据源文件:
@Bean
public LocalContainerEntityManagerFactoryBean spannerEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(spannerDataSource());
em.setPersistenceUnitName("SpannerPU");
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
HashMap<String, Object> properties = new HashMap<>();
properties.put("hibernate.dialect", "nl.topicus.hibernate.dialect.CloudSpannerDialect");
properties.put("hibernate.temp.use_jdbc_metadata_defaults", false);
properties.put("hibernate.show_sql", showSql);
properties.put("hibernate.format_sql", formatSql);
properties.put("hibernate.cache.use_query_cache", true);
properties.put("hibernate.cache.use_second_level_cache", true);
properties.put("hibernate.cache.region.factory_class", "com.hazelcast.hibernate.HazelcastCacheRegionFactory");
if("development".equals(profileActive)) {
properties.put("hibernate.generate_statistics", statistic);
properties.put("org.hibernate.stat", hibernateStat);
}
em.setJpaPropertyMap(properties);
return em;
}
如您所见,第二个日志只有1个成员,而第一个日志有2个成员。
我通过向服务发出rest请求进行测试,然后将该请求分发到每个POD,测试结果有时是缓存在两个POD之间共享,有时不是
我希望第二个Hibernate缓存应该在服务中的两个pod之间共享您正在创建两个Hazelcast实例 9:36:44.990一个kubernetes发现实例 9:36:53.706一个多播发现实例 可能又来了
设置
hibernate.cache.hazelcast.instance_name
系统属性和config.setInstanceName(“任意”)
配对应该匹配你能分享完整的日志吗(没有| grep成员
)?嗨@RafałLeszko,我刚刚用pod1和pod2的日志更新了帖子。我试图翻译日志中的一行“配置种子端口为5701,集群大小为1。一些端口似乎已被占用!”。你有什么想法吗?谢谢,如果我们这样设置,那么两个吊舱将使用相同的hazelcast实例。您能否解释为什么不同POD的不同hazelcast实例会导致此问题。另外,为什么需要同时设置系统属性和代码?@TomHo通过配置,您的Spring Boot应用程序在同一个应用程序中创建了两个实例,一个是您配置的,另一个是用于Hibernate。Neil提到的参数是通知hazelcast hibernate模块不要创建单独的实例,而是使用已经创建的实例。如果您有两个POD,它们仍将创建自己的实例,但仅使用Kubernetes发现。
@Bean
public LocalContainerEntityManagerFactoryBean spannerEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(spannerDataSource());
em.setPersistenceUnitName("SpannerPU");
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
HashMap<String, Object> properties = new HashMap<>();
properties.put("hibernate.dialect", "nl.topicus.hibernate.dialect.CloudSpannerDialect");
properties.put("hibernate.temp.use_jdbc_metadata_defaults", false);
properties.put("hibernate.show_sql", showSql);
properties.put("hibernate.format_sql", formatSql);
properties.put("hibernate.cache.use_query_cache", true);
properties.put("hibernate.cache.use_second_level_cache", true);
properties.put("hibernate.cache.region.factory_class", "com.hazelcast.hibernate.HazelcastCacheRegionFactory");
if("development".equals(profileActive)) {
properties.put("hibernate.generate_statistics", statistic);
properties.put("org.hibernate.stat", hibernateStat);
}
em.setJpaPropertyMap(properties);
return em;
}
spanner.datasource.className=nl.topicus.jdbc.CloudSpannerDriver
spanner.datasource.url=jdbc:cloudspanner://;Project=testproject-
221915;Instance=test-hazelcast;Database=hazelcast
spanner.hibernate.dialect=
nl.topicus.hibernate.dialect.CloudSpannerDialect
spanner.hibernate.show-sql=true
spanner.hibernate.format_sql=true
spanner.datasource.hikari.maximum-pool-size=2 #depend on
microservice
spanner.datasource.hikari.minimum-idle=2
spanner.datasource.hikari.connection-timeout=60000
spring.profiles.active=dev
hibernate.generate_statistics=true
org.hibernate.stat=DEBUG