Spring 数据 GemFire DiskStore

Spring Data GemFire DiskStore

我需要使用 Spring Data GemFire 将 Region 中的数据保存到磁盘。

使用下面的配置(LocatorServer 使用 Gfsh 启动):

@EnablePdx
@ClientCacheApplication
@EnableDiskStore(name = "disk_store")
@EnableClusterConfiguration(useHttp = true)
@EnableEntityDefinedRegions(basePackages = "xxx.entity")
@EnableGemfireRepositories(basePackages = "xxx.repository")
public class GeodeClientConfiguration {

}

配置如下:

spring.data.gemfire.disk.store.name=disk_store
spring.data.gemfire.disk.store.directory.location=C:\apache-geode-1.9.0\diskstore

上面的配置创建了一个DiskStore(一旦存储数据的代码是运行)。 问题是一旦服务器停止,磁盘存储就会被删除。

查看 John Blum 的文档和示例无济于事。

还尝试使用 Gfsh 创建 DiskStore 但最终有多个 DiskStores 并且在 [=33= 中创建的磁盘存储中没有数据]Gfsh。

知道我可能遗漏了什么吗?

谢谢

即使有你上面的Java配置,你的安排对我来说还是有点unclear/ambiguous。然而,让我们从我们所知道的开始吧。

首先,从上面的 Java 配置可以清楚地看出,您正在创建一个 ClientCacheSpring 应用程序来连接和send/receive 数据 to/from 一个独立的 GemFire 集群。

您还声明您正在使用 Gfsh[=116= 启动 LocatorServer(s) ].目前一切正常。

但是,你有...

1) 在没有使用 clientRegionShortcut 属性指定备用数据策略的情况下,使用 @EnableEntityDefinedRegions 注释了您的客户端应用程序 class(这很好)。默认情况下,clientRegionShortcut 设置为 PROXY(请参阅 here), which means 您的客户端应用程序不保持本地状态。

2) 然后,您使用 @EnableDiskStore 注释在客户端上定义一个 DiskStore(即 "disk_store"),这可能不是您想要的,因为当前没有本地状态保留在客户端区域。

NOTE: @EnableClusterConfiguration does not push configuration meta-data for DiskStores up to the server from the client. Currently, it only pushes Region and Index configuration meta-data up to the servers, as defined on the client.

否则,Spring(对于 GemFire)配置(使用注释)的其余部分似乎没问题。

NOTE: Also keep in mind that the @EnableClusterConfiguration annotation is careful not to stomp on existing Regions on the server-side. If the same Regions by name already exist, then the server will not apply the definition sent by the client when declaring the @EnableClusterConfiguration annotation (i.e. the annotation will not "nuke-and-pave"). That is by design, primarily to protect against data loss.

NOTE: I also recommend that you use the type-safe alternative to the basePackages attribute, in both the @EnableEntityDefinedRegions and @EnableGemfireRepositories annotations, the basePackageClasses attribute. It can refer to 1 or more Classes, but that class type is only used to determine the package from which to begin the scan. For example, you can set the @EnableEntityDefinedRegions, basePackageClasses to example.app.customers.model.Customer.class and example.app.products.model.Product.class as in @EnableEntityDefinedRegions(basePackageClasses = { Customer.class, Product.class }) and SDG will use the package declaration of these classes to begin the Scan for Entity classes (sub-packages included). You do not need to list all (or multiple) classes from the package; 1 per (top-level) package from where you want to scan will suffice. It is good to limit the scan.

因此,对于您的情况,您可能需要执行以下操作:

在客户端上:

@EnablePdx
@ClientCacheApplication
@EnableClusterConfiguration(useHttp = true)
@EnableEntityDefinedRegions(basePackageClasses = EntityType.class)
@EnableGemfireRepositories(basePackageClasses = RepositoryType.class)
public class GeodeClientConfiguration {

}

然后,在服务器上,要"persist" 数据,要创建"PERSISTENT" 区域。您可以通过以下 2 种方式之一完成此操作:

1)首先,可以配置客户端,使用@EnableClusterConfiguration注解,在创建匹配的Region(按名称)时告诉服务器,按照客户端的定义,创建一个"PERSISTENT" 地区。默认情况下,client-side @EnableClusterConfiguration 注释告诉服务器创建一个 non-persistent PARTITION 区域(参见 here)。因此,您可以将客户端配置中的 @EnableClusterConfiguration 注释更改为:

@ClientCacheApplication
@EnableClusterConfiguration(useHttp = true, serverRegionShortcut = RegionShortcut.PARTITION_PERSISTENT)
...
class GeodeClientConfiguration { ... }

您可以使用任何 non-LOCAL、"PERSISTENT"、RegionShortcut、区域(数据策略)类型(参见 here)...主要是 [PARTITION_PERSISTENT* 和 REPLICATE_PERSISTENT*].

然后,当客户端将Region配置meta-data推送到服务器时,服务器将创建一个具有相同名称和指定(数据策略)类型(由@EnableClusterConfiguration定义的区域)注释的 serverRegionShortcut 属性)。

再次请记住,如果该区域已经存在,则不会 re-create 该区域。如果您想让客户端在(每个应用程序)重新启动时创建区域,则需要使用 Gfsh.

销毁该区域

2) 或者,您可以使用 Gfsh 创建区域,使用:

gfsh> create region --name=Example --type=PARTITION_PERSISTENT

最后,当涉及到 DiskStore 时,因为您没有本地状态区域,即使您有,您可能想要数据 "persisted" server-side,然后如果您什么都不做,只是使用上述 2 种方法中的一种,使用 "PERSISTENT" 数据策略声明 server-side 区域,那么默认情况下,GemFire 会写入 "DEFAULT" DiskStore.

如果您想将 "specific" DiskStore(按名称)与区域(例如 "Example")相关联,那么您必须首先创建 DiskStore使用 Gfsh:

gfsh> create disk-store --name=disk_store ...

参见 here

然后,使用 Gfsh:

创建区域
gfsh> create region --name=Example --type=PARTITION_PERSISTENT --disk-store=disk_store ...

参见 here

如果您将逐出配置为 "OVERFLOW_TO_DISK"(参见 here),DiskStore 既用于 "persist" 数据,也用于将数据溢出到磁盘。

从 #2(创建区域)开始(使用 DiskStore 创建),全部是 server-side。

无论如何,我希望所有这些都有意义并有所帮助。

如果您有其他疑问或问题,请随时在评论中跟进。

谢谢。