ArangoDB插入/更新时报No space left on device错误的原因排查
问题:ArangoDB 3.8.6 报「No space left on device」但服务器有剩余空间
在基于Spring的Java应用中使用ArangoDB 3.8.6执行插入/更新操作时,触发「No space left on device while appending to file」错误。待操作文档体积很小,但运维确认服务器仍有160GB空闲空间。
POM依赖
<dependency> <groupId>com.arangodb</groupId> <artifactId>arangodb-java-driver</artifactId> <version>6.18.0</version> </dependency> <dependency> <groupId>com.arangodb</groupId> <artifactId>jackson-dataformat-velocypack</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>com.arangodb</groupId> <artifactId>velocypack</artifactId> <version>2.5.4</version> </dependency>
异常堆栈
com.arangodb.ArangoDBException: Response: 500, Error: 1104 - 10 error: No space left on deviceWhile appending to file: /data/arangodb/data/dbserver8530/data/engine-rocksdb/679192.sst: No space left on device at com.arangodb.internal.util.ResponseUtils.checkError (ResponseUtils.java:55)
排查与解决方案
1. 检查磁盘inode使用情况
Linux系统中,即使磁盘有剩余空间,inode耗尽也会触发该错误。执行命令检查对应挂载点的inode状态:
df -i
如果/data/arangodb挂载点的Inodes已用100%,需清理目录下的大量小文件(如RocksDB临时文件、过期日志),或重新调整分区的inode配额。
2. 验证数据目录的权限与挂载状态
- 确认ArangoDB进程对目标目录有读写权限:
ls -ld /data/arangodb/data/dbserver8530/data/engine-rocksdb/ ps aux | grep arangodb
确保进程所属用户(通常为arangodb)拥有该目录的读写权限。
- 检查磁盘是否为只读挂载:
mount | grep /data/arangodb
若输出包含ro,需重新挂载为读写模式。
3. 调整RocksDB的空间预留机制
ArangoDB使用RocksDB时,默认会预留约5%的磁盘空间用于后台压缩、快照操作,剩余空间低于阈值时会触发错误:
- 可修改ArangoDB配置文件中的
rocksdb.max-total-wal-size、rocksdb.wal-dir参数,优化WAL文件存储策略; - 手动触发数据压缩释放空间:
arangosh --server.username root --server.password 你的密码 --execute "db._compact()"
4. 检查用户磁盘配额
部分服务器会对用户设置磁盘配额,即使系统磁盘有空间,单个用户配额耗尽也会报错:
quota -u arangodb
若存在配额限制,需调整用户配额或清理该用户下的冗余文件。
5. 验证依赖版本兼容性
当前Java Driver 6.18.0与ArangoDB 3.8.6版本兼容,但可尝试升级到同系列最新小版本(如6.20.0),修复潜在的空间处理类bug。
内容的提问来源于stack exchange,提问作者saba safavi
相关产品推荐
相关产品推荐

