7

我目前正在开发替代数据存储的概念证明。之所以需要增强一个以读取为主的集群 webapp,也是因为我想摆脱有时过于复杂的 ORM+RDBMS 解决方案的痛苦。

总的来说,这个想法非常类似于具有持久性的分布式缓存(让集群成为 SoR),但是:

  • 希望能够通过 id(提供类和 id)检索任何对象及其子对象 [仅开始,因为主要查询部分已在我的应用程序中使用 lucene 解决]。
  • 需要有类型映射的映射(~关系世界中的表),并在其中分发“脱水”存储对象的映射(通过反射深度克隆展平对象图)
  • 一个 bin 日志(例如 Prevayler)
    • 如果整个集群出现故障,最终恢复
    • 开发(以及重构代码/更改结构的能力)
    • 可能出于其他目的异步处理(报告等)
  • 最终稍后尝试集成静态类型查询机制,如 LINQ、Jaque 或 H2 的 JaQu / 参见 ODBs / Lucene (?)
  • 它必须是事务感知的(虽然不确定“JTA 类型”)

我计划用 Hazelcast(我喜欢它超级简单的 API)或 Terracotta(我从未使用过——但我知道他们的“最佳位置”,中期数据)来实现这个想法。如果你愿意,我的目标是或多或少地做 Jonas 曾经写过的博客。使用其中之一,存储的数据大致必须适合集群的 JVM 堆的总和。

这应该很容易扩展,可以避免关系阻抗不匹配(即保存为 ODB)和 JDBC + I/O 开销。

您是否知道其他工具/框架或其组合已经提供了类似的功能,而我忽略了?你能建议其他方法来解决这个“摆脱数据库”吗?你已经在这个想法中看到了哪些缺陷?在并发方面考虑 Scala 而不是 Java 是否有意义?

Couch DB、Neo4j、HyperTable、HBase 等非关系型数据存储怎么样?

一个月前有人问过一个类似的问题——但没有具体的解决方案。

顺便说一句,我刚刚偶然发现了Enterprise Data Fabric的概念,令我惊讶的是,它描述了很多这样的想法。

4

6 回答 6

2

一定要试试Terracotta 。它是免费的(除非您选择具有 SLA 和支持的企业版)。可以这么说,它是一个 JVM 级别的集群,因此您不会遇到与不同 JK 工作人员后面的多个盒子上的会话相关的问题(假设您将它用于 J2EE 应用程序)。

我只是漫无边际,所以看看这里:http ://en.wikipedia.org/wiki/Terracotta_Cluster

在网上更新关于兵马俑的大量信息,例如http://blog.terracottatech.com/2007/12/fud_of_the_week_terracotta_doe.html

更新2关于我的观点的一些背景知识:我在一家拥有相当多受众的公司工作。我们有一个企业级 MySQL,运行一个主服务器和大约 5 个从属服务器(考虑到我们有 2 个通道,每个通道有 4 个应用程序服务器,乘以 2),使用 MySQL 的 JDBC 复制驱动程序(我们已经为此提交了各种补丁)。我们使用 Spring2.5/Hibernate3 并使用 Spring 的声明式 JTA 事务管理,因此只读到从属。随着我们网站未来版本中大量 Ajax 增强功能的出现,我们的数据库服务器的负载增加了 - 我们为所有国家/地区创建了数千种产品的定价摘要,同时考虑了所有这些国家/地区的关税/税收规则(加上促销并且实时拍卖一直在运行),那么 Ajax 服务就会在眨眼间获得最新的价格。Terracotta 通过将这些价格提供给 JVM 层上的所有应用程序服务器来减轻数据库和应用程序服务器的负担,并且所有 JVM 都链接在一起。因此,服务器 A 可以每隔几分钟更新一次价格,如果 Ajax 访问服务器 B,价格就会立即可用。我知道有些人/公司有类似的业务,他们可能有更好的想法和实施,所以我总是愿意讨论,但这是我的两分钱。

我也从 Facebook 的人那里获得灵感,例如这篇内容丰富的文章: http ://www.facebook.com/note.php?note_id=23844338919

他们谈论memcached,你也应该检查一下。

于 2009-01-06T22:50:56.553 回答
2

正如问题中提到的Neo4j一样,在这种情况下,我对使用图形数据库提出了一些想法。(我是 Neo4j 团队的一员)

  • 在图形数据库中检索孩子是微不足道的
  • neo4j 有一个地图实现
  • 由于图形是图形数据库的原生图形,因此您可以考虑不要展平对象图形,而是将数据保存在节点和边/关系中(这使您在处理数据时具有更大的灵活性)
  • neo4j 是完全事务性的

随着当今新的数据库技术的出现,如果您的数据不适合关系范式,则确实没有必要继续使用 RDBMS。

于 2009-01-08T12:36:33.377 回答
2

在我看来,Terracotta 非常适合您的要求:

  • 集群地图以通过键检索子项(例如集群地图)
  • 地图地图 - 没问题
  • 没有明确的 bin 日志 - 但 Terracotta 已经将所有内容保存到磁盘,因此已经支持完整的集群重启
  • 已经集成到 Compass、Hibernate Search 和 Lucene 进行搜索
  • 交易?太慢了。将缓存用作数据存储。有了持久性,您就不会丢失写入(集群)内存的数据并回溯到数据库。

此外,Terracotta 会执行您要求的“反射”操作——尽管它不使用反射,因为这太慢了。它使用 BCM。只有更改才会在网络上传播。

Hazelcast btw 需要序列化,因此它会很慢,并且在使用 maps 数据结构的映射时根本不会做得很好(每个 put 都会导致整个网络上的完整深度克隆副本)并且它没有内置任何类型的持久性.

于 2009-01-27T07:02:06.493 回答
1

有趣的。

我认为我们都开发了一个动物园,其中包含我们在项目中习惯使用的所有抽象层。而且每个抽象层都是完全不同的动物。

我的目标是尽量减少花在照顾和喂养动物上的时间,因为这让我无法解决手头的问题——这是开销——浪费资源。因此,我们可以摆脱的抽象层越少、越简单,我们的生产力就越高。

我通常可以很好地使用两个小动物——OOP 和 RDBMS,通过漂亮、简单、最小、手工制作的 DAL 进行耦合。对我来说,ORM 主要是开销 - 一个抽象太多,而且非常饥饿。

不要忽视将存储过程视为抽象工具的选择。如果您对 SQL 非常熟悉,那么它可能是实现轻量级 BL 外观的有用资源,这意味着无需考虑 ORM 问题。

无论如何,这篇文章建议出现 RDBMS 的替代品来满足某些需求。

于 2009-01-06T23:10:25.093 回答
0

感谢您的回答。

实际上,您谈论的是 DB,这是我想完全从图片中删除的东西。

我的目标用例是一家初创公司的中小型集群 web 应用程序(局域网或云中的盒子)。它需要以 ~RAM 的速度检索对象并相当容易地扩展。作为副作用,人们不必考虑数据库服务器安装、阻抗不匹配、JDBC、缓存、使用注释污染域模型等。

同样,我想要完成的事情就像这里描述的那样,我希望对有关实际实现的想法有更多反馈(为什么使用 Terracotta 而不是 Hazelcast,使用序列化或通过反射或其他方式进行深度克隆,以及像这样的方法的主要缺点——例如,你为什么不为你当前的 ORM/DB 设置改变它)。

它必须非常易于集成,因此它将具有非常简洁的 Java API,从而提高代码的可读性。无需其他软件(需要 DB、memcached)。

于 2009-01-07T12:38:51.297 回答
0

试试GigaSpaces。我认为他们正是你所需要的,如果我没记错的话,有一个免费版本的初创公司。

一些概念:

  • “空间”是您可以存储和检索对象的地方
  • 空间可以由任何符合 JDBC 的数据库自动支持(无需代码,仅配置)
  • 空间可以在您的 java 进程中启动,因此所有访问都以 RAM 速度进行
  • 可以以任何您想要的方式(完整镜像、部分、网格)对空间进行集群/分区。
  • 空间支持分布式或本地事务

检查他们的wiki,(但只有“程序员指南” - 其余的都是营销 BS)。

于 2009-01-07T12:55:31.140 回答