我们计划将C++内存数据库应用程序移植到Java中。我们希望使用Hazelcast作为Java语言中的内存DB解决方案。
一个拥有40TB数据的系统所需的吞吐量是每秒3万次读写。由于内存中的数据量很大,一旦系统出现故障,我们就不能在吞吐量上妥协。
使用C++的内部实现为我们提供了将这些数据与磁盘存储一起存储在共享内存中的灵活性。一旦应用程序重新启动,我们可以通过将进程附加回共享内存文件来恢复它。
我们能在Hazelcast中也提供类似的功能吗?或者,有没有类似的内存中数据网格解决方案可以让我们拥有这种功能?
当前Hazelcast没有磁盘溢出功能;但我们的人正在努力,希望它能在Hazelcast 3.3中提供。
因此,您需要使用自定义的MapLoader/MapStore接口,您可以连接到Map实例并自己添加持久性。
来自Hazelcast队列存储中的溢出
Enes Akar 2013年12月26日关于Hazelcast队列存储溢出的评论关闭Hazelcast3的新功能之一是队列存储。
与地图存储不同;溢出是可能的。如果你设置了内存Iimit;它开始持久化到磁盘,并在排队时跳过内存达到这个极限。
这里的配置:
<queue-store> <class-name>com.hazelcast.QueueStoreImpl</class-name> <properties> <property name="binary">false</property> <property name="memory-limit">1000</property> <property name="bulk-load">500</property> </properties> </queue-store>
对于上述配置:
项将以其对象形式(反序列化形式)持久化。
如果队列的大小已达到1000(内存限制),则下一个元素将只是持久化到磁盘,而不会存储在内存中。
商品将以500码的散货从商店装载。
更多注意事项:
当您避免在高内存使用率的情况下过度使用RAM时,请使用内存限制负载
如果希望内存(和存储)中的所有项目都使用Integer.MAX_VALUE,如果如果希望所有项目都在存储中,则使用0作为内存限制。
如果你没有从外部到达商店(只有榛卡斯特使用store),然后使二进制配置为true。这将增加将跳过作为反序列化步骤的性能。
在这里,您可以看到QueueStore实现的一些示例:
https://github.com/hazelcast/hazelcast/blob/master/hazelcast/src/test/java/com/hazelcast/queue/QueueStoreTest.java