2011-06-23 59 views
5

我正在一个项目上工作,我们正在批量加载和存储Oracle数据库中的大量数据,这是不断通过Hibernate查询这个1亿多记录表(读取是比写更频繁)。 为了加快速度,我们使用Lucene进行一些查询(特别是地理边界框查询)和Hibernate二级缓存,但那还不够。我们仍然在针对Oracle的Hibernate查询中遇到瓶颈(由于缺乏那么多的内存,我们不会在Hibernate二级缓存中缓存超过1亿个表实体)。最好的NoSQL方法来处理1亿多条记录

什么额外的NoSQL解决方案(除Lucene外)我可以在这种情况下利用?

我想到的一些选项有:

  1. 使用分布式的Ehcache(兵马俑)对Hibernate第二级跨机器利用更多的内存,并减少重复缓存(现在每个虚拟机都有自己的高速缓存)。

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

  3. 使用Lucene进行查询,使用BigTable(或分布式hashmap)进行实体查找。 什么BigTable实现将适用于此?我正在考虑HBase。

  4. 使用MongoDB来存储数据和按ID查询和查找。

+1

你能分解数据吗? –

+2

如果通过ID查找是BigTable或MongoDB的潜在选项,为什么它不是SQL的潜在选项? –

+0

你的数据看起来像什么? – NightWolf

回答

0

你能集团要求&分裂他们特有的一组数据&有一个(或一组服务器)过程,在这里你可以在缓存中可用来提高性能的数据。使用10个表被处理

例如,

说,雇员&可用性数据,这些可以B A小组服务器(S)的处理时,配置休眠缓存加载&处理请求。

为此,您需要负载均衡器(通过业务场景平衡负载)。

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

6

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

0

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

你在桌子上执行什么类型的查询?

+0

下面是一个修改为在内存数据库中使用的同一方法的运行时间示例:一直到Oracle:116,201ms vs 20ms(根据yourkit,116201ms用于oracle.jdbc.driver.OraclePreparedStatement.executeQuery())。我的目标是尽可能接近20ms。 – tsolakp

+0

@Tsolak Petrosian:如果您的性能目标是在中等规模的100M记录表上搜索几十毫秒,那么您可能应该考虑内存数据库或缓存,而不仅仅是NoSQL。 – Olaf

0

正如您所建议的,MongoDB(或任何类似的NoSQL持久性解决方案)是适合您的。我们运行的测试数据集比您在MongoDB上建议的测试数据集要大得多,并且工作正常。特别是如果你阅读过大量的MongoDB的分片和/或散布阅读跨越复制集成员将允许你显着加快你的查询。如果你的用例允许保持你的索引正确平衡,那么接近20ms查询的目标应该是可行的,而不需要进一步的缓存。

1

你也应该看看莉莉项目(lilyproject.org)。他们已经将HBase与Solr整合在一起。他们在内部使用消息队列来保持Solr与HBase同步。这使他们能够拥有高度可靠的数据存储系统所支持的索引索引(分片和复制)的速度。

2

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

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

还记得比在HBase等系统中没有索引概念。您的所有索引都需要由应用程序逻辑构建,并且任何更新和删除都需要按照这种方式进行管理。有了Mongo,你可以在字段上创建索引并相对快速地查询索引,也可以将Solr与Mongo集成。您不仅需要在Mongo中通过ID进行查询,就像您在HBase中所做的那样,它是一个列家族(又名谷歌BigTable样式数据库),您基本上拥有嵌套的键值对。

因此,再次涉及到您的数据,您想要存储的内容,您计划如何存储它,最重要的是您希望如何访问它。莉莉项目看起来很有希望。我参与的工作是从网络上获取大量数据,并存储,分析,剥离,分析,分析,流式处理,更新等。我们不仅仅使用一个系统,而是使用多个系统这最适合手头的工作。对于这个过程,我们在不同的阶段使用不同的系统,因为它使我们能够在需要的地方快速访问,提供了实时流式处理和分析数据的能力,重要的是,随时了解所有事情(如数据丢失)系统是一件大事)。我使用Hadoop,HBase,Hive,MongoDB,Solr,MySQL甚至是优秀的旧文本文件。请记住,使用这些技术生产系统比在服务器上安装Oracle要困难一些,某些版本不够稳定,而且您确实需要首先进行测试。在这一天结束的时候,它确实取决于业务阻力水平和系统的关键任务性质。

到目前为止,还没有人提到过的另一种路径是NewSQL--即水平可伸缩的RDBMSs ......有一些像MySQL集群(我认为)和VoltDB可能适合您的原因。

它再次涉及到了解您的数据和访问模式,NoSQL系统也是非Rel,即非关系型,并更适合非关系型数据集。如果您的数据具有固有的关系性,并且您需要一些SQL查询功能,而这些功能确实需要做笛卡尔产品(又名连接),那么您最好坚持使用Oracle,并投入一些时间进行索引,分片和性能调整。

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

的MongoDB - 文档 - CP

的CouchDB - 文档 - AP

Redis的 - 在存储器键值(未列族) - CP

卡桑德拉 - Column Family - Available &分区容错(AP)

HBase的 - 柱族 - 一致&分区容错(CP)

Hadoop的/蜂房

VoltDB - 一个非常漂亮的产品,被分发和可能工作的关系数据库中的案例(可能更容易)。他们似乎也提供了可能更适合产品环境的企业支持(即为企业用户提供安全感)。

任何方式,这是我的2c。玩弄这些系统真的是你找出真正适合你的案例的唯一方法。