多个Xodus应用程序可访问/共享单个目录

时间:2019-07-11 19:01:21

标签: java xodus

根据此post

的评论
  

“我有xodus目录,我希望在两个应用程序之间共享。   一个具有读/写访问权,另一个具有只读访问权。   除了创建环境以外的任何其他方式   Environments.newInstance(“ xodusDir”);用于对xodus的只读访问   数据库..我只需要从其他人对xodus的只读访问权限   应用程序。”

回答

  

“这将在即将发布的1.3.0版中实现。”

这是否意味着可以有多个进程来创建指向同一目录的Environments / Persistent Storage:

  Environment environment = getEnvironment(xodusRoot, dir);
  final PersistentEntityStore store = PersistentEntityStores.newInstance(environment);

使用这种拓扑:

enter image description here

这是否可行,或者有解决方法?

据我所知,xd.lck防止两个实例访问相同的Xodus目录。

1 个答案:

答案 0 :(得分:3)

从1.3.0版开始,您可以忽略锁定以只读模式打开数据库:

final EnvironmentConfig config = new EnvironmentConfig().
            setLogDataReaderWriterProvider("jetbrains.exodus.io.WatchingFileDataReaderWriterProvider").
            setLogCacheShared(false).
            setMemoryUsagePercentage(1);
final Environment env = Environments.newInstance(dir, config);
final PersistentEntityStore store = PersistentEntityStores.newInstance(env);

它不仅忽略锁,而且还使用java.nio.file.WatchService自动获取新数据。

通常可以打开一个实例Environment / EntityStore(主要实例),并且可以如上所述打开多个实例(次要实例)。您的代理服务器应正确分配流量,以使辅助实例不会收到写请求。显然,您的应用程序必须解决这种架构无法避免的最终一致性问题。

辅助实例可以在任何JVM中打开。如果您在用于打开主实例的同一JVM中打开辅助实例,请密切注意内存使用情况,因为辅助实例不使用共享日志缓存。主实例(如果不使用setMemoryUsagePercentage)会消耗最大堆内存的50%。如果整体内存使用率百分比不超过50-55%(这取决于您使用的是什么GC和使用什么GC设置),那是很好的。

如果您在单独的JVM中打开辅助实例,请跳过上面代码中的setLogCacheSharedsetMemoryUsagePercentage设置。您唯一需要配置的就是观看DataReaderWriterProvider。

使用1.3.91版本,您甚至可以在不同主机上的辅助实例上运行JVM。每个主机应在其文件系统上具有数据库的副本,可以按以下方式打开它:

final EnvironmentConfig config = new EnvironmentConfig().
            setLogDataReaderWriterProvider("jetbrains.exodus.io.WatchingFileDataReaderWriterProvider");
final Environment env = Environments.newInstance(dir, config);
final PersistentEntityStore store = PersistentEntityStores.newInstance(env);

与基础架构唯一要做的额外事情是提供数据库更改的定期同步。 1.3.91版已经过测试,可以与rsync配合使用。在大多数情况下,每5-10秒进行一次同步就可以了,尽管较高的写入工作量会导致一些同步延迟。