【问题标题】:arangodb truncate fails on large a collectionarangodb 截断在大型集合上失败
【发布时间】:2015-10-06 12:47:18
【问题描述】:

如果我尝试截断大约 4000 万个文档的大量集合,我会在 arangosh 中超时,并且 arangodb 服务会无响应。留言:

arangosh [database_xxx]> db.[collection_yyy].truncate() ;文件 '/usr/share/arangodb/js/client/modules/org/arangodb/arangosh.js' 在 104,13 中的 JavaScript 异常:[ArangoError 2001:读取错误:'tcp://127.0.0.1:8529' '读取超时'] ! 抛出新的 ArangoError(requestResult); ! ^ 堆栈跟踪:错误 在 Object.exports.checkRequestResult (/usr/share/arangodb/js/client/modules/org/arangodb/arangosh.js:104:13) 在 ArangoCollection.truncate (/usr/share/arangodb/js/client/modules/org/arangodb/arango-collection.js:468:12) 在:1:11

Debian Jessie 上的 ArangoDB 2.6.9,AWS ec2 m4.xlarge,16G RAM,SSD。 服务无响应。我怀疑它卡住了(不仅仅是忙),因为它直到我停止后才起作用,删除 /var/lib/arangodb/databases/ 中的数据库,然后重新开始。

我知道我可能会因为尺寸而倾向于性能极限,但我猜想无论尺寸如何都不会失败。

但是,在非云 Windows 10、16GB RAM、SSD 上,同样的操作很成功 - 一段时间后。

这是一个错误吗?如果有帮助,我有一些 python 代码可以将虚拟数据加载到集合中。如果我将提供更多信息,请告诉我。 摆弄 --server.request-timeout 会有所帮助吗?

提前致谢 索伦

【问题讨论】:

  • 更新。参考我最初帖子中的测试。我在 AWS ec2 m4.xlarge 上重复了截断操作,但这次是在 ArangoDB 版本 2.7.0 上。操作正确成功,没有进入死状态。问题得到了修复 :-) 虽然它仍然比插入相同的数据花费了更长的时间。干杯

标签: arangodb


【解决方案1】:

为 ArangoShell 增加 --server.request-timeout 只会增加 shell 在关闭空闲连接之前使用的超时时间。 arangod 服务器也会关闭延迟的保持连接,这可能会更早发生。这是通过服务器的--server.keep-alive-timeout 设置控制的。

但是,同时增加两者并没有多大帮助。实际问题似乎是truncate() 操作本身。是的,它可能非常昂贵。 truncate() 是一个事务性操作,因此它将为它删除的每个文档写入一个删除标记到服务器的预写日志中。它还会在内存中缓冲每次删除操作,以便在操作失败时回滚。

truncate() 相比,侵入性要小得多的操作是删除集合并重新创建它。这应该非常快。 但是,如果在删除之前存在,则需要手动重新创建/恢复集合的索引和特殊设置。

对于一个文档集合,可以这样实现:

function dropAndRecreateCollection (collectionName) {
  // save state
  var c          = db._collection(collectionName);
  var properties = c.properties();
  var type       = c.type();
  var indexes    = c.getIndexes();

  // drop existing collection
  db._drop(collectionName);

  // restore collection
  var i;
  if (type == 2) {
      // document collection
      c = db._create(collectionName, properties);
      i = 1;
  }
  else {
      // edge collection
      c = db._createEdgeCollection(collectionName, properties);
      i = 2;
  }

  // restore indexes
  for (; i < indexes.length; ++i) {
      c.ensureIndex(indexes[i]);
  }
}

【讨论】:

  • 感谢您提供详细的答案和有用的脚本! drop 解决方法很适合我,因为无论如何所有配置和加载都将被脚本化。如果我在 arangodb dev 中,我仍然会进一步调查它,因为一个安装在 30 分钟内完成了工作,而另一个安装在之后的第二天仍然关闭。 SSD、16GB RAM 和相同的数据集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多