1 Dnlyao OP 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 文件,能清理,还是只能加硬盘? |
![]() | 2 AoEiuV020JP 2024-08-27 11:48:25 +08:00 要么扩容要么删数据,还能怎么处理? |
3 Dnlyao OP @AoEiuV020JP 这样写 /data/db 文件夹内全是数据是吧?不会出现容器日志导出来是吗? |
![]() | 5 Nazz 2024-08-27 13:30:55 +08:00 扩容, 然后新建分区挂载逻辑卷到根目录 |
6 Dnlyao OP @julyclyde 之前搜的清理帖子,说是有 docker 日志,和容器内的日志在服务器上,所以导致占用高。想问一下,这么些 compose 文件,是否和日志相关。 |
/td> | 7 AdamJin 2024-08-27 14:43:26 +08:00 你可以看下容器的 logpath ,其中 log 文件大不大。 |
8 AdamJin 2024-08-27 14:43:58 +08:00 ![]() du -h $(docker inspect --format='{{.LogPath}}' $(docker ps -qa)) |
9 laminux29 2024-08-27 14:53:58 +08:00 ![]() 你这 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.扩容完毕后,数据导回去就行,但记得复制时,同样需要打开校验选项。 |
10 julyclyde 2024-08-27 15:57:00 +08:00 ![]() @Dnlyao 既然是盘满了,你可以先找一下哪些文件占用高,再问这是什么文件 而不是先打听某些占用高,然后去看它是不是真的占用高 |
![]() | 14 assassing 2024-08-27 17:00:12 +08:00 有些情况下,容器内日志可以占用达到上百 GB 。 解决方法是使用 docker-compose down 命令删除容器,再使用 docker-compose up -d 启动。这样容器内所有临时文件,包括日志都会自动清除。 |
![]() | 15 assassing 2024-08-27 17:03:51 +08:00 @laminux29 #9 为什么这么复杂-_-。我理解的扩容是新加一块更大的物理硬盘,格式化后把 /data/databases/mongodb/ 目录转移过去就行了 |
16 laminux29 2024-08-27 18:01:05 +08:00 @assassing 如果是自用+不重要的数据,为了方便,甚至可以直接在线+原地扩容。 但问题是,楼主说 MongoDB ,我认为很大可能是生产数据。 生产数据的扩容,步骤非常多,原因是需要确保每个环节的正确性,毕竟数据无价,某些公司,如果数据没了,公司也没了。 我在上面发的步骤,检查内存,检查存储,并且复制完成后,还要进行一次验证,生产数据必须严格按照 3 副本原则等等,这些都是生产数据处理时的必要步骤。 |
![]() | 17 assassing 2024-08-27 18:54:22 +08:00 @laminux29 #16 是的,LVM 可以原地扩容,不需要动 Mongo 。生产环境多节点情况下,是一个个节点扩容,Mongo 自带数据校验并且能自动切换主从,也不需要停机。Mongo 备份有专用命令,不是通过打包(虽然也可以)。 |
![]() | 18 ha1o 2024-08-28 09:19:19 +08:00 确定是真实数据库数据太多导致磁盘满了吗?有可能是 docker 的问题: ```docker system df```看一下 RECLAIMABLE 是不是占用很大,是的话应该重启下服务这些空间就回收了 |
19 julyclyde 2024-08-28 10:08:53 +08:00 |
![]() | 20 assassing 2024-08-28 10:30:53 +08:00 @julyclyde #19 没有修改配置的前提下,官方镜像默认将数据库存放到 /data/db 目录内,这里已经挂载出来了,没有用到数据卷。 |
![]() | 22 assassing 2024-08-28 10:45:27 +08:00 @julyclyde #21 哈哈,那就惨了。我只见过没有把数据目录挂载出来的,不敢删容器。不然创建容器时,都会到本地挂载目录看一眼,确定挂载成功,里面有文件。 |
24 512357301 2024-08-29 00:06:08 +08:00 @assassing 没有挂载出来也有办法,先把容器 stop ,然后把数据目录 copy 出来一份,然后新建一个容器,把数据目录挂载进去 |
25 ryan4yin 2024-08-29 10:28:27 +08:00 ![]() 首先通过 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 |