我们有一个 JAVA 网络应用程序,它使用 postgres(带有从属的单一数据库)来存储所有重要数据。
我们现在正从单一服务器设置转移到多个服务器,因此我需要进行一些更改以满足新要求。
1) 用于负载平衡和分区容错的非粘性 session ID。
2) 可从所有 Web 服务器访问的频繁读取数据的缓存(内存中/Memcache 替代方案)。
3) 队列(电子邮件、SMS、要在集群上执行的任务)。通常所有这些都必须通过 xml api 或屏幕抓取来执行。
避免重复处理任务很重要,但有时会发生:-)
4) API 请求和响应的持久存储(很多 XML,很多行,但列数很少)。 (可能通过删除旧的请求和响应来存档以保持数据集较小)。
5) 登录到一个共同的地方。该表将继续增长。我还需要一个工具来访问生产日志而不停止它们。应该可以根据时间和/或搜索字符串进行某种搜索。
我想要一个单一的解决方案来满足所有这些要求,并将 redis、mongo 和 hazelcast(按我个人喜好的顺序)视为可能的替代方案。
其他重要考虑因素: 1)减少对我们代码的侵入。 2) 简单的备份/复制策略。至少是主从。 3) 可管理性、社区和久经考验(在生产中运行)。
哪些将能够执行所有或大部分这些功能和要求?
编辑 - 我做了什么
- Redis 支持的 tomact session 管理器。
- 用于缓存的 Redis
- Jesque(Respue 的 java 版本)由 redis 支持。
- Postgres
- 由 Log4j2 支持的 SLF4J
最佳答案
我可以从 MongoDB 的角度解决其中一些问题。
我注意到的第一件事是您正在从单服务器设置转移到多服务器设置。 MongoDB 使设置复制和分片变得异常容易。反过来,复制和分片以及 Mongo 的一些其他功能可以帮助您实现很多您打算要做的事情。
首先,看一下文档来感受一下:
根据您的要求的一些其他想法:
- 与使用不同数据存储扩展的其他方法相比 mongo 使用商品硬件进行水平扩展的方法是 设置、扩展和维护非常简单。这意味着你可以花 更多时间用于构建您的应用程序,而不是成为 DBA。
- 如果您使用 mongo,您还可以跳过缓存层。 MongoDB 使用内存映射文件,这意味着如果您的工作集 可以保存在物理内存中你基本上有一个内存缓存 已经。
- MongoDB 非常适合日志记录。用户通常不需要安全 为此类应用程序编写,因此如果您坚持使用默认的即发即弃模型进行编写,性能将会非常出色。
- 这是否意味着它会更少地侵入您的代码还有待商榷,但是,与典型的对象关系映射器所做的相比,Mongo 对您的数据的侵入要小得多。它能够以其自然可用状态存储数据,即对象!
希望有所帮助,干杯。
关于java - Redis、Mongo 还是 Hazelcast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8788270/