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

77 天前
 Dnlyao
2453 次点击
所在节点    Linux
26 条回复
Dnlyao
77 天前
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
77 天前
要么扩容要么删数据,还能怎么处理?
Dnlyao
77 天前
@AoEiuV020JP 这样写 /data/db 文件夹内全是数据是吧?不会出现容器日志导出来是吗?
julyclyde
77 天前
什么叫“容器日志导出来“??
@Dnlyao
Nazz
77 天前
扩容, 然后新建分区挂载逻辑卷到根目录
Dnlyao
77 天前
@julyclyde 之前搜的清理帖子,说是有 docker 日志,和容器内的日志在服务器上,所以导致占用高。想问一下,这么些 compose 文件,是否和日志相关。
AdamJin
77 天前
你可以看下容器的 logpath ,其中 log 文件大不大。
AdamJin
77 天前
du -h $(docker inspect --format='{{.LogPath}}' $(docker ps -qa))
laminux29
77 天前
你这 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
77 天前
@Dnlyao 既然是盘满了,你可以先找一下哪些文件占用高,再问这是什么文件
而不是先打听某些占用高,然后去看它是不是真的占用高
Dnlyao
77 天前
Dnlyao
77 天前
@AdamJin 好,感谢
Dnlyao
77 天前
@laminux29 好的,感谢
assassing
77 天前
有些情况下,容器内日志可以占用达到上百 GB 。

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

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

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

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

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

如果未核实就直接上,有可能死的很惨
assassing
76 天前
@julyclyde #19 没有修改配置的前提下,官方镜像默认将数据库存放到 /data/db 目录内,这里已经挂载出来了,没有用到数据卷。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1068095

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX