2

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

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

我们已经研究了几个选项

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

  2. Apache Ignite既是内存中的,又是分布式的,并提供 SQL 查询。但是,问题是 ignite 会将所有查询触发到所有主节点,因此最终结果将比那些查询中最慢的查询慢。这似乎是一个问题,因为许多节点中的一个非执行/慢速节点确实会大大降低应用程序的速度。此外,在 ignite 中,读取是从 master 完成的,而 slave 不使用,因此很难扩展查询。增加节点会产生负面影响,因为查询数量会增加,而且速度会更慢。

  3. Cassandra - 可以使用 cassandra 中的 in-memory 选项,但似乎每个节点的表的最大大小可以是 1 GB。如果我们的表超过 1 GB,我们将不得不求助于分区,这将导致 cassandra 进行多个查询(每个节点一个),这是一个问题(与 ignite 相同)。不确定是否可以通过增加从属设备的数量来扩展 cassandra 内存表中的读取。

我们对其他解决方案持开放态度,但想知道多查询是否会成为无处不在的问题(如 hazelcast)。

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

4

3 回答 3

11

Hazelcast 支持索引(已排序和未排序),重要的是 Hazelcast 没有多查询问题

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

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

于 2017-04-19T06:48:30.053 回答
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

于 2017-04-18T08:15:49.963 回答
1

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

但我也猜想您已经意识到这一点,因为您提到了每个节点的多个查询。我想没有很好的解决方法。

只需稍加说明,cassandra 中没有主从。每个节点都是平等的。基本上客户端询问集群中的任何节点,然后该节点成为协调节点,并且由于它获得分区密钥,它知道要向哪个节点请求数据,然后将其提供给客户端。

除此之外,我想您已经阅读了足够多的 cassandra(从我在您的问题中可以看到的内容)

基本上它归结为访问模式,如果你知道你将如何访问你的数据,那么这就是要走的路。但其他数据库也相当不错。

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

加上内存似乎是 DSE cassandra 的一部分。不是开源或社区之一。您还必须考虑到这一点。

于 2017-04-18T05:33:20.113 回答