7

我正在做一个项目,我们在 Oracle 数据库中批量加载和存储大量数据,这些数据不断通过 Hibernate 查询这个 100+ 百万条记录表(读取比写入频繁得多)。为了加快速度,我们将 Lucene 用于一些查询(尤其是地理边界框查询)和 Hibernate 二级缓存,但这还不够。我们在针对 Oracle 的 Hibernate 查询中仍然存在瓶颈(由于缺少那么多内存,我们没有在 Hibernate 二级缓存中缓存 100+ 百万个表实体)。

在这种情况下,我可以利用哪些其他 NoSQL 解决方案(Lucene 除外)?

我正在考虑的一些选择是:

  1. 将分布式 ehcache (Terracotta) 用于 Hibernate 二级,以在机器之间利用更多内存并减少重复缓存(现在每个 VM 都有自己的缓存)。

  2. 要在内存中完全使用像 H2 这样的 SQL 数据库,但不幸的是,这些解决方案需要将 100 多个表加载到单个 VM 中。

  3. 使用 Lucene 进行查询,使用 BigTable(或分布式哈希图)通过 id 进行实体查找。什么样的 BigTable 实现适合这个?我正在考虑 HBase。

  4. 使用 MongoDB 存储数据以及通过 id 进行查询和查找。

4

6 回答 6

7

推荐 Cassandra 和 ElasticSearch 用于可扩展系统(1 亿对他们来说不算什么)。使用 cassandra 处理所有数据,使用 ES 进行临时和地理查询。然后你可以杀死你的整个遗留堆栈。你可能需要一个像 rabbitmq 这样的 MQ 系统来实现 Cass 之间的数据同步。和 ES。

于 2011-06-23T18:44:46.373 回答
3

这实际上取决于您的数据集。NoSQL 设计的第一条规则是首先定义您的查询场景。一旦你真正了解了如何查询数据,你就可以研究各种 NoSQL 解决方案。默认的分配单位是键。因此,您需要记住,您需要能够在节点机器之间有效地拆分数据,否则您最终将获得一个水平可扩展的系统,所有工作仍在一个节点上完成(尽管根据情况可以进行更好的查询)。

您还需要回想一下 CAP 定理,大多数 NoSQL 数据库是最终一致的(CP 或 AP),而传统的关系 DBMS 是 CA。这将影响您处理数据和创建某些事物的方式,例如密钥生成可能会变得诡计多端。

还请记住,在某些系统(例如 HBase)中没有索引概念。您的所有索引都需要由您的应用程序逻辑构建,并且任何更新和删除都需要这样管理。使用 Mongo,您实际上可以在字段上创建索引并相对快速地查询它们,还可以将 Solr 与 Mongo 集成。您不需要像在 HBase 中那样在 Mongo 中通过 ID 进行查询,HBase 是一个列族(又名 Google BigTable 样式数据库),其中您基本上具有嵌套的键值对。

因此,再一次涉及到您的数据、您想要存储的内容、您计划如何存储它,以及最重要的是您希望如何访问它。Lily 项目看起来很有前景。我参与的工作是从网络获取大量数据,然后存储、分析、剥离、解析、分析、流式传输、更新等。我们不只使用一个系统,而是使用许多系统最适合手头的工作。对于这个过程,我们在不同阶段使用不同的系统,因为它可以让我们快速访问我们需要的地方,提供实时流式传输和分析数据的能力,重要的是,我们可以随时跟踪所有内容(如产品中的数据丢失)系统很重要)。我正在使用 Hadoop、HBase、Hive、MongoDB、Solr、MySQL 甚至是好的旧文本文件。请记住,使用这些技术生产系统比在服务器上安装 Oracle 有点困难,有些版本不是那么稳定,您确实需要先进行测试。归根结底,这实际上取决于业务阻力水平和系统的关键任务性质。

迄今为止没有人提到的另一条路径是 NewSQL - 即水平可扩展的 RDBMS... 有一些像 MySQL 集群(我认为)和 VoltDB 可能适合您的原因。

再次谈到理解您的数据和访问模式,NoSQL 系统也是 Non-Rel 即非关系型的,并且可以更好地适应非关系型数据集。如果您的数据本质上是关系型的,并且您需要一些真正需要执行笛卡尔积(也称为联接)之类的 SQL 查询功能,那么您最好还是坚持使用 Oracle,并在索引、分片和性能调优方面投入一些时间。

我的建议是实际使用几个不同的系统。看着;

MongoDB - 文档 - CP

CouchDB - 文档 - 美联社

Redis - 内存键值(不是列族) - CP

Cassandra - 列族 - 可用和分区容错 (AP)

HBase - 列族 - 一致和分区容错 (CP)

Hadoop/Hive

VoltDB - 一个非常好看的产品,一个分布式的关系数据库,可能适用于您的情况(可能是一个更容易的举动)。它们似乎还提供了可能更适合产品环境的企业支持(即给企业用户一种安全感)。

无论如何,那是我的 2c。使用这些系统确实是您找出真正适合您的情况的唯一方法。

于 2011-07-04T17:07:40.000 回答
1

正如您所建议的,MongoDB(或任何类似的 NoSQL 持久性解决方案)非常适合您。我们已经使用比您在 MongoDB 上建议的数据集大得多的数据集运行测试,并且运行良好。特别是如果您正在阅读大量 MongoDB 的分片和/或跨复制集成员分布读取将允许您显着加快查询速度。如果您的用例允许保持索引正确平衡,那么在没有进一步缓存的情况下,接近 20 毫秒查询的目标应该是可行的。

于 2011-06-24T11:39:18.133 回答
1

您还应该查看 Lily 项目 (lilyproject.org)。他们已将 HBase 与 Solr 集成。在内部,他们使用消息队列使 Solr 与 HBase 保持同步。这使他们能够拥有 solr 索引(分片和复制)的速度,并由高度可靠的数据存储系统提供支持。

于 2011-06-24T16:05:23.307 回答
0

在 100M 记录中,您的瓶颈可能是 Hibernate,而不是 Oracle。我们的客户通常在我们基于 Oracle 的数据仓库的各个事实表中拥有数十亿条记录,并且它可以很好地处理它们。

你在你的表上执行什么样的查询?

于 2011-06-23T20:26:42.970 回答
0

您可以对请求进行分组并将它们拆分为特定于一组数据并拥有一个(或一组服务器)进程,在这里您可以在缓存中获得可用的数据以提高性能。

例如,

比如说,员工和可用性数据是使用 10 个表处理的,当您配置休眠缓存以加载和处理请求时,这些表可以由一小组服务器处理。

为此,您需要一个负载平衡器(按业务场景平衡负载)。

不知道有多少可以在这里实现。

于 2011-06-23T18:08:31.527 回答