我需要知道是否有任何嵌入式DBMS(最好是Java,不一定是关系型),它支持同一组db文件上的多个编写器应用程序(进程).BerkeleyDB支持多个读者,但只支持一个编写器.我需要多个作家和多个读者.
更新:
它不是多重连接问题.我的意思是我不需要多个连接到正在运行的DBMS应用程序(进程)来写入数据.我需要多个DBMS应用程序(进程)来提交相同的存储文件.
HSQLDB,H2,JavaDB(Derby)和MongoDB不支持此功能.
我认为可能存在一些禁止这种情况的文件系统限制.如果是这样,是否有一个文件系统允许单个文件上有多个编写器?
使用案例:用例是一个高吞吐量的集群系统,旨在将其大量业务日志条目存储到SAN存储中.将业务日志存储在每个服务器的单独文件中是不合适的,因为整个业务日志需要查询和索引功能.
因为"SAN通常是自己的常规设备通常无法通过常规网络访问的存储设备网络",所以我希望使用SAN网络带宽进行日志记录,同时将群集LAN带宽用于其他服务器到服务器和客户端服务器通信.
你基本上没有运气,除非你以某种方式改变你的要求.
首先,特别是在Unix系统上,没有什么可以阻止多个进程写入相同的文件.在单一系统上,这不会是一个问题,如果两个或多个写入在文件中的相同空间与实际写入的空间发生冲突,您将只有一个典型的竞争条件.由于它在单个系统上,因此在字节级别具有完美的分辨率.
那么,就多个进程写入同一个文件而言,游戏是如何协调的呢?如何确保他们不会互相走路.在Unix中,有一个基于操作系统的锁定机制可用于防止这种情况,但通常大多数系统实现一个中央服务器并协调它们通过该系统的所有写入,然后它在写入磁盘的同时减轻和处理任何冲突.
你的问题有两个问题.
一,你建议独立的日志流程不合作,他们不会共享信息并协调他们对卷的写入.那把扳手(一把大扳手)扔到那里工作.
其次,您建议不仅要将多个进程写入同一个卷,而且要写入的卷通过SAN共享.那是另一个扳手.
与NFS不同,SAN不支持"文件系统".相反,他们支持"存储".基本上是块级设备.一旦你通过一堆卷管理恶作剧,SAN实际上从操作系统的角度看起来非常"愚蠢".
我很确定你实际上可以在多台机器上安装一个卷,但我不确定是否可以实际写入多个设备.这有很好的理由.
简单地说,SAN是块级存储.例如,一个块是4K字节.这是SAN的"原子"工作单元.想要更改单个字节的数据?从SAN读取4K块,更改字节,然后写回4k块.
如果您有多台计算机认为它们具有对SAN存储的"通用"访问权限,并将其视为文件系统,那么您将拥有一个损坏的,损坏的文件系统.就这么简单.这些机器会在其他机器上写下他们认为块应该是什么样子的东西并用它们的本地版本粉碎它们.灾害.废墟.不开心.
甚至让一台机器写入SAN而另一台机器从中读取它也很棘手.它也很慢,因为读者可以对磁盘的内容做一些假设,所以它需要读取和重新读取块(它不能缓存任何东西,如文件系统TOC等,因为,它们'由于作家的活动而在它背后重新改变 - 所以,再次阅读......再次......).
NFS之类的东西"解决"了这个问题,因为你不再使用原始存储.而是使用实际的文件系统.
最后,将独立日志文件从服务器中流出是没有错的.他们仍然可以被查询.您只需重复查询并合并结果即可.
如果你有5台机器流,并且你想要"在12:00 pm到12:05 pm之间的所有活动",那么进行5次查询,每个日志存储一次,并合并结果.至于如何有效地查询日志数据,这是一个索引问题,而不是根据您的查询方式无法克服.如果按时间查询,则按时间(每分钟,每小时,等等)创建文件,然后扫描它们.如果您的系统"很少阅读",这不是什么大问题.如果你需要更复杂的索引,那么你需要提出其他的东西.
您可以使用数据库来编写文件和索引,但我怀疑您会发现许多人喜欢从他们无法控制的文件中读取,或者在其下面进行更改.
CouchDB可能会起作用,或者类似的东西,因为它具有特定的抗崩溃性,始终是一致的数据库格式.它的数据文件总是可由数据库实例读取.这可能是你的选择.
但我仍然会做多个查询并合并它们.
让各个进程将其日志传输到单独的文件/数据库以避免损坏.然后,您可以拥有一个守护进程,该进程从所有这些文件/ DB中异步读取并写入单个统一文件/ DB.如果必须索引或查询日志,请在统一文件/ DB上执行.这里唯一的问题是您将无法实时访问日志.在整合日志之前会有一些滞后.
更新详情如下:
Process-1到Process-N在log-1中写入log-N
异步,Process-X从log-1读取到log-N并将其合并到单个log-X(整个biz log)
(可选)Process-X可以将log-1删除为log-N,同时填充log-X以释放空间
日志读取器使用带有查询和索引功能的log-X(整个商业日志)
------------- ------------- ------------- | | | | | | | Process-1 | | Process-2 | ... | Process-N | | | | | | | ------------- ------------- ------------- | | | | | | V V V ( log-1 ) ( log-2 ) ... ( log-N ) \ \ / \ \ / - - - - \ | / - - - - \ | / \ | - \ | / ||| VVV ------------- | | | Process-X | | | ------------- | V V -------------- V | | ( log-X ) ------>>>| Log Reader | | | --------------