Redis、MongoDB还是Hazelcast?

11

我们有一个JAVA Web应用程序,使用Postgres(单个数据库带有从库)存储所有重要数据。

由于我们现在从单服务器设置转移到多个服务器的设置,因此我需要进行一些更改以满足新的要求。

1)负载平衡和分区容错的非粘性会话ID。

2)所有Web服务器都可以访问的频繁读取数据的缓存(内存/ Memcache替代品)。

3)队列(电子邮件,短信,要在集群上执行的任务)。通常它们都必须通过xml api或屏幕抓取来执行。避免重复处理任务很重要,但有时可能会发生。

4)API请求和响应的持久存储(大量XML,大量行但列数较少)。 (可能通过删除旧的请求和响应进行归档,以保持数据集小)。

5)记录到公共位置。表将继续增长。还需要工具来在不停止生产的情况下访问日志。基于时间和/或搜索字符串应该可以进行某种搜索。

我想要一个单一的解决方案来满足所有这些要求,并考虑Redis,Mongo和Hazelcast作为可能的替代方案(按我的个人偏好顺序)。

其他重要考虑因素: 1)尽量少干预我们的代码。 2)易于备份/复制策略。至少是主从。 3)可管理性、社区和经过测试(在生产中运行)。

哪个将能够执行所有或大部分这些特性和要求?

编辑-我所做的

  1. Redis支持Tomcat的会话管理器。
  2. Redis用于缓存。
  3. 由Redis支持的Jesque(Respue的Java版本)。
  4. Postgres
  5. SLF4J,由Log4j2支持。
3个回答

4
我可以从MongoDB的角度解决其中一些问题。
首先,我注意到您正在从单服务器设置转移到多个服务器设置。MongoDB非常容易设置复制和分片。反过来,复制、分片以及一些其他Mongo的功能,可以帮助您实现很多您想要完成的工作。
首先,看一下文档,稍微了解一下它:Replica SetsSharding 基于您的需求,以下是一些其他想法:
- 与使用不同数据存储的其他扩展方法相比较,Mongo的横向扩展使用廉价硬件非常简单,易于设置、扩展和维护。这意味着您可以将更多时间投入到构建应用程序上,而不是成为数据库管理员。 - 如果您选择mongo,则可能也可以跳过缓存层。MongoDB使用内存映射文件,这意味着如果您的工作集可以保存在物理内存中,那么您已经有一个内存中的缓存了。 - MongoDB非常适合记录日志。对于这种类型的应用程序,用户通常不需要安全写入,因此,如果您坚持使用默认的fire-and-forget模型进行编写,性能将非常好。 - 是否这意味着它会更少地干扰您的代码,还有待商榷。但是,与典型的对象关系映射器所做的事情相比,Mongo对您的数据干扰要少得多。它能够将数据存储在其自然可用的状态中,即对象!
希望这些信息对您有所帮助,祝您好运。

目前我对分布式数据库不感兴趣。当我们需要扩展规模时,Mongo似乎更像是未来的Postgres竞争对手。 - gladiator

2
我建议使用 SQL。因为你想要的是关系型数据库多年来完善的一切。就我所看,你想要一个数据解决方案,不是针对“特定”目的(这是 NOSQL 要覆盖的内容),而是针对“全能”场景。这正是 SQL 所用之处。
如果你想从你提到的三个选择中作出选择,那么 MongoDB 将是最接近的数据存储方式,但再次强调:使用 SQL

0

你是正确的,Redis将解决前3个要求-非粘性会话、缓存和队列。

至于集中日志记录,这不是一个琐碎的用例,但可以在Redis上完成,这里有一篇博客文章对此进行了解释。请注意,NoSQL大师Alex Popescu在这篇文章中提出了一些保留意见。

至于持久性,在Redis.io上有关于持久性选项的概述-存在一些问题,但可行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接