15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
01.11.2024
2 +1

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(旧版 mongo shell 的现代替代品)
  • 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

使用现代 mongosh shell 连接到您的 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"

性能最佳实践

  1. 分配足够的 RAM — MongoDB 的 WiredTiger 存储引擎使用内存缓存。将 cacheSizeGB 设置为可用系统 RAM 的大约 50%。
  2. 使用适当的索引 — 使用 db.collection.explain("executionStats") 分析慢查询并相应地创建索引。
  3. 使用 MongoDB Atlas 或 mongostat 进行监控 — 使用 mongostatmongotop 命令行工具监控实时性能。
  4. 启用日志记录 — 日志记录默认启用,提供崩溃恢复;不要在生产中禁用它。
  5. 使用连接池 — 配置应用程序的 MongoDB 驱动程序以使用连接池来减少连接开销。
  6. 定期压缩集合 — 使用 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 访问
高流量生产专用服务器裸机性能、无资源共享
ML/AI with MongoDBGPU 托管GPU 加速用于数据处理工作负载
Web App + MongoDB带 cPanel 的 VPS易于管理的界面与您的数据库一起

对于还需要 Web 前端、电子邮件通知或 SSL 安全连接的应用程序,AlexHost 提供 SSL 证书电子邮件托管 来完成您的基础设施堆栈。

常见问题

问:MongoDB 可以免费使用吗?

是的。MongoDB 社区版在服务器端公共许可证 (SSPL) 下免费且开源。MongoDB 企业版和 MongoDB Atlas(云)提供付费的其他功能。

问:MongoDB 默认使用什么端口?

MongoDB 默认侦听端口 27017。您可以在 /etc/mongod.conf 中更改此设置。

问:我可以在共享托管计划上运行 MongoDB 吗?

MongoDB 需要 root

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用