本文档风哥主要介绍MongoDB社区版安装与生产初始化配置,包括MongoDB安装基础概念、安装方式、系统要求、安装前准备、安装规划、安装后配置、RPM包安装、二进制安装、初始化配置、安装实战案例、初始化配置实战、验证测试实战等内容,风哥教程参考MongoDB官方文档Installation Guides内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 MongoDB安装基础概念
MongoDB是一个开源的文档数据库,提供高性能、高可用性和自动扩展能力。在安装MongoDB之前,需要了解一些基础概念:
- 社区版(Community Edition):免费开源版本,适合大多数应用场景
- 企业版(Enterprise Edition):商业版本,提供更多高级功能和支持
- mongod:MongoDB服务器进程
- mongos:查询路由器,用于分片集群
- mongo/mongosh:命令行工具,用于与MongoDB交互
1.2 MongoDB安装方式
MongoDB提供多种安装方式,根据不同的操作系统和需求选择合适的安装方式:
## 包管理器安装
– RPM包(Red Hat/CentOS/Oracle Linux)
– DEB包(Ubuntu/Debian)
– Homebrew(macOS)
## 二进制安装
– 下载预编译的二进制包
– 手动配置和安装
## 容器安装
– Docker容器
– Kubernetes
## 云服务
– MongoDB Atlas
– AWS DocumentDB
– Azure Cosmos DB
1.3 MongoDB系统要求
MongoDB的系统要求取决于部署规模和使用场景,以下是推荐的系统要求:
## 操作系统
– Red Hat Enterprise Linux/CentOS/Oracle Linux 7.0+
– Ubuntu 18.04 LTS+
– Debian 9.0+
– SUSE Linux Enterprise Server 12+
– macOS 10.14+
– Windows Server 2016+
## 硬件要求
– 内存:至少4GB RAM,生产环境建议16GB+
– CPU:至少2核,生产环境建议4核+
– 存储:至少10GB可用空间,生产环境建议SSD
– 网络:千兆网络接口
## 软件依赖
– libcurl
– openssl
– liblzma
– libssl
Part02-生产环境规划与建议
2.1 MongoDB安装前准备
在安装MongoDB之前,需要进行以下准备工作:
## 系统检查
– 检查操作系统版本
– 检查硬件资源
– 检查网络连接
## 系统优化
– 关闭透明大页
– 关闭NUMA
– 调整文件描述符限制
– 调整内核参数
## 目录规划
– 数据目录:/mongodb/fgdata
– 日志目录:/mongodb/log
– 配置目录:/mongodb/conf
– 安装目录:/mongodb/app
## 用户规划
– 创建MongoDB用户和组
– 设置适当的权限
2.2 MongoDB安装规划
根据业务需求和部署规模,制定MongoDB安装规划:
## 部署模式
– 单节点部署:适合开发和测试环境
– 副本集部署:适合生产环境,提供高可用性
– 分片集群部署:适合大规模数据和高并发场景
## 版本选择
– 稳定版:最新的稳定版本
– LTS版:长期支持版本
## 安装方式选择
– 包管理器安装:简单方便,适合大多数场景
– 二进制安装:灵活可控,适合需要定制的场景
– 容器安装:适合容器化部署环境
## 网络规划
– 端口配置:默认27017
– 防火墙规则:允许MongoDB端口访问
– 网络拓扑:根据部署模式设计网络架构
2.3 MongoDB安装后配置
安装MongoDB后,需要进行以下配置:
## 基本配置
– 创建配置文件
– 设置数据目录和日志目录
– 配置网络参数
– 设置安全选项
## 服务管理
– 配置系统服务
– 设置开机自启
– 配置服务监控
## 安全配置
– 启用认证
– 创建管理员用户
– 配置访问控制
– 启用SSL/TLS
## 性能优化
– 调整内存使用
– 配置存储引擎
– 优化查询性能
– 设置合理的缓存大小
Part03-生产环境项目实施方案
3.1 MongoDB RPM包安装
3.1.1 配置MongoDB YUM源
$ cat > /etc/yum.repos.d/mongodb-org-5.0.repo << EOF [mongodb-org-5.0] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/8/mongodb-org/5.0/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-5.0.asc EOF
3.1.2 安装MongoDB
$ sudo yum install -y mongodb-org
# 验证安装
$ mongod –version
db version v5.0.13
Build Info:
Version: 5.0.13
Git Version: 296987339731707f37e20b20c52a048929b3904e
OpenSSL version: OpenSSL 1.1.1k FIPS 25 Mar 2021
modules:
build environment:
distmod: rhel80
distarch: x86_64
target_arch: x86_64
# 检查MongoDB服务状态
$ sudo systemctl status mongod
3.2 MongoDB二进制安装
3.2.1 下载MongoDB二进制包
$ cd /tmp
$ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-5.0.13.tgz
# 解压二进制包
$ tar -zxvf mongodb-linux-x86_64-rhel80-5.0.13.tgz
# 移动到安装目录
$ sudo mv mongodb-linux-x86_64-rhel80-5.0.13 /mongodb/app
3.2.2 创建目录结构
$ sudo mkdir -p /mongodb/fgdata
$ sudo mkdir -p /mongodb/log
$ sudo mkdir -p /mongodb/conf
# 创建MongoDB用户和组
$ sudo groupadd mongodb
$ sudo useradd -g mongodb -s /bin/bash -m mongodb
# 设置权限
$ sudo chown -R mongodb:mongodb /mongodb
3.3 MongoDB初始化配置
3.3.1 创建配置文件
$ cat > /mongodb/conf/mongod.conf << EOF # mongod.conf # for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/ # Where and how to store data. storage: dbPath: /mongodb/fgdata journal: enabled: true # where to write logging data. systemLog: destination: file logAppend: true path: /mongodb/log/mongod.log # network interfaces net: port: 27017 bindIp: 0.0.0.0 # how the process runs processManagement: fork: true pidFilePath: /mongodb/app/mongod.pid # security security: authorization: enabled EOF
3.3.2 启动MongoDB服务
$ sudo -u mongodb /mongodb/app/bin/mongod –config /mongodb/conf/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 12345
child process started successfully, parent exiting
# 检查服务状态
$ ps -ef | grep mongod
mongodb 12345 1 0 10:00 ? 00:00:01 /mongodb/app/bin/mongod –config /mongodb/conf/mongod.conf
# 检查端口
$ netstat -tuln | grep 27017
tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN
3.3.3 创建管理员用户
$ /mongodb/app/bin/mongosh
# 切换到admin数据库
fgedu.net.cn> use admin
# 创建管理员用户
fgedu.net.cn> db.createUser({
… user: “fgedu”,
… pwd: “fgedu123”,
… roles: [ { role: “userAdminAnyDatabase”, db: “admin” }, “readWriteAnyDatabase” ]
… })
# 验证用户创建
fgedu.net.cn> db.getUsers()
# 退出并重新连接(使用认证)
fgedu.net.cn> exit
$ /mongodb/app/bin/mongosh -u fgedu -p fgedu123 –authenticationDatabase admin
Part04-生产案例与实战讲解
4.1 MongoDB安装实战案例
以下是一个生产环境中的MongoDB安装实战案例:
## 环境信息
– 操作系统:Oracle Linux 9.3
– 服务器:3台(192.168.1.101, 192.168.1.102, 192.168.1.103)
– MongoDB版本:5.0.13
– 部署模式:副本集
## 安装步骤
### 1. 配置YUM源(所有节点)
$ cat > /etc/yum.repos.d/mongodb-org-5.0.repo << EOF
[mongodb-org-5.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/9/mongodb-org/5.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-5.0.asc
EOF
### 2. 安装MongoDB(所有节点)
$ sudo yum install -y mongodb-org
### 3. 创建目录结构(所有节点)
$ sudo mkdir -p /mongodb/fgdata
$ sudo mkdir -p /mongodb/log
$ sudo mkdir -p /mongodb/conf
$ sudo chown -R mongodb:mongodb /mongodb
### 4. 配置MongoDB(所有节点)
$ cat > /mongodb/conf/mongod.conf << EOF
# mongod.conf
storage:
dbPath: /mongodb/fgdata
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /mongodb/log/mongod.log
net:
port: 27017
bindIp: 0.0.0.0
processManagement:
fork: true
pidFilePath: /mongodb/app/mongod.pid
replication:
replSetName: rs0
security:
authorization: enabled
keyFile: /mongodb/conf/keyfile
EOF
### 5. 创建keyfile(所有节点)
$ openssl rand -base64 756 > /mongodb/conf/keyfile
$ chmod 400 /mongodb/conf/keyfile
$ chown mongodb:mongodb /mongodb/conf/keyfile
### 6. 启动MongoDB(所有节点)
$ sudo systemctl start mongod
$ sudo systemctl enable mongod
### 7. 初始化副本集
$ /mongodb/app/bin/mongosh -u fgedu -p fgedu123 –authenticationDatabase admin
fgedu.net.cn> rs.initiate()
fgedu.net.cn> rs.add(“192.168.1.102:27017”)
fgedu.net.cn> rs.add(“192.168.1.103:27017”)
fgedu.net.cn> rs.status()
4.2 MongoDB初始化配置实战
以下是MongoDB初始化配置的实战案例:
## 1. 系统参数优化
$ cat > /etc/sysctl.d/mongodb.conf << EOF
fs.file-max = 6815744
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1073741824
kernel.shmmax = 4398046511104
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_fin_timeout = 30
EOF
$ sysctl -p /etc/sysctl.d/mongodb.conf
## 2. 关闭透明大页
$ cat > /etc/rc.d/rc.local << EOF
#!/bin/bash
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
EOF
$ chmod +x /etc/rc.d/rc.local
$ /etc/rc.d/rc.local
## 3. 调整文件描述符限制
$ cat > /etc/security/limits.d/mongodb.conf << EOF
mongodb soft nofile 65536
mongodb hard nofile 65536
EOF
## 4. 配置MongoDB服务
$ cat > /etc/systemd/system/mongod.service << EOF
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network.target
[Service]
User=mongodb
Group=mongodb
ExecStart=/mongodb/app/bin/mongod --config /mongodb/conf/mongod.conf
PIDFile=/mongodb/app/mongod.pid
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
$ systemctl daemon-reload
$ systemctl enable mongod
$ systemctl start mongod
4.3 MongoDB验证测试实战
以下是MongoDB验证测试的实战案例:
## 1. 连接测试
$ /mongodb/app/bin/mongosh -u fgedu -p fgedu123 –authenticationDatabase admin
## 2. 数据库操作测试
fgedu.net.cn> use fgedudb
switched to db fgedudb
fgedu.net.cn> db.createCollection(“fgedu_collection”)
{ ok: 1 }
fgedu.net.cn> db.fgedu_collection.insertOne({name: “fgedu”, age: 30, email: “fgedu@fgedu.net.cn”})
{
acknowledged: true,
insertedId: ObjectId(“60a7b3c8d9e0f1a2b3c4d5e7”)
}
fgedu.net.cn> db.fgedu_collection.find()
[ { _id: ObjectId(“60a7b3c8d9e0f1a2b3c4d5e7″), name: ‘fgedu’, age: 30, email: ‘fgedu@fgedu.net.cn’ } ]
## 3. 副本集状态测试
fgedu.net.cn> rs.status()
{
set: ‘rs0’,
date: ISODate(‘2026-04-07T02:00:00Z’),
myState: 1,
term: NumberLong(1),
syncingTo: ”,
syncSourceHost: ”,
syncSourceId: -1,
heartbeatIntervalMillis: NumberLong(2000),
majorityVoteCount: 2,
writeMajorityCount: 2,
votingMembersCount: 3,
writableVotingMembersCount: 3,
optimes: {
lastCommittedOpTime: { ts: Timestamp({ t: 1617782400, i: 1 }), t: NumberLong(1) },
lastCommittedWallTime: ISODate(‘2026-04-07T02:00:00Z’),
readConcernMajorityOpTime: { ts: Timestamp({ t: 1617782400, i: 1 }), t: NumberLong(1) },
appliedOpTime: { ts: Timestamp({ t: 1617782400, i: 1 }), t: NumberLong(1) },
durableOpTime: { ts: Timestamp({ t: 1617782400, i: 1 }), t: NumberLong(1) },
lastAppliedWallTime: ISODate(‘2026-04-07T02:00:00Z’),
lastDurableWallTime: ISODate(‘2026-04-07T02:00:00Z’)
},
lastStableRecoveryTimestamp: Timestamp({ t: 1617782400, i: 1 }),
electionCandidateMetrics: {
lastElectionReason: ‘electionTimeout’,
lastElectionDate: ISODate(‘2026-04-07T01:59:00Z’),
electionTerm: NumberLong(1),
lastCommittedOpTimeAtElection: { ts: Timestamp({ t: 0, i: 0 }), t: NumberLong(-1) },
lastSeenOpTimeAtElection: { ts: Timestamp({ t: 1617782340, i: 1 }), t: NumberLong(-1) },
numVotesNeeded: 2,
priorityAtElection: 1,
electionTimeoutMillis: NumberLong(10000),
newTermStartDate: ISODate(‘2026-04-07T01:59:00Z’),
wMajorityWriteAvailabilityDate: ISODate(‘2026-04-07T01:59:01Z’)
},
members: [
{
_id: 0,
name: ‘192.168.1.101:27017’,
health: 1,
state: 1,
stateStr: ‘PRIMARY’,
uptime: 3600,
optime: { ts: Timestamp({ t: 1617782400, i: 1 }), t: NumberLong(1) },
optimeDate: ISODate(‘2026-04-07T02:00:00Z’),
syncingTo: ”,
syncSourceHost: ”,
syncSourceId: -1,
infoMessage: ”,
electionTime: Timestamp({ t: 1617778740, i: 1 }),
electionDate: ISODate(‘2026-04-07T01:59:00Z’),
configVersion: 3,
configTerm: 1,
self: true,
lastHeartbeatMessage: ”
},
{
_id: 1,
name: ‘192.168.1.102:27017’,
health: 1,
state: 2,
stateStr: ‘SECONDARY’,
uptime: 3540,
optime: { ts: Timestamp({ t: 1617782400, i: 1 }), t: NumberLong(1) },
optimeDurable: { ts: Timestamp({ t: 1617782400, i: 1 }), t: NumberLong(1) },
optimeDate: ISODate(‘2026-04-07T02:00:00Z’),
optimeDurableDate: ISODate(‘2026-04-07T02:00:00Z’),
lastHeartbeat: ISODate(‘2026-04-07T02:00:00Z’),
lastHeartbeatRecv: ISODate(‘2026-04-07T02:00:00Z’),
pingMs: NumberLong(1),
lastHeartbeatMessage: ”,
syncingTo: ‘192.168.1.101:27017’,
syncSourceHost: ‘192.168.1.101:27017’,
syncSourceId: 0,
infoMessage: ”,
configVersion: 3,
configTerm: 1
},
{
_id: 2,
name: ‘192.168.1.103:27017’,
health: 1,
state: 2,
stateStr: ‘SECONDARY’,
uptime: 3540,
optime: { ts: Timestamp({ t: 1617782400, i: 1 }), t: NumberLong(1) },
optimeDurable: { ts: Timestamp({ t: 1617782400, i: 1 }), t: NumberLong(1) },
optimeDate: ISODate(‘2026-04-07T02:00:00Z’),
optimeDurableDate: ISODate(‘2026-04-07T02:00:00Z’),
lastHeartbeat: ISODate(‘2026-04-07T02:00:00Z’),
lastHeartbeatRecv: ISODate(‘2026-04-07T02:00:00Z’),
pingMs: NumberLong(1),
lastHeartbeatMessage: ”,
syncingTo: ‘192.168.1.101:27017’,
syncSourceHost: ‘192.168.1.101:27017’,
syncSourceId: 0,
infoMessage: ”,
configVersion: 3,
configTerm: 1
}
],
ok: 1,
‘$clusterTime’: {
clusterTime: Timestamp({ t: 1617782400, i: 1 }),
signature: {
hash: Binary(Buffer.from(‘0000000000000000000000000000000000000000’, ‘hex’), 0),
keyId: NumberLong(0)
}
},
operationTime: Timestamp({ t: 1617782400, i: 1 })
}
## 4. 性能测试
fgedu.net.cn> var start = new Date()
fgedu.net.cn> for (let i = 0; i < 10000; i++) {
... db.fgedu_collection.insertOne({id: i, name: "test" + i, value: Math.random() * 1000})
... }
fgedu.net.cn> var end = new Date()
fgedu.net.cn> print(“插入时间: ” + (end – start) + “毫秒”)
插入时间: 1200毫秒
fgedu.net.cn> var start = new Date()
fgedu.net.cn> db.fgedu_collection.find({id: {$gt: 5000}}).limit(1000)
fgedu.net.cn> var end = new Date()
fgedu.net.cn> print(“查询时间: ” + (end – start) + “毫秒”)
查询时间: 15毫秒
Part05-风哥经验总结与分享
5.1 MongoDB安装最佳实践
MongoDB安装的最佳实践建议:
## 系统选择
– 使用64位操作系统
– 选择稳定的Linux发行版
– 确保操作系统补丁更新
## 硬件配置
– 使用SSD存储
– 足够的内存(至少16GB)
– 多核CPU
– 高速网络
## 安装方式
– 生产环境推荐使用包管理器安装
– 开发环境可以使用二进制安装
– 容器环境使用Docker
## 目录规划
– 数据目录与日志目录分离
– 使用独立的磁盘分区
– 合理规划目录结构
## 安全配置
– 启用认证
– 创建强密码
– 限制网络访问
– 启用SSL/TLS
5.2 MongoDB初始化最佳实践
MongoDB初始化的最佳实践建议:
## 系统优化
– 关闭透明大页
– 关闭NUMA
– 调整文件描述符限制
– 优化内核参数
## 配置文件
– 使用YAML格式配置文件
– 合理设置数据目录和日志目录
– 配置适当的网络参数
– 启用日志轮转
## 服务管理
– 使用systemd管理服务
– 设置开机自启
– 配置服务监控
– 定期检查服务状态
## 安全管理
– 创建管理员用户
– 配置基于角色的访问控制
– 定期更新密码
– 审计日志
## 性能优化
– 调整WiredTiger缓存大小
– 配置合理的索引
– 优化查询语句
– 监控性能指标
5.3 MongoDB安装常见问题解决
MongoDB安装常见问题的解决方案:
## 端口被占用
– 症状:启动MongoDB时报错”Address already in use”
– 解决方案:
– 检查是否有其他MongoDB进程在运行
– 使用不同的端口
– 停止占用端口的进程
## 权限问题
– 症状:启动MongoDB时报错”Permission denied”
– 解决方案:
– 检查目录权限
– 确保MongoDB用户有适当的权限
– 检查SELinux或防火墙设置
## 内存不足
– 症状:启动MongoDB时报错”Out of memory”
– 解决方案:
– 增加服务器内存
– 调整MongoDB内存使用参数
– 关闭其他占用内存的服务
## 数据目录问题
– 症状:启动MongoDB时报错”Failed to create directory”
– 解决方案:
– 检查数据目录是否存在
– 确保MongoDB用户有写权限
– 检查磁盘空间
## 副本集初始化失败
– 症状:初始化副本集时报错
– 解决方案:
– 检查网络连接
– 确保所有节点都已启动
– 检查keyfile配置
– 检查防火墙设置
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
