求助, Linux 上使用 docker 部署 mongdb,使用持久化,数据在硬盘上,快满了,如何处理? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Dnlyao
V2EX    Linux

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

  •  
  • Dnlyao 2024-08-27 11:44:02 +08:00 2982 次点击
    这是一个创建于 411 天前的主题,其中的信息可能已经有所发展或是发生改变。
    26 条回复    2024-08-30 09:13:39 +08:00
    Dnlyao
        1
    Dnlyao  
    OP
       2024-08-27 11:47:26 +08:00
    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  
       2024-08-27 11:48:25 +08:00
    要么扩容要么删数据,还能怎么处理?
    Dnlyao
        3
    Dnlyao  
    OP
       2024-08-27 11:50:25 +08:00
    @AoEiuV020JP 这样写 /data/db 文件夹内全是数据是吧?不会出现容器日志导出来是吗?
    julyclyde
        4
    julyclyde  
       2024-08-27 11:58:52 +08:00
    什么叫“容器日志导出来“??
    @Dnlyao
    Nazz
        5
    Nazz  
       2024-08-27 13:30:55 +08:00
    扩容, 然后新建分区挂载逻辑卷到根目录
    Dnlyao
        6
    Dnlyao  
    OP
       2024-08-27 14:08:44 +08:00
    @julyclyde 之前搜的清理帖子,说是有 docker 日志,和容器内的日志在服务器上,所以导致占用高。想问一下,这么些 compose 文件,是否和日志相关。
    AdamJin /td>
        7
    AdamJin  
       2024-08-27 14:43:26 +08:00
    你可以看下容器的 logpath ,其中 log 文件大不大。
    AdamJin
        8
    AdamJin  
       2024-08-27 14:43:58 +08:00   1
    du -h $(docker inspect --format='{{.LogPath}}' $(docker ps -qa))
    laminux29
        9
    laminux29  
       2024-08-27 14:53:58 +08:00   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  
       2024-08-27 15:57:00 +08:00   1
    @Dnlyao 既然是盘满了,你可以先找一下哪些文件占用高,再问这是什么文件
    而不是先打听某些占用高,然后去看它是不是真的占用高
    Dnlyao
        11
    Dnlyao  
    OP
       2024-08-27 16:05:44 +08:00
    Dnlyao
        12
    Dnlyao  
    OP
       2024-08-27 16:06:06 +08:00
    @AdamJin 好,感谢
    Dnlyao
        13
    Dnlyao  
    OP
       2024-08-27 16:06:17 +08:00
    @laminux29 好的,感谢
    assassing
        14
    assassing  
       2024-08-27 17:00:12 +08:00
    有些情况下,容器内日志可以占用达到上百 GB 。

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

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

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

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

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

    如果未核实就直接上,有可能死的很惨
    assassing
        20
    assassing  
       2024-08-28 10:30:53 +08:00
    @julyclyde #19 没有修改配置的前提下,官方镜像默认将数据库存放到 /data/db 目录内,这里已经挂载出来了,没有用到数据卷。
    julyclyde
        21
    julyclyde  
       2024-08-28 10:36:56 +08:00
    @assassing “没有修改配置的前提下”
    assassing
        22
    assassing  
       2024-08-28 10:45:27 +08:00
    @julyclyde #21 哈哈,那就惨了。我只见过没有把数据目录挂载出来的,不敢删容器。不然创建容器时,都会到本地挂载目录看一眼,确定挂载成功,里面有文件。
    julyclyde
        23
    julyclyde  
       2024-08-28 10:47:31 +08:00
    @assassing 你这个做法就是核实啊
    核实之后就能放心了
    512357301
        24
    512357301  
       2024-08-29 00:06:08 +08:00
    @assassing 没有挂载出来也有办法,先把容器 stop ,然后把数据目录 copy 出来一份,然后新建一个容器,把数据目录挂载进去
    ryan4yin
        25
    ryan4yin  
       2024-08-29 10:28:27 +08:00   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
       2024-08-30 09:13:39 +08:00
    @ryan4yin 好的 感谢回复
    关于     帮助文档     自助推广系统   &nsp; 博客     API     FAQ     Solana     2810 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 13:31 PVG 21:31 LAX 06:31 JFK 09:31
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86