MongoDB启动失败:一次困惑的经历

前言

作为一名后端工程师,MongoDB是我们日常工作中经常使用的数据库之一。最近,在启动MongoDB时遇到了一个困扰我好几天的问题,导致我花费了很长时间才将其解决,今天我就来分享一下这次缠绕了我好久的经历。

背景介绍

1. MongoDB是什么

MongoDB是一个开源的文档型数据库管理系统,其灵活的JSON数据模型和可扩展性使得它成为众多开发者和企业的首选。

2. 环境配置

我所在的团队使用的是CentOS操作系统,我的电脑安装了Docker环境,环境配置上没有任何问题。

问题描述

1. MongoDB无法启动

在运行MongoDB的启动命令后,我发现它一直处于等待连接状态,于是我检查了一下端口是否被正确占用,发现没有问题。

[root@localhost ~]# netstat -anp | grep 27017

tcp6 0 0 :::27017 :::* LISTEN 2041/docker-proxy

然后我检查了一下运行日志,结果发现了一个错,它告诉了我MongoDB无法启动的原因:

2021-05-10T08:07:47.565+0000 I CONTROL [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=4d12b8dfbef9

2021-05-10T08:07:47.566+0000 I CONTROL [initandlisten] db version v3.2.18

2021-05-10T08:07:47.566+0000 I CONTROL [initandlisten] git version: 8bec4bf3a5a23d0ef92ac12292ee756bf3e464f9

2021-05-10T08:07:47.566+0000 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.0.2k-fips 26 Jan 2017

2021-05-10T08:07:47.566+0000 I CONTROL [initandlisten] allocator: tcmalloc

2021-05-10T08:07:47.566+0000 I CONTROL [initandlisten] modules: none

2021-05-10T08:07:47.566+0000 I CONTROL [initandlisten] build environment:

2021-05-10T08:07:47.566+0000 I CONTROL [initandlisten] distmod: rhel70

2021-05-10T08:07:47.566+0000 I CONTROL [initandlisten] distarch: x86_64

2021-05-10T08:07:47.566+0000 I CONTROL [initandlisten] target_arch: x86_64

2021-05-10T08:07:47.566+0000 I CONTROL [initandlisten] options: { net: { bindIp: "0.0.0.0" }, replication: { oplogSizeMB: 5120, replSetName: "rs0" }, storage: { dbPath: "/data/db" } }

2021-05-10T08:07:47.577+0000 I STORAGE [initandlisten] exception in initAndListen: 28574 Cannot start server. The default storage engine 'wiredTiger' is not available with this build of mongod. Please specify a different storage engine explicitly, e.g. --storageEngine=mmapv1., terminating

2021-05-10T08:07:47.577+0000 I CONTROL [initandlisten] dbexit: rc: 100

看到这个错误,我稍微看了一下,发现是因为MongoDB所使用的存储引擎与当前环境不匹配导致的错误。我便联想到了环境配置方面,发现我的Docker镜像版本过低,使用的是MongoDB 3.2.18版本,与该版本的存储引擎wiredTiger不兼容。

2. 寻找解决方案

接下来,我赶紧查找了官方文档和一些网络资源,最终得出如下解决方案:

3. 解决方法

我的Docker中使用的MongoDB版本过低,所以我需要使用其他存储引擎。在这里,我选择了mmapv1作为MongoDB的存储引擎。我需要在启动脚本中加入如下内容:

mongod --storageEngine mmapv1

4. 验证

为了验证它是否能够正常启动,我重新启动了MongoDB,并查看了一下端口状态,确定它已经在工作中:

[root@localhost ~]# netstat -anp | grep 27017

tcp6 0 0 :::27017 :::* LISTEN 3075/docker-proxy

同时,查看了一下运行日志,也确定了它所使用的存储引擎:

2021-06-10T06:22:30.891+0000 I STORAGE [initandlisten] Detected data files in /data/db created by the 'mmapv1' storage engine, so setting the active storage engine to 'mmapv1'.

总结

通过这次简单的故障排查,我认识到了在调试过程中如何寻找解决方案的重要性。在遇到问题时,要及时地查找官方文档和相关资源,并将排查过程中的重要记录保存下来。这样可以为以后的调试工作提供帮助,提高我们的工作效率,也可以使我们更好地理解技术背景和技术原理,达到技术提高的目的。

数据库标签