2015-10-06 88 views
2

如果我嘗試截斷大約4000萬個文檔的大集合,我會在arangosh中發生超時,並且arangodb服務會無響應。消息:arangodb truncate在大型集合上失敗

arangosh [database_xxx]> db。[collection_yyy] .truncate();文件'/usr/share/arangodb/js/client/modules/org/arangodb/arangosh.js'在104,13處出現JavaScript異常:[ArangoError 2001:Error from:'tcp://127.0.0.1:8529' '閱讀期間超時']! 拋出新的ArangoError(requestResult); !^stacktrace:錯誤 at Object.exports.checkRequestResult(/usr/share/arangodb/js/client/modules/org/arangodb/arangosh.js:104:13) at ArangoCollection.truncate(/ usr/share/arangodb/js/client/modules/org/arangodb/arango-collection.js:468:12) at:1:11

Debian Jessie,AWS ec2 m4.xlarge,16G RAM,SSD上的ArangoDB 2.6.9。 服務無響應。我懷疑它被困住了(不僅僅是繁忙),因爲它在我停止之後不能工作,刪除/ var/lib/arangodb/databases /中的數據庫,然後再次啓動。

我知道我可能因爲尺寸而傾向於性能極限,但是我猜測它的意圖不會失敗,無論大小如何。

但是,在非雲Windows 10,16GB內存SSD上,同樣的操作成功得很好 - 過了一段時間。

這是一個錯誤?如果有幫助,我有一些python代碼將虛擬數據加載到集合中。請讓我知道我是否會提供更多信息。 它有助於擺脫--server.request-timeout?

在此先感謝 瑟倫

+0

更新。參考我最初的帖子中的測試。 我在AWS ec2 m4.xlarge上重複了截斷操作,但這次是在ArangoDB 2.7.0版上。行動正確成功,不會進入死亡狀態。東西得到修正:-) 雖然它仍然花費比插入相同的數據更長的時間。歡呼 – sdy7

回答

1

爲ArangoShell增加--server.request-timeout只會增加它關閉空閒的連接之前,外殼將使用超時。 arangod服務器也將關閉延遲的保持活動連接,並且可能會提前發生。這通過服務器的--server.keep-alive-timeout設置進行控制。

但是,增加兩者都不會有多大幫助。實際問題似乎是truncate()操作本身。是的,它可能非常昂貴。 truncate()是一個事務操作,因此它將爲它刪除到服務器的預寫日誌中的每個文檔編寫一個刪除標記。它還會緩衝內存中的每個刪除操作,以便在操作失敗時可以回滾操作。

truncate()少得多的侵入性操作是取而代之的是刪除集合並重新創建它。這應該是非常快的。 但是,集合的索引和特殊設置如果在刪除之前存在,則需要手動重新創建/恢復。

爲一個文件集合,它可以實現這樣的:

+0

感謝您的詳細答案和一個有用的腳本!解決方法適合我,因爲無論如何所有配置和加載都要編寫腳本。如果我在arangodb開發中,我仍然會進一步調查它,因爲一個安裝在30分鐘內完成了工作,另一個安裝在第二天仍然沒有完成。SSD,16GB RAM和相同的數據集。 – sdy7