MongoDB在带有docker的设备上没有剩余空间

Posted

技术标签:

【中文标题】MongoDB在带有docker的设备上没有剩余空间【英文标题】:MongoDB no space left on device with docker 【发布时间】:2019-06-22 03:48:33 【问题描述】:

我的 MongoDB 卡住并返回以下错误:

2019-01-28T18:28:53.419+0000 E STORAGE  [WTCheckpointThread] WiredTiger error (28) [1548700133:419188][1:0x7feecb0ae700], file:WiredTiger.wt, WT_SESSION.checkpoint: /data/db/WiredTiger.turtle.set: handle-open: open: No space left on device
2019-01-28T18:28:53.419+0000 E STORAGE  [WTCheckpointThread] WiredTiger error (22) [1548700133:419251][1:0x7feecb0ae700], file:WiredTiger.wt, WT_SESSION.checkpoint: WiredTiger.wt: the checkpoint failed, the system must restart: Invalid argument
2019-01-28T18:28:53.419+0000 E STORAGE  [WTCheckpointThread] WiredTiger error (-31804) [1548700133:419260][1:0x7feecb0ae700], file:WiredTiger.wt, WT_SESSION.checkpoint: the process must exit and restart: WT_PANIC: WiredTiger library panic
2019-01-28T18:28:53.419+0000 F -        [WTCheckpointThread] Fatal Assertion 28558 at src/mongo/db/storage/wiredtiger/wiredtiger_util.cpp 361
2019-01-28T18:28:53.419+0000 F -        [WTCheckpointThread]

***aborting after fassert() failure

2019-01-28T18:28:53.444+0000 F -        [WTCheckpointThread] Got signal: 6 (Aborted).

但是,我的磁盘有空间:

df -h

Filesystem      Size  Used Avail Use% Mounted on
udev            992M     0  992M   0% /dev
tmpfs           200M  5.7M  195M   3% /run
/dev/xvda1       39G   26G   14G  66% /
tmpfs          1000M  1.1M  999M   1% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs          1000M     0 1000M   0% /sys/fs/cgroup
tmpfs           200M     0  200M   0% /run/user/1000

df -i

Filesystem      Inodes   IUsed  IFree IUse% Mounted on
udev            253844     322 253522    1% /dev
tmpfs           255835     485 255350    1% /run
/dev/xvda1     5120000 5090759  29241  100% /
tmpfs           255835      10 255825    1% /dev/shm
tmpfs           255835       3 255832    1% /run/lock
tmpfs           255835      16 255819    1% /sys/fs/cgroup
tmpfs           255835       4 255831    1% /run/user/1000

这将是我的 docker-compose:

version: "3"
services:

# MariaDB
    mariadb:
        container_name: mariadb
        image: mariadb
        ports: ['3306:3306']
        restart: always
        volumes:
            - /home/ubuntu/mysql:/var/lib/mysql
        environment:
            - "MYSQL_ROOT_PASSWORD=PasswordGoesHere"
        command:
            # - --memory=1536M
            - --wait_timeout=28800
            - --innodb_buffer_pool_size=1g
            - --innodb_buffer_pool_instances=4
            # - --innodb_buffer_pool_chunk_size=1073741824

# APACHE
    apache:
        container_name: apache
        image: apache-php7.1
        ports: ['80:80', '443:443']
        restart: always
        entrypoint: tail -f /dev/null
        volumes:
            - /home/ubuntu/apache2/apache-config:/etc/apache2/sites-available/
            - /home/ubuntu/apache2/www:/var/www/html/

# MONGODB
    mongodb:
        container_name: mongodb
        image: mongo
        ports: ['27017:27017']
        restart: always
        command:
            - --auth
        volumes:
            - /home/ubuntu/moongodb:/data/db

我的 docker-compose.yml 会不会有问题?因为我使用的是物理磁盘而不是虚拟磁盘。我可以运行应用程序,1-2 小时后 mongo 将再次失败。

【问题讨论】:

【参考方案1】:

如果您在 centos/RHEL/Amazon Linux 中运行它,您应该知道 devicemapper 在 Docker 中发布 inode 时存在重大问题。

即使你修剪了整个 docker 系统,它仍然会挂在很多 inode 上,真正解决这个问题的唯一方法是基本上 implode docker:

service docker stop
rm -rf /var/lib/docker
service docker start

这应该会释放你所有的 inode。

我在这方面花了很多时间,Docker 确实只完全支持 Ubuntu overlay2,而 devicemapper 虽然可以工作,但技术上不支持。

【讨论】:

我按照你说的做了,如果能成功,我们下次见。 :) 您能否通过@akhan 回复完成您的信息?这两个信息都是响应所必需的。所以,我离开是为了解决我的疑问。【参考方案2】:

您的 inode 似乎 100% 都在使用中(来自 df -i 输出)。尝试寻找dangling volumes 和cleaning them up。此外,最好确保 docker 守护进程使用的是生产级存储驱动程序(about storage drivers、choosing a storage driver)。

【讨论】:

我已经运行了docker system pruner,没有区别 "看起来你的 inode 100% 都在使用中(来自 df -i 输出)。" - 会有问题吗? 是的,inode 是 Linux/Unix/Mac 文件系统的重要组成部分。这个article 是一个很好的介绍。 您能否通过@Avamore 回复完成您的信息?这两个信息都是响应所必需的。所以,我离开是为了解决我的疑问。【参考方案3】:

清理 docker 缓存 - 卷和容器

对我来说它有效:

docker system prune

然后

docker volume prune

或一行:

docker system prune --volumes

查看所有卷:docker volume ls

显示 docker 磁盘使用情况:docker system df

【讨论】:

以上是关于MongoDB在带有docker的设备上没有剩余空间的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jenkins 和 Docker 构建时“设备上没有剩余空间”

Docker:错误标志背后的主要原因是啥:0x5001:设备上没有剩余空间

“设备上没有剩余空间” - 在 ubuntu 机器上运行 docker-compose 时。无助于清理和重启

Docker 致命:无法写入锁定文件“postmaster.pid”:设备上没有剩余空间

来自守护程序的 Docker 错误响应:处理 tar 文件时出错(退出状态 1):设备上没有剩余空间

错误:由于环境错误而无法安装软件包:[Errno 28] 设备上没有剩余空间