
如果您需要一个存储类 JSON 文档、支持水平扩展、适合 Node.js、实时服务或 IoT 等现代应用的数据库——MongoDB 是全球最受欢迎的 NoSQL 数据库,为 Discord、eBay 和 Adobe 提供支持。
本指南将带您完成在 Ubuntu 22.04 上安装 MongoDB Community Edition 7.0 的全过程,从添加官方仓库到启用身份验证、创建用户、允许远程连接,以及使用 mongodump 进行备份。
前提条件:Ubuntu 22.04 VPS,至少 2 GB 内存(MongoDB 比 MySQL/PostgreSQL 消耗更多内存),sudo 权限,以及 22 端口上的 SSH 访问。
什么是 MongoDB——文档数据库的工作原理
MongoDB 以 BSON(二进制 JSON)格式存储数据。每条记录称为"文档",文档存放在"集合"中(相当于 NoSQL 中的 SQL 表)。同一集合中的文档无需具有相同结构——您可以随时动态添加字段,无需执行 ALTER TABLE。
MongoDB 与 MySQL——如何选择?
| 对比项 | MongoDB | MySQL |
|---|---|---|
| 数据结构 | 文档(BSON / JSON) | 表(行 / 列) |
| 模式 | 灵活——可随时添加字段 | 固定——需要 ALTER TABLE |
| 查询方式 | 类 JSON(find、aggregate) | 标准 SQL |
| 事务支持 | v4.0 起支持多文档事务 | InnoDB 完整 ACID 支持 |
| 最适合 | 实时应用、CMS、IoT、移动后端 | 通用网站、ERP、财务系统 |
第一步——添加 MongoDB 官方仓库
Ubuntu 默认仓库中的 MongoDB 版本较旧;官方仓库可提供 v7.0。首先导入 GPG 密钥:
sudo apt update && sudo apt install -y gnupg curl curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | \ sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor
为 Ubuntu 22.04(Jammy)添加 MongoDB 7.0 源列表:
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | \ sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
第二步——安装并启动 MongoDB
sudo apt update sudo apt install -y mongodb-org sudo systemctl start mongod sudo systemctl enable mongod sudo systemctl status mongod
若状态显示 active (running),则安装成功。打开 Shell:
mongosh
您应看到类似 test> 的提示符。列出现有数据库:
show dbs
第三步——启用身份验证(关键步骤)
MongoDB 默认不启用身份验证。在投入生产前必须启用。首先创建管理员用户:
mongosh
use admin
db.createUser({
user: "adminUser",
pwd: "StrongAdminPassword!",
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
})
exit编辑 MongoDB 配置文件:
sudo nano /etc/mongod.conf
添加(或修改)security 节:
security: authorization: enabled
重启以应用更改:
sudo systemctl restart mongod
使用管理员用户重新登录:
mongosh -u adminUser -p --authenticationDatabase admin
第四步——创建数据库与应用用户
切勿在应用中使用管理员用户。请为每个数据库单独创建用户:
use myapp_db
db.createUser({
user: "myapp",
pwd: "AppPassword123!",
roles: [ { role: "readWrite", db: "myapp_db" } ]
})测试登录:
mongosh -u myapp -p --authenticationDatabase myapp_db myapp_db
第五步——允许远程连接
MongoDB 默认仅绑定到 127.0.0.1。要接受外部客户端,请编辑 /etc/mongod.conf 中的 bindIp:
net:
port: 27017
bindIp: 0.0.0.0 # listen on every interface — pair with a firewall!⚠️ 危险:bindIp: 0.0.0.0 会将 MongoDB 暴露给整个互联网。您必须启用防火墙并限制来源 IP,并且必须先完成第三步的身份验证配置。
通过 UFW 限制访问:
sudo ufw allow from YOUR_APP_IP to any port 27017
第六步——使用 mongodump 备份
MongoDB 内置 mongodump 用于备份:
mongodump --uri="mongodb://myapp:[email protected]:27017/myapp_db" \ --out=/backup/mongo_$(date +%F)
从备份恢复:
mongorestore --uri="mongodb://myapp:[email protected]:27017/myapp_db" \ --drop /backup/mongo_2026-05-15/myapp_db
提示:通过 cron 设置每晚定时运行 mongodump,并使用 rclone 将结果上传至 S3 或 Google Drive,实现异地安全备份。
为生产环境调优 Ubuntu VPS 上的 MongoDB
安装 MongoDB 并启用身份验证后,在真实流量到来之前还有几项配置值得关注——尤其是 WiredTiger 缓存、磁盘、交换空间和日志。MongoDB 比典型 SQL 数据库消耗更多内存,配置不当可能触发 OOM(内存溢出)事件,导致内核在运行中途杀死 mongod。
默认情况下,MongoDB 将 WiredTiger 缓存设置为 50% 内存减去 1 GB。在与 Nginx、PHP-FPM 或 Node.js 共享内存的小型 VPS 上,应手动限制缓存大小,防止 MongoDB 耗尽其他服务的内存。打开 /etc/mongod.conf,在 storage 节下添加:
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 1.0 # cap cache at 1GB on a 2GB-RAM VPS对于低内存 VPS,添加交换空间以应对高负载查询,并禁用透明大页(THP)——MongoDB 建议关闭此功能,因为它会导致延迟峰值:
sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
提示:在 mongosh 中使用 db.serverStatus().wiredTiger.cache 查看 MongoDB 实际内存使用量,或使用 htop 监控整个系统。若缓存持续满载,考虑升级 VPS 内存。
创建索引以加速查询
与 SQL 一样,拥有大量文档但没有索引的集合会迫使 find() 执行全集合扫描,读取每一个文档,随着数据增长速度越来越慢。使用 explain() 找出慢查询:
db.users.find({ email: "[email protected]" }).explain("executionStats")若看到 COLLSCAN,说明该字段尚无索引。添加索引:
db.users.createIndex({ email: 1 }, { unique: true })
db.orders.createIndex({ userId: 1, createdAt: -1 }) # compound index
db.users.getIndexes() # list all indexes经验法则:仅为频繁查询或排序的字段创建索引。每个索引都会占用磁盘空间,并略微降低插入和更新速度,因此不要为每个字段都预先创建索引。
MongoDB 与 SQL 的选择时机
MongoDB 并非在所有场景下都优于 MySQL/PostgreSQL——各自适合不同类型的工作负载。一开始选错方向会导致日后出现尴尬的变通方案或痛苦的迁移。应根据数据结构和应用的查询模式来决定。
选择 MongoDB 的场景
- 数据结构不规则或模式经常变化——例如每个类别字段不同的商品目录
- 运行频繁写入且需要水平扩展(分片)的实时/聊天/IoT 应用
- 直接存储来自 API 或事件日志的 JSON 文档,无需拆分到多张表
- 基于 Node.js / MERN 栈构建,整个链路已与 JSON 无缝配合
选择 SQL(MySQL / PostgreSQL)的场景
- 数据具有需要多表 JOIN 的复杂关系——财务系统、ERP、预订平台
- 需要严格的 ACID 事务——金融、转账、库存扣减
- 需要运行复杂 SQL 分析报告(GROUP BY、窗口函数)
- 团队已熟悉 SQL,且不需要大规模水平分片
实际应用:许多系统同时使用两者——SQL 处理核心事务数据(用户、订单、财务),MongoDB 处理日志、动态流或灵活模式内容。只要内存足够,单台 VPS 可同时运行两者。
mongosh 常用命令
show dbs— 列出数据库use dbname— 切换数据库show collections— 列出集合db.users.find()— 查询所有文档db.users.insertOne({...})— 插入一条文档db.users.updateOne({...},{$set:{...}})— 更新文档db.users.deleteMany({...})— 删除文档
安装后检查清单
- 从官方仓库安装(而非 Ubuntu 默认仓库)以获取最新版本
- 立即启用
authorization: enabled——生产环境绝不可无身份验证运行 - 为每个数据库创建独立用户——应用中绝不使用管理员用户
- 若开放远程访问,必须通过 UFW 限制来源 IP
- 设置每日定时
mongodump并将备份传至异地 - 监控磁盘使用量——MongoDB 比 MySQL 消耗更多磁盘空间
常见问题解答
MongoDB 在 VPS 上需要多少内存?
测试或小型网站从 2 GB 开始即可,但 MongoDB 比 MySQL 消耗更多内存,因为 WiredTiger 缓存会尽力将工作数据集保存在内存中。随着数据增长或并发查询增加,建议使用 4 GB 或更多——并在配置中限制 cacheSizeGB,防止 MongoDB 耗尽 VPS 上其他服务的内存。AsiaGB VPS 每月起价 500 泰铢,SSD 存储,内存规格自由选择。
MongoDB 和 MySQL 能在同一台 VPS 上运行吗?
可以,而且非常常见。许多系统将 MySQL 用于核心事务数据,将 MongoDB 用于日志或灵活模式内容。它们运行在不同端口(MySQL 3306,MongoDB 27017),互不冲突,但需确保 VPS 内存足够两者使用,并合理设置 MongoDB 的 cacheSizeGB,避免相互争抢内存。
忘记 MongoDB 管理员密码怎么办?
停止 mongod,编辑 /etc/mongod.conf 临时禁用 authorization: enabled,重启后无密码进入 mongosh。然后运行 db.changeUserPassword("adminUser","NewPassword") 设置新密码,重新启用身份验证并再次重启。在禁用身份验证期间,请先将 bindIp 改回 127.0.0.1 或通过防火墙关闭远程访问。
在数据库使用中可以用 mongodump 备份吗?
可以——mongodump 在不停止服务的情况下在线读取数据。不过对于大型高写入量数据库,快照可能不完全一致;如需精确的时间点备份,请使用带 --oplog 的副本集或文件系统快照。对于普通网站,每晚定时 mongodump 并传至异地已完全足够。
需要可靠的 VPS 运行 MongoDB?
AsiaGB Linux VPS,SSD 存储,每月起价 500 泰铢。充足内存支持 MongoDB,完整 Root 权限,提供泰国 / 新加坡数据中心。
查看 VPS 套餐