MongoDB 完整指南:VPS 上的安装、功能和最佳实践
MongoDB 是世界上最强大和应用最广泛的 NoSQL 数据库之一——这是有原因的。其灵活的文档导向架构使其成为开发人员构建需要快速扩展的现代数据密集型应用程序的首选。无论您是在运行初创公司 MVP 还是管理企业级基础设施,MongoDB 与高性能托管环境相结合,都能为您的应用程序提供所需的速度、灵活性和可靠性。
在本综合指南中,您将了解什么是 MongoDB、它为何与传统关系数据库不同、如何在 Ubuntu 上安装它,以及如何使用 MongoDB shell 执行基本操作。
什么是MongoDB以及为什么应该使用它?
MongoDB是一个开源的面向文档的NoSQL数据库,它以灵活的JSON类文档(称为BSON二进制JSON)的形式存储数据。与依赖于严格的表-行-列结构的传统关系数据库不同,MongoDB允许集合中的每个文档拥有自己独特的结构。这使其特别适合于具有不断演变或不可预测数据模型的应用程序。
MongoDB相对于传统SQL数据库的主要优势
| 特性 | MongoDB (NoSQL) | 传统SQL |
|---|---|---|
| 数据模型 | 灵活的文档 (BSON) | 固定架构(表/行) |
| 可扩展性 | 水平扩展(分片) | 主要是垂直扩展 |
| 架构更改 | 无架构,动态 | 需要迁移 |
| 查询语言 | 丰富的MQL + 聚合 | SQL |
| 最适合 | 动态、非结构化数据 | 结构化、关系数据 |
| 大规模性能 | 使用分片时性能优异 | 未经调优可能性能下降 |
MongoDB适用于广泛的用例,包括实时分析、内容管理系统、电子商务平台、物联网数据摄取、移动后端,以及任何数据结构可能随时间变化的应用程序。
为什么在 VPS 上托管 MongoDB?
在专用虚拟私有服务器上托管 MongoDB 可以为您提供共享环境根本无法提供的控制、性能和安全级别。使用 AlexHost 的 VPS 托管计划,您可以获得:
- 完全的 root 访问权限,可以根据您的应用程序要求精确配置 MongoDB
- 专用 RAM 和 CPU 资源,用于处理要求苛刻的读写工作负载
- 隔离环境,消除共享托管中常见的”嘈杂邻居”问题
- 无缝的垂直和水平扩展,随着数据增长而扩展
- 自定义防火墙和网络规则,以锁定数据库访问
对于吞吐量要求特别高的应用程序,AlexHost 的 专用服务器提供裸机性能和完整的硬件隔离 — 这是生产 MongoDB 部署的黄金标准。
第1部分:理解MongoDB的核心架构
在开始安装之前,重要的是要理解MongoDB如何组织和管理数据。
文档
MongoDB中数据的基本单位是文档——一个类似JSON的对象,可以包含嵌套字段、数组和混合数据类型。例如:
{
"_id": ObjectId("64b1f2c3e4b0a1d2e3f4a5b6"),
"name": "Alice",
"age": 30,
"email": "alice@example.com",
"address": {
"city": "New York",
"zip": "10001"
},
"tags": ["developer", "mongodb", "nodejs"]
}集合
文档被分组到集合中,这类似于SQL数据库中的表。但是,与SQL表不同,集合不强制执行固定的模式——同一集合中的文档可以具有完全不同的字段。
数据库
一个MongoDB服务器可以托管多个数据库,每个数据库包含自己的一组集合。这使得在单个服务器实例上轻松隔离不同应用程序或环境(例如开发、暂存、生产)的数据。
第2部分:MongoDB的关键特性
2.1 文档导向存储
MongoDB的文档模型是其最强大的功能之一。由于每个文档可以具有不同的结构,开发人员可以随着应用程序需求的变化而有机地发展数据库架构——无需运行复杂的ALTER TABLE迁移或经历停机时间。
这种灵活性在敏捷开发环境中特别有价值,在这些环境中需求频繁变化,或在聚合来自多个异构源的数据的应用程序中。
2.2 通过分片实现水平可扩展性
MongoDB的一个决定性功能是其对通过分片进行水平扩展的原生支持。分片将数据分布在多个服务器(称为分片)上,允许MongoDB处理会使单个机器不堪重负的数据集和吞吐量级别。
每个分片保存总数据的一个子集,mongos路由器根据可配置的分片键将查询定向到适当的分片。这种架构在数据量和查询负载增长时实现接近线性的可扩展性。
对于高流量生产环境,在AlexHost的专用服务器上托管MongoDB可确保每个分片都能访问隔离的高性能硬件资源。
2.3 通过副本集实现高可用性
MongoDB通过副本集提供内置容错——副本集是维护相同数据的相同副本的MongoDB实例组。副本集包括:
- 一个主节点接收所有写操作
- 一个或多个从节点从主节点复制数据
- 一个可选的仲裁者参与选举但不存储数据
如果主节点失败,副本集会自动从可用的从节点中选举一个新的主节点,最大限度地减少停机时间并确保数据持久性。
2.4 强大的查询语言和聚合框架
MongoDB的MongoDB查询语言(MQL)支持丰富的操作集,包括:
- 字段级过滤,使用比较、逻辑和元素运算符
- 投影以仅返回特定字段
- 排序和分页,使用
sort()、limit()和skip() - 文本搜索,具有全文索引
- 地理空间查询用于基于位置的应用程序
聚合框架提供了一种基于管道的数据转换和分析方法,支持$match、$group、$sort、$project、$lookup(连接)、$unwind等操作——提供与复杂SQL GROUP BY和JOIN操作相当的功能。
2.5 灵活的索引
MongoDB支持多种索引类型以优化查询性能:
- 单字段索引用于简单查询
- 复合索引用于多字段查询
- 多键索引用于数组字段
- 文本索引用于全文搜索
- 地理空间索引用于位置查询
- TTL索引用于自动文档过期(对会话数据或日志很有用)
第3部分:在Ubuntu上安装MongoDB(分步指南)
本部分将指导您在Ubuntu 20.04 LTS(Focal Fossa)上完成MongoDB安装。这些步骤针对具有root或sudo访问权限的AlexHost VPS环境进行了优化。
前置条件
- Ubuntu 20.04 LTS服务器
- 具有
sudo权限的用户账户 - 对Linux命令行的基本了解
如果您还没有服务器,可以使用AlexHost VPS托管在几分钟内启动一个完全配置的Ubuntu VPS。
步骤1:导入MongoDB GPG公钥
MongoDB软件包使用GPG密钥签名以验证其真实性。使用以下命令导入密钥:
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -您应该看到OK作为输出,确认密钥已成功导入。
步骤2:添加MongoDB存储库
创建一个列表文件以将官方MongoDB存储库添加到系统的软件包源:
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list> 注意:此命令添加MongoDB 6.0存储库。如果需要其他版本,请调整版本号。
步骤3:更新软件包数据库
刷新本地软件包索引以包含新添加的MongoDB存储库:
sudo apt update步骤4:安装MongoDB
安装最新稳定版本的MongoDB及所有必需组件:
sudo apt install -y mongodb-org这将安装以下软件包:
mongod— MongoDB数据库守护进程mongos— MongoDB分片路由器mongosh— MongoDB shell(旧版mongoshell的现代替代品)- MongoDB工具和库
步骤5:启动并启用MongoDB服务
立即启动MongoDB服务:
sudo systemctl start mongod启用MongoDB在系统启动时自动启动:
sudo systemctl enable mongod验证MongoDB是否正确运行:
sudo systemctl status mongod您应该看到输出表示该服务是active (running)。如果MongoDB成功启动,您还会看到一行确认它正在监听27017端口。
步骤6:保护您的MongoDB安装(推荐)
在任何生产或面向互联网的环境中使用MongoDB之前,启用身份验证至关重要。默认情况下,MongoDB不需要用户名或密码。
创建管理员用户:
mongosh在MongoDB shell内:
use admin
db.createUser({
user: "adminUser",
pwd: "YourStrongPasswordHere",
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
})启用身份验证,编辑MongoDB配置文件:
sudo nano /etc/mongod.conf找到security部分并添加:
security:
authorization: enabled重启MongoDB以应用更改:
sudo systemctl restart mongod从此时起,所有到MongoDB的连接都需要有效的凭据。
第4部分:使用MongoDB — 基本命令和操作
安装并保护MongoDB后,让我们探索您日常使用的最重要的操作。
步骤1:访问MongoDB Shell
使用现代mongoshshell连接到您的MongoDB实例:
mongosh如果启用了身份验证,请使用凭据连接:
mongosh -u adminUser -p YourStrongPasswordHere --authenticationDatabase admin步骤2:数据库操作
列出所有数据库:
show dbs创建或切换到数据库:
use mydatabase> 当您首次向数据库插入数据时,MongoDB会自动创建该数据库。
检查当前选定的数据库:
db删除数据库:
db.dropDatabase()步骤3:集合操作
显式创建集合:
db.createCollection("users")列出当前数据库中的所有集合:
show collections删除集合:
db.users.drop()步骤4:文档CRUD操作
插入文档
插入单个文档:
db.users.insertOne({
name: "Alice",
age: 30,
email: "alice@example.com",
role: "developer"
})一次插入多个文档:
db.users.insertMany([
{ name: "Bob", age: 25, email: "bob@example.com", role: "designer" },
{ name: "Carol", age: 35, email: "carol@example.com", role: "manager" },
{ name: "Dave", age: 28, email: "dave@example.com", role: "developer" }
])读取文档
查找集合中的所有文档:
db.users.find()查找满足特定条件的文档:
db.users.find({ role: "developer" })查找满足多个条件的文档:
db.users.find({ role: "developer", age: { $gte: 28 } })仅返回特定字段(投影):
db.users.find({ role: "developer" }, { name: 1, email: 1, _id: 0 })查找单个文档:
db.users.findOne({ name: "Alice" })排序结果:
db.users.find().sort({ age: 1 }) // Ascending
db.users.find().sort({ age: -1 }) // Descending限制和分页结果:
db.users.find().limit(10).skip(20) // Page 3 with 10 results per page更新文档
更新单个文档:
db.users.updateOne(
{ name: "Alice" },
{ $set: { age: 31, role: "senior developer" } }
)更新多个文档:
db.users.updateMany(
{ role: "developer" },
{ $set: { department: "Engineering" } }
)增加数字字段:
db.users.updateOne(
{ name: "Bob" },
{ $inc: { age: 1 } }
)删除文档
删除单个文档:
db.users.deleteOne({ name: "Dave" })删除匹配条件的多个文档:
db.users.deleteMany({ role: "designer" })步骤5:性能索引
在经常查询的字段上创建索引可以显著提高查询性能。
创建单字段索引:
db.users.createIndex({ email: 1 })创建复合索引:
db.users.createIndex({ role: 1, age: -1 })创建唯一索引:
db.users.createIndex({ email: 1 }, { unique: true })列出集合上的所有索引:
db.users.getIndexes()步骤6:聚合管道
聚合框架允许您直接在MongoDB中执行复杂的数据分析。
示例:按角色计数用户并按计数排序:
db.users.aggregate([
{ $group: { _id: "$role", count: { $sum: 1 } } },
{ $sort: { count: -1 } }
])示例:按角色筛选、分组和计算平均年龄:
db.users.aggregate([
{ $match: { department: "Engineering" } },
{ $group: { _id: "$role", avgAge: { $avg: "$age" }, total: { $sum: 1 } } },
{ $sort: { avgAge: 1 } }
])第5部分:MongoDB配置和性能调优
配置mongod.conf
MongoDB的主配置文件位于/etc/mongod.conf。需要审查和优化的关键设置:
# Network settings
net:
port: 27017
bindIp: 127.0.0.1 # Restrict to localhost for security; use server IP for remote access
# Storage settings
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 2 # Set to ~50% of available RAM
# Logging
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# Security
security:
authorization: enabled
# Replication (for replica sets)
replication:
replSetName: "rs0"性能最佳实践
- 分配足够的RAM — MongoDB的WiredTiger存储引擎使用内存缓存。将
cacheSizeGB设置为可用系统RAM的约50%。 - 使用适当的索引 — 使用
db.collection.explain("executionStats")分析慢查询并相应地创建索引。 - 使用MongoDB Atlas或mongostat进行监控 — 使用
mongostat和mongotop命令行工具监控实时性能。 - 启用日志记录 — 日志记录默认启用,提供崩溃恢复功能;不要在生产环境中禁用它。
- 使用连接池 — 配置应用程序的MongoDB驱动程序以使用连接池,以减少连接开销。
- 定期压缩集合 — 使用
db.runCommand({ compact: "collectionName" })在大量删除后回收磁盘空间。
第6部分:MongoDB备份和恢复
定期备份对任何生产数据库都至关重要。MongoDB为此提供了内置工具。
使用mongodump创建备份
mongodump --uri="mongodb://adminUser:password@localhost:27017" --out=/backup/mongodb/$(date +%Y%m%d)使用mongorestore从备份恢复
mongorestore --uri="mongodb://adminUser:password@localhost:27017" /backup/mongodb/20240115/使用Cron自动化备份
添加一个cron作业以自动运行每日备份:
sudo crontab -e添加以下行以在每天凌晨2:00运行备份:
0 2 * * * mongodump --uri="mongodb://adminUser:password@localhost:27017" --out=/backup/mongodb/$(date +%Y%m%d) >> /var/log/mongodb-backup.log 2>&1为MongoDB选择合适的AlexHost计划
合适的托管计划取决于您的应用程序规模、流量和数据要求:
| 用例 | 推荐计划 | 原因 |
|---|---|---|
| 开发/测试 | VPS托管 | 经济高效,完全控制,易于设置 |
| 中小型生产环境 | VPS托管 | 可扩展资源,SSD存储,root访问权限 |
| 高流量生产环境 | 专用服务器 | 裸金属性能,无资源共享 |
| 使用MongoDB的ML/AI | GPU托管 | GPU加速数据处理工作负载 |
| Web应用 + MongoDB | 带cPanel的VPS | 易于管理的界面与您的数据库配合使用 |
对于还需要Web前端、电子邮件通知或SSL安全连接的应用程序,AlexHost提供SSL证书和电子邮件托管来完成您的基础设施堆栈。
常见问题
Q: MongoDB 是否免费使用?
是的。MongoDB Community Edition 在服务器端公共许可证 (SSPL) 下免费且开源。MongoDB Enterprise 和 MongoDB Atlas(云)以付费方式提供额外功能。
Q: MongoDB 默认使用哪个端口?
MongoDB 默认监听 27017 端口。您可以在 /etc/mongod.conf 中更改此设置。
Q: 我可以在共享主机计划上运行 MongoDB 吗?
MongoDB 需要 root 或管理员访问权限才能正确安装和配置,这在标准共享主机上不可用。需要 VPS 或专用服务器。AlexHost 的 共享网络主机更适合 PHP/MySQL 应用程序,而 MongoDB 部署应使用 VPS 或专用服务器。
Q: 如何从远程应用程序连接到 MongoDB?
更新 bindIp 中的 /etc/mongod.conf 以包含您的服务器 IP 地址,配置防火墙以仅允许来自受信任 IP 的 27017 端口,并使用格式为 mongodb://username:password@your-server-ip:27017/dbname 的连接字符串。
Q: MongoDB 和 MySQL 之间有什么区别?
MySQL 是使用结构化表和 SQL 的关系数据库。MongoDB 是一个 NoSQL 文档数据库,存储灵活的类似 JSON 的文档。MongoDB 擅长处理非结构化或半结构化数据和水平扩展,而 MySQL 更适合具有复杂关系数据和严格 ACID 合规性要求的应用程序。
结论
MongoDB 是一种变革性的数据库技术,使开发人员能够构建现代、可扩展的应用程序,而不受严格关系模式的限制。其面向文档的模型、通过分片实现的原生水平扩展、通过副本集实现的内置高可用性以及强大的聚合框架使其成为当今最多功能的数据库之一。
通过在 AlexHost VPS Hosting 计划上托管 MongoDB,您可以获得有效运行 MongoDB 所需的完全控制、专用资源和可靠的基础设施——无论您是在原型设计第一个应用程序还是管理高流量生产系统。
按照本指南中的安装和配置步骤让您的 MongoDB 实例启动并运行,从第一天起实施适当的安全措施,并利用索引和聚合管道构建高性能的数据驱动应用程序。
对您的 MongoDB 设置有疑问或需要帮助选择合适的托管计划?AlexHost 的专家支持团队全天候 24/7 可用,随时准备在每一步为您提供帮助。
