可靠的基于键值文件的存储 with/without XA 事务
Reliable Key-Value File-Based Storage with/without XA Transactions
问题
我目前正在为一个相当老的系统实施解决方案,它需要一个轻量级键值基于文件(一个一个键的值存储为一个文件)存储与简单的类似 ConcurrentHashMap 的操作:put()、delete()、get() 和 listAll() 操作。
它必须提供具有全功能事务行为(ACID + 可重复读取隔离)的并发读写操作的能力。
看起来这个组件看起来应该与 TableFS 非常相似...
接近
最初的想法是采用轻量级可嵌入持久键值存储,并使用它来存储位于文件系统中的值文件的元数据(文件键、文件路径、大小、其他属性...) .此外,它应该提供一个基于索引的快速文件搜索引擎。所以,这样的存储起到了寄存器的作用...
我一直在寻找这样的键值存储,可以满足以下要求:
- 开源;
- 可嵌入;
- 提供对Java地图和集合的支持;
- 机器crash/power-off容差(预写日志和其他方法);
- 提供 ACID 交易;
- 作为读写存储(与只读的 PalDB 相比)。
并提出了 MapDb 和 LevelDb 选项。
为了保证read/write用户事务的并发解析,我需要建立全局的XA事务,涉及key-value存储和文件系统。对于文件系统,有 XADisk 和 Jakarta Commons-Transactions 事务系统,对于全局架构,还有 Atomikos Essintials 事务管理器。
但是,我找不到任何解释如何使用 XA 事务管理器配置 MapDB 或 LevelDB 的文章...
问题
能否请您在以下方面提出建议?
- 我的方法是否有意义,或者对于所描述的问题有一些众所周知的solutions/implementations?
- 在这个task/approach中你能看出什么陷阱?
- 是否有任何资源描述如何配置此类键值存储以参与 xa 事务?
更新
还有另一个数据库 - SQLite - 可以与 Atomikos 集成。它不模仿 Java 集合,但很容易手动模拟所有操作。目前我能看到的唯一缺陷是通过并发事务解决并发密钥修改的方法(丢失更新问题)。似乎需要编写一种具有基于密钥时间戳的测试和设置功能的存储过程...
好吧,最后,我想出了一个实现我的任务的想法,即使没有 XA 事务、文件锁和其他过于复杂的事情。
如果有人感兴趣,请在 GitHub、following this link 查看我的项目。该描述将很快添加到 GitHub 项目中。希望现在代码是不言自明的。
问题
我目前正在为一个相当老的系统实施解决方案,它需要一个轻量级键值基于文件(一个一个键的值存储为一个文件)存储与简单的类似 ConcurrentHashMap 的操作:put()、delete()、get() 和 listAll() 操作。 它必须提供具有全功能事务行为(ACID + 可重复读取隔离)的并发读写操作的能力。
看起来这个组件看起来应该与 TableFS 非常相似...
接近
最初的想法是采用轻量级可嵌入持久键值存储,并使用它来存储位于文件系统中的值文件的元数据(文件键、文件路径、大小、其他属性...) .此外,它应该提供一个基于索引的快速文件搜索引擎。所以,这样的存储起到了寄存器的作用...
我一直在寻找这样的键值存储,可以满足以下要求:
- 开源;
- 可嵌入;
- 提供对Java地图和集合的支持;
- 机器crash/power-off容差(预写日志和其他方法);
- 提供 ACID 交易;
- 作为读写存储(与只读的 PalDB 相比)。
并提出了 MapDb 和 LevelDb 选项。
为了保证read/write用户事务的并发解析,我需要建立全局的XA事务,涉及key-value存储和文件系统。对于文件系统,有 XADisk 和 Jakarta Commons-Transactions 事务系统,对于全局架构,还有 Atomikos Essintials 事务管理器。
但是,我找不到任何解释如何使用 XA 事务管理器配置 MapDB 或 LevelDB 的文章...
问题
能否请您在以下方面提出建议?
- 我的方法是否有意义,或者对于所描述的问题有一些众所周知的solutions/implementations?
- 在这个task/approach中你能看出什么陷阱?
- 是否有任何资源描述如何配置此类键值存储以参与 xa 事务?
更新
还有另一个数据库 - SQLite - 可以与 Atomikos 集成。它不模仿 Java 集合,但很容易手动模拟所有操作。目前我能看到的唯一缺陷是通过并发事务解决并发密钥修改的方法(丢失更新问题)。似乎需要编写一种具有基于密钥时间戳的测试和设置功能的存储过程...
好吧,最后,我想出了一个实现我的任务的想法,即使没有 XA 事务、文件锁和其他过于复杂的事情。
如果有人感兴趣,请在 GitHub、following this link 查看我的项目。该描述将很快添加到 GitHub 项目中。希望现在代码是不言自明的。