我们使用ArangoDB来存储电信数据。我们应用程序的主要目标是让用户快速构建特定类型的报表。这些报表主要基于我们在遍历不同图形时从ArangoDB获得的数据。报表的业务逻辑并不简单,这导致了具有多个嵌套遍历(子查询)的非常复杂的AQL查询。
我们存储在ArangoDB中的数据的快速概览:
*28个包含文档的集合(最大集合包含3500 K个文档,平均集合通常为100 K到1000 K)
*3个带边的集合(335 K边、3500 K边和15000 K边)
*3个图形(每个图形链接到一个边集合,最大的图形有23个自/至集合)
整个数据集在完全加载(包括索引)时大约占用28 GB RAM。
我们已经使用MMFiles近两年了,除了一些问题外,我们对结果非常满意:
- 前所未有的内存消耗,我描述为here
- 重新启动非常慢(需要1小时30分钟,数据库才能再次完全响应)
- 事实上,我们必须使用非常昂贵的虚拟机和64 GB的RAM,才能将所有数据放入RAM
经过一些研究,我们开始研究一个新的RocksDB存储引擎。
- https://www.arangodb.com/why-arangodb/rocksdb-storage-engine/
- https://docs.arangodb.com/3.4/Manual/Architecture/StorageEngines.html
从文档和proposed answers on my question about the problem with RAM consumption中我可以看到RocksDB应该是我们的一条路。所有文档都说它是ArangoDB的新默认引擎,如果你想存储比RAM更多的数据,应该使用它。
我安装了新的ArangoDB 3.4.1,并将数据库从MMFiles转换为RocksDB(通过arangodumpa
和arangorestore
)。然后我运行了一些性能测试,发现所有的遍历都比使用MMFiles引擎时慢了2-6倍。使用MMFiles引擎时需要20秒的一些查询现在使用RocksDB时需要40秒,即使您多次运行相同的查询(即数据必须已经被缓存)。
2019年2月15日更新:
我们在AWS上的m4.4xlarge示例上的Docker容器内运行ArangoDB,16 vCPU和64 GB RAM。我们为ArangoDB容器分配了32 GB RAM和6144个CPU单元。下面是测试的简短摘要(数字以HH:mm:ss格式显示执行特定AQL遍历查询所用的时间):
注意,在这个特定的表格中,我们没有我在最初的问题中提到的10倍的性能下降。当我们在重新启动ArangoDB后立即运行AQL时,最大速度下降了6倍(我想这是可以的)。但是,大多数查询的速度比MMFiles慢2倍,即使在所有数据都必须缓存在RAM中的情况下再次运行它也是如此。在Windows上的情况更糟(在那里我的性能下降了10倍甚至更多)。我将稍后发布我的Windows PC的详细规格和性能测试。
**我的问题是:**使用RocksDB引擎时AQL遍历速度慢得多,这是预期的行为吗?对于何时使用MMFiles引擎、何时使用RocksDB引擎以及在哪些情况下不能使用RocksDB,是否有任何一般性建议?
1条答案
按热度按时间juzqafwq1#
在Arangodb 3.7中,对MMFiles的支持已经被删除,因此这个问题可以用“使用rocksdb”来回答。
我们花了一段时间才使ArangoDB中基于rocksdb的存储引擎成熟起来,但我们现在确信它完全可以处理所有负载。
我们将演示如何使用parts of the rocksdb storage system and which effects they have in this article。