V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Dnlyao
V2EX  ›  Linux

求助, Linux 上使用 docker 部署 mongdb,使用持久化,数据在硬盘上,快满了,如何处理?

  •  
  •   Dnlyao · 70 天前 · 2438 次点击
    这是一个创建于 70 天前的主题,其中的信息可能已经有所发展或是发生改变。
    26 条回复    2024-08-30 09:13:39 +08:00
    Dnlyao
        1
    Dnlyao  
    OP
       70 天前
    mongo:
    image: mongo:4.0.9
    container_name: mongo
    ports:
    - "27011:27017"
    environment:
    - MONGO_INITDB_ROOT_USERNAME=
    - MONGO_INITDB_ROOT_PASSWORD=
    volumes:
    - /data/databases/mongodb/mongo/db:/data/db
    - /data/databases/mongodb/mongo/backup:/data/backup
    - /data/databases/mongodb/mongo.key:/mongo/mongo.key
    command: ["mongod","--replSet","TT","--keyFile","/mongo/mongo.key", "--wiredTigerCacheSizeGB", "3"]


    这个是 dokcer-compose 文件,能清理,还是只能加硬盘?
    AoEiuV020JP
        2
    AoEiuV020JP  
       70 天前
    要么扩容要么删数据,还能怎么处理?
    Dnlyao
        3
    Dnlyao  
    OP
       70 天前
    @AoEiuV020JP 这样写 /data/db 文件夹内全是数据是吧?不会出现容器日志导出来是吗?
    julyclyde
        4
    julyclyde  
       70 天前
    什么叫“容器日志导出来“??
    @Dnlyao
    Nazz
        5
    Nazz  
       70 天前
    扩容, 然后新建分区挂载逻辑卷到根目录
    Dnlyao
        6
    Dnlyao  
    OP
       70 天前
    @julyclyde 之前搜的清理帖子,说是有 docker 日志,和容器内的日志在服务器上,所以导致占用高。想问一下,这么些 compose 文件,是否和日志相关。
    AdamJin
        7
    AdamJin  
       70 天前
    你可以看下容器的 logpath ,其中 log 文件大不大。
    AdamJin
        8
    AdamJin  
       70 天前   ❤️ 1
    du -h $(docker inspect --format='{{.LogPath}}' $(docker ps -qa))
    laminux29
        9
    laminux29  
       70 天前   ❤️ 2
    你这 docker 结构相当不错啊,扩容应该很简单的。

    1.把以下 3 个目录,tar + zstd:
    /data/databases/mongodb/mongo/db
    /data/databases/mongodb/mongo/backup
    /data/databases/mongodb/mongo.key

    2.container 停掉

    3.导出 container ,tar + zstd

    4.上面有 4 个 tar + zstd ,如果数据重要,找 3 个大硬盘,给每个硬盘复制一份,复制时请打开校验选项,也就是复制后,要校验一次。这个步骤是为了满足生产数据的 3 副本的基本要求。

    5.原始物理机,磁盘扩容。
    生产环境,此时还应该对内存跑一个 Memtest86+
    生产环境,此时还应该对所有存储介质做 3 检:寿命检查、全盘坏道检查、性能检查。

    6.扩容完毕后,数据导回去就行,但记得复制时,同样需要打开校验选项。
    julyclyde
        10
    julyclyde  
       70 天前   ❤️ 1
    @Dnlyao 既然是盘满了,你可以先找一下哪些文件占用高,再问这是什么文件
    而不是先打听某些占用高,然后去看它是不是真的占用高
    Dnlyao
        11
    Dnlyao  
    OP
       70 天前
    Dnlyao
        12
    Dnlyao  
    OP
       70 天前
    @AdamJin 好,感谢
    Dnlyao
        13
    Dnlyao  
    OP
       70 天前
    @laminux29 好的,感谢
    assassing
        14
    assassing  
       70 天前
    有些情况下,容器内日志可以占用达到上百 GB 。

    解决方法是使用 docker-compose down 命令删除容器,再使用 docker-compose up -d 启动。这样容器内所有临时文件,包括日志都会自动清除。
    assassing
        15
    assassing  
       70 天前
    @laminux29 #9 为什么这么复杂-_-。我理解的扩容是新加一块更大的物理硬盘,格式化后把 /data/databases/mongodb/ 目录转移过去就行了
    laminux29
        16
    laminux29  
       70 天前
    @assassing

    如果是自用+不重要的数据,为了方便,甚至可以直接在线+原地扩容。

    但问题是,楼主说 MongoDB ,我认为很大可能是生产数据。

    生产数据的扩容,步骤非常多,原因是需要确保每个环节的正确性,毕竟数据无价,某些公司,如果数据没了,公司也没了。

    我在上面发的步骤,检查内存,检查存储,并且复制完成后,还要进行一次验证,生产数据必须严格按照 3 副本原则等等,这些都是生产数据处理时的必要步骤。
    assassing
        17
    assassing  
       70 天前
    @laminux29 #16 是的,LVM 可以原地扩容,不需要动 Mongo 。生产环境多节点情况下,是一个个节点扩容,Mongo 自带数据校验并且能自动切换主从,也不需要停机。Mongo 备份有专用命令,不是通过打包(虽然也可以)。
    ha1o
        18
    ha1o  
       69 天前
    确定是真实数据库数据太多导致磁盘满了吗?有可能是 docker 的问题:
    ```docker system df```看一下 RECLAIMABLE 是不是占用很大,是的话应该重启下服务这些空间就回收了
    julyclyde
        19
    julyclyde  
       69 天前
    @assassing 首先得核实一下日志是在容器内而不是 volume 上
    其次还得核实一下数据是在 volume 上而非容器内
    然后才能用你这个方法

    如果未核实就直接上,有可能死的很惨
    assassing
        20
    assassing  
       69 天前
    @julyclyde #19 没有修改配置的前提下,官方镜像默认将数据库存放到 /data/db 目录内,这里已经挂载出来了,没有用到数据卷。
    julyclyde
        21
    julyclyde  
       69 天前
    @assassing “没有修改配置的前提下”
    assassing
        22
    assassing  
       69 天前
    @julyclyde #21 哈哈,那就惨了。我只见过没有把数据目录挂载出来的,不敢删容器。不然创建容器时,都会到本地挂载目录看一眼,确定挂载成功,里面有文件。
    julyclyde
        23
    julyclyde  
       69 天前
    @assassing 你这个做法就是核实啊
    核实之后就能放心了
    512357301
        24
    512357301  
       68 天前
    @assassing 没有挂载出来也有办法,先把容器 stop ,然后把数据目录 copy 出来一份,然后新建一个容器,把数据目录挂载进去
    ryan4yin
        25
    ryan4yin  
       68 天前   ❤️ 1
    首先通过 du / df /ncdu 定位到是谁占用了存储,如果是 Mongo 数据那就得看数据能不能删除,或者机器能不能扩容了。

    如果是日志太大,docker compose 有参数可以限制日志文件大小:
    https://stackoverflow.com/questions/39078715/specify-max-log-json-file-size-in-docker-compose

    清理日志这方面,可以停机的话就直接 docker-compose down 再 up ,停机会有问题的话可以直接 root 用户下运行这个命令把日志清空:

    echo '' > /path/to/log/file
    Dnlyao
        26
    Dnlyao  
    OP
       67 天前
    @ryan4yin 好的 感谢回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3102 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 13:57 · PVG 21:57 · LAX 05:57 · JFK 08:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.