在索引

时间:2017-04-18 05:27:33

标签: cassandra hazelcast ignite in-memory-database redis-cluster

我们正在寻找一个可以支持索引的内存数据库中的开源。

用例是我们有很多项目会大量增长。 每个项目都有一些我们需要查询的字段。 目前,我们将数据存储在应用程序的内存中。但是随着数据的增加,我们必须考虑分发/分片数据库。

我们已经看了几个选项

    可以使用
  1. Redis群集 ,但它没有概念 索引或类似SQL的查询。

  2. Apache Ignite 既可以在内存中,也可以分发并提供 SQL查询。然而,问题是点燃所有火     查询所有主节点,以便最终结果     比这些查询中最慢的慢。这似乎是一个问题     因为多个节点中的非执行/慢节点可以     真的让应用程序变慢了很多。进一步点燃,读取是     没有使用主人和奴隶,所以它是     难以扩展查询。增加节点将有     负面影响因为查询的数量会增加而且会增加     甚至更慢。

  3. Cassandra - 可以使用cassandra中的内存中选项,但它 似乎每个节点的表的最大大小可以是1 GB。如果     我们的表超过1 GB,我们将不得不求助于分区     这将导致cassandra进行多次查询(每个查询一个)     节点)这是一个问题(与点燃相同)。不确定是否读入     cassandra内存表可以通过增加数量来缩放     从站。
  4. 我们对其他解决方案持开放态度,但想知道多个查询是否会成为一个问题(如淡褐色)。

    我们用例的理想解决方案是内存数据库,其索引可以通过增加从站的数量来读取。使其分布/分片将导致多个查询,我们不愿意,因为一个错误的节点可能会降低整个系统的速度。

3 个答案:

答案 0 :(得分:11)

Hazelcast支持索引(已排序和未排序)以及重要的内容 Hazelcast没有多重查询问题

Hazelcast支持PartitionPredicate,它将查询的执行限制为一个节点,该节点是传递给PartitionPredicate构造函数的密钥的primaryReplica。因此,如果您知道数据所在的位置,则只需查询此节点即可。因此,无需修复或实现任何支持它,您可以立即使用它。 一直使用它可能是不合理的。取决于你的用例。

对于扫描大量数据但返回较小结果的复杂查询,最好在内存中使用OBJECT。您应该获得出色的执行时间和较低的延迟。

答案 1 :(得分:9)

免责声明:我是GridGain员工和Apache Ignite提交者。

关于您的担忧的几条评论:

1)慢节点几乎会导致任何集群环境出现问题,因此我不认为这是一个缺点。这是你应该拥抱和接受的现实。有必要了解为什么它很慢并修复/升级它。

2)Ignite能够执行从常规缓存操作[1]和通过REPLICATED缓存执行的SQL查询的从属读取。事实上,使用REPLICATED缓存作为参考数据是Ignite能够顺利扩展的最重要的功能之一。

3)正如您所正确提到的,当前查询被广播到所有数据节点。我们将改进它。首先,我们将允许用户指定分区来执行[2]的查询。其次,我们将改进我们的优化器,以便它会提前尝试计算目标数据节点以避免广播[3],[4]。两项改进都将很快公布。

4)最后,但并非最不重要 - 持久层将在几个月内发布[5],这意味着Ignite将成为具有内存和持久性功能的分布式数据库。

[1] https://ignite.apache.org/releases/mobile/org/apache/ignite/configuration/CacheConfiguration.html#isReadFromBackup()

[2] https://issues.apache.org/jira/browse/IGNITE-4523

[3] https://issues.apache.org/jira/browse/IGNITE-4509

[4] https://issues.apache.org/jira/browse/IGNITE-4510

[5] http://apache-ignite-developers.2346864.n4.nabble.com/GridGain-Donates-Persistent-Distributed-Store-To-ASF-Apache-Ignite-tc16788.html

答案 2 :(得分:1)

我可以对cassandra发表意见。每个节点的表的最大大小是可配置和可调的,因此它取决于您愿意支付的内存量。分区内置于cassandra中,因此cassandra基本上为您管理它。做分区比较简单。基本上,主键语法的第一部分是分区键,它确定数据集群中的哪个节点。

但我也猜你知道这个,因为你提到每个节点有多个查询。我猜周围没有好办法。

只是一个轻微的评论,cassandra没有主奴隶。每个节点都是相同的。基本上客户端询问集群中的任何节点,然后该节点成为协调节点,并且由于它获得了分区密钥,因此它知道要向数据请求的节点,然后将其提供给客户端。

除此之外,我猜你已经读了足够的cassandra(从我在你的问题中看到的)

基本上,它归结为访问模式,如果您知道如何访问数据,那么它就是最佳选择。但其他数据库也相当不错。

使用cassandra进行索引通常会隐藏一些潜在的性能问题。通常人们会避免它,因为在cassandra中必须为整个集群中的每条记录构建索引,并且每个节点完成它。这并没有真正扩展。基本上你总是要先查询,无论ypu如何用cassandra。

另外内存似乎是DSE cassandra的一部分。不是开源或社区的。你也必须考虑到这一点。