根据此post
的评论“我有xodus目录,我希望在两个应用程序之间共享。 一个具有读/写访问权,另一个具有只读访问权。 除了创建环境以外的任何其他方式 Environments.newInstance(“ xodusDir”);用于对xodus的只读访问 数据库..我只需要从其他人对xodus的只读访问权限 应用程序。”
回答
“这将在即将发布的1.3.0版中实现。”
这是否意味着可以有多个进程来创建指向同一目录的Environments / Persistent Storage:
Environment environment = getEnvironment(xodusRoot, dir);
final PersistentEntityStore store = PersistentEntityStores.newInstance(environment);
使用这种拓扑:
这是否可行,或者有解决方法?
据我所知,xd.lck
防止两个实例访问相同的Xodus目录。
答案 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中打开辅助实例,请跳过上面代码中的setLogCacheShared
和setMemoryUsagePercentage
设置。您唯一需要配置的就是观看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秒进行一次同步就可以了,尽管较高的写入工作量会导致一些同步延迟。