Spring 数据 GemFire DiskStore
Spring Data GemFire DiskStore
我需要使用 Spring Data GemFire 将 Region
中的数据保存到磁盘。
使用下面的配置(Locator 和 Server 使用 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 配置可以清楚地看出,您正在创建一个 ClientCache
、Spring 应用程序来连接和send/receive 数据 to/from 一个独立的 GemFire 集群。
您还声明您正在使用 Gfsh[=116= 启动 Locator 和 Server(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。
无论如何,我希望所有这些都有意义并有所帮助。
如果您有其他疑问或问题,请随时在评论中跟进。
谢谢。
我需要使用 Spring Data GemFire 将 Region
中的数据保存到磁盘。
使用下面的配置(Locator 和 Server 使用 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 配置可以清楚地看出,您正在创建一个 ClientCache
、Spring 应用程序来连接和send/receive 数据 to/from 一个独立的 GemFire 集群。
您还声明您正在使用 Gfsh[=116= 启动 Locator 和 Server(s) ].目前一切正常。
但是,你有...
1) 在没有使用 clientRegionShortcut
属性指定备用数据策略的情况下,使用 @EnableEntityDefinedRegions
注释了您的客户端应用程序 class(这很好)。默认情况下,clientRegionShortcut
设置为 PROXY
(请参阅 here), which means 您的客户端应用程序不保持本地状态。
2) 然后,您使用 @EnableDiskStore
注释在客户端上定义一个 DiskStore
(即 "disk_store"),这可能不是您想要的,因为当前没有本地状态保留在客户端区域。
NOTE:
@EnableClusterConfiguration
does not push configuration meta-data forDiskStores
up to the server from the client. Currently, it only pushesRegion
andIndex
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, thebasePackageClasses
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
toexample.app.customers.model.Customer.class
andexample.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。
无论如何,我希望所有这些都有意义并有所帮助。
如果您有其他疑问或问题,请随时在评论中跟进。
谢谢。