MongoDB是最流行的NoSQL文档数据库,以JSON格式存储数据,无需预定义表结构,适合快速开发和处理非结构化数据。本文介绍在搬瓦工VPS上安装MongoDB的完整流程,包括安全认证、基本操作和数据备份。
Tip: MongoDB内存需求较大,建议VPS至少2GB内存。搬瓦工的低内存方案(512MB/1GB)不太适合运行MongoDB,如需使用建议选择更高配置的方案。
MongoDB需要通过官方源安装,以MongoDB 7.0为例:
# 导入MongoDB公钥
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | gpg --dearmor -o /usr/share/keyrings/mongodb-server-7.0.gpg
# 添加MongoDB源(Ubuntu 22.04)
echo "deb [signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-7.0.list
# 更新并安装
apt update
apt install mongodb-org -y
# 启动并设置开机自启
systemctl start mongod
systemctl enable mongod
# 创建MongoDB YUM源
cat > /etc/yum.repos.d/mongodb-org-7.0.repo << 'EOF'
[mongodb-org-7.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/7.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-7.0.asc
EOF
# 安装MongoDB
dnf install mongodb-org -y
# 启动并设置开机自启
systemctl start mongod
systemctl enable mongod
验证安装是否成功:
mongosh --eval "db.version()"
MongoDB默认不启用认证,任何人都可以连接并操作数据库,这是严重的安全隐患。必须创建管理员用户并开启认证:
# 连接MongoDB
mongosh
# 切换到admin数据库
use admin
# 创建管理员用户
db.createUser({
user: "admin",
pwd: "AdminStrongPass123!",
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" },
{ role: "dbAdminAnyDatabase", db: "admin" }
]
})
# 退出
exit
编辑MongoDB配置文件启用认证:
# 编辑配置文件
nano /etc/mongod.conf
# 在security段添加:
security:
authorization: enabled
重启MongoDB:
systemctl restart mongod
之后连接需要提供用户名和密码:
mongosh -u admin -p AdminStrongPass123! --authenticationDatabase admin
为每个应用创建独立的数据库和用户:
# 以管理员身份连接
mongosh -u admin -p AdminStrongPass123! --authenticationDatabase admin
# 创建应用数据库(切换即创建)
use myapp_db
# 创建应用专用用户
db.createUser({
user: "myapp_user",
pwd: "AppUserPass123!",
roles: [
{ role: "readWrite", db: "myapp_db" }
]
})
# 创建集合
db.createCollection("users")
db.createCollection("posts")
db.createCollection("logs")
# 查看数据库中的集合
show collections
MongoDB使用JSON格式的文档进行数据操作:
# 插入文档
db.users.insertOne({
name: "张三",
email: "zhangsan@example.com",
age: 28,
created: new Date()
})
# 批量插入
db.users.insertMany([
{ name: "李四", email: "lisi@example.com", age: 32 },
{ name: "王五", email: "wangwu@example.com", age: 25 }
])
# 查询文档
db.users.find() # 查询所有
db.users.find({ age: { $gt: 25 } }) # 条件查询
db.users.findOne({ name: "张三" }) # 查询单条
# 更新文档
db.users.updateOne(
{ name: "张三" },
{ $set: { age: 29, updated: new Date() } }
)
# 删除文档
db.users.deleteOne({ name: "王五" })
索引是提升查询性能的关键,对常用查询字段必须建立索引:
# 创建单字段索引
db.users.createIndex({ email: 1 })
# 创建唯一索引
db.users.createIndex({ email: 1 }, { unique: true })
# 创建复合索引
db.posts.createIndex({ author: 1, created: -1 })
# 创建文本索引(用于全文搜索)
db.posts.createIndex({ title: "text", content: "text" })
# 查看集合的所有索引
db.users.getIndexes()
使用mongodump和mongorestore进行备份和恢复:
# 备份所有数据库
mongodump -u admin -p AdminStrongPass123! --authenticationDatabase admin --out /backup/mongodb/$(date +%Y%m%d)
# 备份指定数据库
mongodump -u admin -p AdminStrongPass123! --authenticationDatabase admin --db myapp_db --out /backup/mongodb/
# 备份为压缩归档
mongodump -u admin -p AdminStrongPass123! --authenticationDatabase admin --archive=/backup/mongodb/full_backup.gz --gzip
# 恢复数据库
mongorestore -u admin -p AdminStrongPass123! --authenticationDatabase admin /backup/mongodb/20260328/
# 恢复指定数据库
mongorestore -u admin -p AdminStrongPass123! --authenticationDatabase admin --db myapp_db /backup/mongodb/myapp_db/
设置自动备份脚本(每天凌晨3点):
# 创建备份脚本
cat > /usr/local/bin/mongo-backup.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/backup/mongodb"
DATE=$(date +%Y%m%d_%H%M)
mkdir -p $BACKUP_DIR
mongodump -u admin -p AdminStrongPass123! \
--authenticationDatabase admin \
--archive=$BACKUP_DIR/backup_$DATE.gz \
--gzip
# 保留最近7天的备份
find $BACKUP_DIR -name "backup_*.gz" -mtime +7 -delete
EOF
chmod +x /usr/local/bin/mongo-backup.sh
# 添加定时任务
crontab -e
# 添加:0 3 * * * /usr/local/bin/mongo-backup.sh
针对VPS环境的MongoDB配置优化:
# 编辑 /etc/mongod.conf
# 存储引擎配置
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 0.5 # 设置为VPS内存的50%左右
# 网络配置
net:
port: 27017
bindIp: 127.0.0.1 # 仅监听本地
# 日志配置
systemLog:
destination: file
path: /var/log/mongodb/mongod.log
logAppend: true
logRotate: reopen
# 操作分析
operationProfiling:
slowOpThresholdMs: 100
mode: slowOp
修改后重启MongoDB:
systemctl restart mongod
关于不同数据库的选择建议,请参考MySQL vs PostgreSQL vs MariaDB选择指南。
Tip: 更多教程请查看新手教程。