11

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

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

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

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

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

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

5)登录到一个共同的地方。该表将继续增长。此外,我需要一个工具来访问生产日志而不停止它们。应该可以基于时间和/或搜索字符串进行某种搜索。

我想要一个单一的解决方案来解决所有这些要求,并将 redis、mongo 和 hazelcast(按照我的个人喜好)作为可能的替代方案。

其他重要的考虑因素:1)减少对我们代码的侵入。2) 简单的备份/复制策略。至少是主从。3) 可管理性、社区和久经考验(在生产中运行)。

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

编辑 - 我做了什么

  1. Redis 支持的 tomact 会话管理器。
  2. 用于缓存的 Redis
  3. 由 redis 支持的 Jesque(Respue 的 java 版本)。
  4. Postgres
  5. 由 Log4j2 支持的 SLF4J
4

3 回答 3

4

我可以从 MongoDB 的角度解决其中的一些问题。

我注意到的第一件事是您正在从单服务器设置转移到多服务器设置。MongoDB 使设置复制和分片变得非常容易。反过来,复制和分片,以及 Mongo 的一些其他功能,可以帮助您实现很多您打算做的事情。

首先,看一下文档以了解一下:

副本集分片

根据您的要求的其他一些想法:

  • 与使用不同数据存储进行扩展的其他方法相比,mongo 使用商用硬件进行水平扩展的方法非常易于设置、扩展和维护。这意味着您可以将更多时间花在构建应用程序上,而不是成为一名 DBA。
  • 如果您使用 mongo,您也可以跳过缓存层。MongoDB 使用内存映射文件,这意味着如果您的工作集可以保存在物理内存中,那么您基本上已经有了内存缓存。
  • MongoDB 非常适合记录日志。对于此类应用程序,用户通常不需要安全写入,因此如果您坚持使用默认的即发即弃模式进行写入,性能将会非常出色。
  • 这是否意味着它会更少地侵入你的代码还有待商榷,然而,与典型的对象关系映射器相比,Mongo 对你的数据的侵入性要小得多。它能够以自然可用的状态存储数据,即对象!

希望有帮助,加油。

于 2012-01-09T19:46:27.503 回答
2

我会说使用sql。由于您想要关系数据库多年来完善的一切。据我所知,您想要的数据解决方案不是用于“特定”目的(这就是 NOSQL 试图涵盖的内容),而是用于“一体化”场景。这就是 SQL 的用途。

如果您想从您命名的这 3 个中进行选择,Mongodb 将是最接近的数据存储,但同样:使用 sql

于 2012-01-09T20:59:35.867 回答
0

你说得对,Redis 将解决前 3 个要求——非粘性会话、缓存和队列。

至于集中式日志记录,它不是一个微不足道的用例,但可以在 Redis 上完成,这里有一篇博客文章解释了如何。请注意,NoSQL 专家 Alex Popescu 在这篇文章中对这种方法提出了一些保留意见。

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

于 2013-05-30T12:42:03.223 回答