6.7. 全局持久性位置
Data Grid 保留全局状态,以便它在重启后可以恢复集群拓扑和缓存的数据。
Data Grid 使用文件锁定来防止并发访问全局持久位置。锁定在启动时获取,并在节点关闭时释放。存在悬停的锁定文件表示节点没有完全关闭,无论是因为崩溃或外部终止而被完全关闭。在默认配置中,Data Grid 将拒绝启动以避免出现以下消息的数据损坏:
ISPN000693: Dangling lock file '%s' in persistent global state, probably left behind by an unclean shutdown
通过将全局状态 unclean-shutdown-action
设置配置为以下之一来更改行为:
-
FAIL
: 如果 dangling 锁定文件处于持久的全局状态,则缓存管理器的启动。这是默认的行为。 -
PURGE
:清除持久的全局状态,如果 dangling 锁定文件处于持久全局状态。 -
IGNORE
:忽略持久性全局状态下形锁定文件。
远程缓存
Data Grid 服务器将集群状态保存到 $RHDG_HOME/server/data
目录中。
您不应该删除或修改 server/data
目录或其内容。在重启服务器实例时,Data Grid 从此目录恢复集群状态。
更改默认配置或直接修改 server/data
目录可能会导致意外行为,并导致数据丢失。
嵌入式缓存
Data Grid 默认为 user.dir
系统属性作为全局持久位置。在大多数情况下,这是应用程序启动的目录。
对于复制或分布式集群嵌入式缓存,您应该始终启用并配置全局持久位置来恢复集群拓扑。
您永远不会为基于文件的缓存存储配置绝对路径,该存储位于全局持久位置之外。如果您这样做,Data Grid 会将以下例外写入日志:
ISPN000558: "The store location 'foo' is not a child of the global persistent location 'bar'"
6.7.1. 配置全局持久位置
启用并配置 Data Grid 存储集群嵌入式缓存的全局状态的位置。
Data Grid 服务器实现全局持久性并配置默认位置。您不应该禁用全局持久性或更改远程缓存的默认配置。
先决条件
- 将 Data Grid 添加到您的项目。
流程
使用以下方法之一启用全局状态:
-
将
global-state
元素添加到您的 Data Grid 配置中。 -
在
GlobalConfigurationBuilder
API 中调用globalState ().enable ()
方法。
-
将
定义全局持久位置是否对每个节点是唯一的,还是在集群间共享。
位置类型 配置 每个节点的唯一
persistent-location
元素或persistentLocation ()
方法在集群中共享
shared-persistent-location
元素或sharedPersistentLocation (String)
方法设置 Data Grid 存储集群状态的路径。
例如,基于文件的缓存存储了路径是主机文件系统上的目录。
值可以是:
- 绝对并包含完整位置,包括 root 用户。
- 相对于根位置。
如果为路径指定相对值,还必须指定一个解析为根位置的系统属性。
例如,在 Linux 主机系统中,您将
global/state
设置为路径。您还可以设置解析到/opt/data
根位置的my.data
属性。在这种情况下,Data Grid 使用/opt/data/global/state
作为全局持久位置。
全局持久性位置配置
XML
<infinispan> <cache-container> <global-state> <persistent-location path="global/state" relative-to="my.data"/> </global-state> </cache-container> </infinispan>
JSON
{ "infinispan" : { "cache-container" : { "global-state": { "persistent-location" : { "path" : "global/state", "relative-to" : "my.data" } } } } }
YAML
cacheContainer: globalState: persistentLocation: path: "global/state" relativeTo : "my.data"
GlobalConfigurationBuilder
new GlobalConfigurationBuilder().globalState() .enable() .persistentLocation("global/state", "my.data");