为什么我的 Apache Ignite 持久存储保持锁定状态?
Why is my Apache Ignite persistent store remaining locked?
我有一个使用 Apache Ignite 作为单节点集群的应用程序。也就是说,Ignite 是由应用程序启动和停止的,它的生命周期与应用程序匹配。
Ignite 缓存同时启用了持久存储和通读。所以,
- 首先调用 cache.get() --> 缓存中没有任何内容,通过
CacheAdapter
读取到后备存储(Oracle 数据库)并将条目加载到缓存中。
- 随后从缓存 cache.get() -> returns 调用
- 应用程序反弹,调用 cache.get() --> returns 来自缓存(来自持久存储)。 关键是它不会在应用程序反弹后读取到后备存储!
这一切似乎都运行良好。这是我的问题:有时(相当频繁)当应用程序被退回或重新部署时,持久存储 data
目录就 Apache Ignite 而言保持锁定状态。结果,Ignite 默默地创建了一个新的空持久存储,这违背了持久存储的全部目的。
我们的数据目录目前是这样的:
-sh-4.2$ pwd
/myapp/oracle/user_projects/domains/myapp_inst/igniteCache/myserver/data
-sh-4.2$ ls -ltr
total 48
drwxr-x---. 10 mygroup mygroup 4096 Jan 9 16:25 node00-7c02d9ab-7ef3-4d01-8ebd-d1184fa281a2
drwxr-x---. 10 mygroup mygroup 4096 Jan 9 17:28 node01-06a5d059-1b62-4ac2-84bf-5325deac8138
drwxr-x---. 10 mygroup mygroup 4096 Feb 4 15:39 node02-ba720d52-570a-448c-9109-75687ee664e7
drwxr-x---. 10 mygroup mygroup 4096 Feb 5 12:16 node03-d2c521aa-e0ee-471b-ad16-08af382a1e3d
drwxr-x---. 10 mygroup mygroup 4096 Feb 6 17:44 node04-505e754e-a3d3-48b1-a759-d5ec8867dc96
drwxr-x---. 10 mygroup mygroup 4096 Feb 6 18:23 node05-ec0f89e3-bfe5-4bb6-87da-302951439f66
drwxr-x---. 10 mygroup mygroup 4096 Feb 13 15:41 node06-5b9dc33a-42f6-4f1c-8d57-14d5ddb30dc5
drwxr-x---. 10 mygroup mygroup 4096 Feb 13 15:43 node07-47aacde5-2598-4a85-9383-761e569bb1d1
drwxr-x---. 10 mygroup mygroup 4096 Feb 13 15:47 node08-0374a51d-4b90-4e5a-9465-adabc900ea0b
drwxr-x---. 10 mygroup mygroup 4096 Feb 13 15:52 node09-610c69c6-35e0-4d74-90db-6be09bb77659
-rw-r-----. 1 mygroup mygroup 41 Feb 13 17:00 lock
drwxr-x---. 10 mygroup mygroup 4096 Feb 13 17:00 node10-f115d95b-7b76-41e0-bd32-966030331c9c
上面应该只有一个"nodeXX..."目录。
问题
- 我的应用程序可以做些什么来确保无论发生什么故障,持久存储锁都会被释放?
- 我可以在应用程序启动时做些什么来告诉 Ignite 打破或删除锁,而不是每次都创建一个新的空存储吗?
- 我可以在我的应用程序中做些什么来告诉 Ignite 这个持久存储是节点本地的,因此不需要锁吗?
真的,我能做些什么来解决这个问题。
请设置 Ignite ConsistentId:
igniteCfg.setConsistentId("My_Node_Id" + id);
https://apacheignite.readme.io/docs/distributed-persistent-store#section-persistence-path-management
在这种情况下,ignite会尝试获取文件锁并等待10秒,如果获取失败,则不会创建新文件夹,但会异常失败。
我有一个使用 Apache Ignite 作为单节点集群的应用程序。也就是说,Ignite 是由应用程序启动和停止的,它的生命周期与应用程序匹配。
Ignite 缓存同时启用了持久存储和通读。所以,
- 首先调用 cache.get() --> 缓存中没有任何内容,通过
CacheAdapter
读取到后备存储(Oracle 数据库)并将条目加载到缓存中。 - 随后从缓存 cache.get() -> returns 调用
- 应用程序反弹,调用 cache.get() --> returns 来自缓存(来自持久存储)。 关键是它不会在应用程序反弹后读取到后备存储!
这一切似乎都运行良好。这是我的问题:有时(相当频繁)当应用程序被退回或重新部署时,持久存储 data
目录就 Apache Ignite 而言保持锁定状态。结果,Ignite 默默地创建了一个新的空持久存储,这违背了持久存储的全部目的。
我们的数据目录目前是这样的:
-sh-4.2$ pwd
/myapp/oracle/user_projects/domains/myapp_inst/igniteCache/myserver/data
-sh-4.2$ ls -ltr
total 48
drwxr-x---. 10 mygroup mygroup 4096 Jan 9 16:25 node00-7c02d9ab-7ef3-4d01-8ebd-d1184fa281a2
drwxr-x---. 10 mygroup mygroup 4096 Jan 9 17:28 node01-06a5d059-1b62-4ac2-84bf-5325deac8138
drwxr-x---. 10 mygroup mygroup 4096 Feb 4 15:39 node02-ba720d52-570a-448c-9109-75687ee664e7
drwxr-x---. 10 mygroup mygroup 4096 Feb 5 12:16 node03-d2c521aa-e0ee-471b-ad16-08af382a1e3d
drwxr-x---. 10 mygroup mygroup 4096 Feb 6 17:44 node04-505e754e-a3d3-48b1-a759-d5ec8867dc96
drwxr-x---. 10 mygroup mygroup 4096 Feb 6 18:23 node05-ec0f89e3-bfe5-4bb6-87da-302951439f66
drwxr-x---. 10 mygroup mygroup 4096 Feb 13 15:41 node06-5b9dc33a-42f6-4f1c-8d57-14d5ddb30dc5
drwxr-x---. 10 mygroup mygroup 4096 Feb 13 15:43 node07-47aacde5-2598-4a85-9383-761e569bb1d1
drwxr-x---. 10 mygroup mygroup 4096 Feb 13 15:47 node08-0374a51d-4b90-4e5a-9465-adabc900ea0b
drwxr-x---. 10 mygroup mygroup 4096 Feb 13 15:52 node09-610c69c6-35e0-4d74-90db-6be09bb77659
-rw-r-----. 1 mygroup mygroup 41 Feb 13 17:00 lock
drwxr-x---. 10 mygroup mygroup 4096 Feb 13 17:00 node10-f115d95b-7b76-41e0-bd32-966030331c9c
上面应该只有一个"nodeXX..."目录。
问题
- 我的应用程序可以做些什么来确保无论发生什么故障,持久存储锁都会被释放?
- 我可以在应用程序启动时做些什么来告诉 Ignite 打破或删除锁,而不是每次都创建一个新的空存储吗?
- 我可以在我的应用程序中做些什么来告诉 Ignite 这个持久存储是节点本地的,因此不需要锁吗?
真的,我能做些什么来解决这个问题。
请设置 Ignite ConsistentId: igniteCfg.setConsistentId("My_Node_Id" + id); https://apacheignite.readme.io/docs/distributed-persistent-store#section-persistence-path-management
在这种情况下,ignite会尝试获取文件锁并等待10秒,如果获取失败,则不会创建新文件夹,但会异常失败。