安装 MongoDB
在 Ubuntu 上安装 MongoDB Community Edition - MongoDB 手册 v7.0
安装系统为 Ubuntu 22.04。
安装
安装依赖包:
sudo apt-get install gnupg curl导入 MongoDB GPG 密钥:
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor- 国内访问
www.mongodb.org/static有点慢,可能需要走代理
创建 MongoDB 列表文件:
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重新加载本地包列表:
sudo apt-get update安装最新版本的 MongoDB:
sudo apt-get install -y mongodb-org路径
目录
如果通过软件包管理器安装,则在安装过程中会创建数据目录 /var/lib/mongodb 和日志目录 /var/log/mongodb。
默认情况下,MongoDB 使用 mongodb 用户账户运行。
如果更改运行 MongoDB 进程的用户,则必须修改数据和日志目录以赋予该用户访问这些目录的权限。
配置文件
MongoDB 官方软件包有一份配置文件 (/etc/mongod.conf)。这些设置(如数据目录和日志目录规范)将在启动时生效。
换言之,如果在 MongoDB 实例运行时更改该配置文件,则必须才能使更改生效。
运行
以下运行步骤假定使用官方 mongodb-org 包且使用默认设置,而非 Ubuntu 提供的非官方 mongodb 包。
初始化系统
查看初始化系统:
ps --no-headers -o comm 1默认输出:
systemd启动
sudo systemctl start mongod开机启动服务
sudo systemctl enable mongod查看状态
sudo systemctl status mongod停止
sudo systemctl stop mongod重启
sudo systemctl restart mongod命令行进入
mongosh默认端口为 27017。
通过 Docker 运行 MongoDB
如果需要在同一台机器上运行第二个独立 MongoDB 实例,可以用 Docker 隔离进程和依赖,只把数据目录挂载到指定硬盘。例如将实例命名为 mongo2,宿主机监听 27027,数据放在 /media/p3608a/mongodb-mongo2/。
Compose 端口映射中的 27027:27017 是 宿主机端口:容器端口。容器内部可以继续使用 MongoDB 默认的 27017,不会占用宿主机已有 MongoDB 的 27017;对外连接时使用宿主机端口 27027。不要绑定到 127.0.0.1:27027:27017,否则只有本机能访问,局域网内其他机器不能访问。
compose.yml 示例:
name: mongo2
services:
mongo2:
image: mongo:7.0.12
container_name: mongo2
restart: unless-stopped
ports:
# host:container. MongoDB keeps its default container port; host exposes 27027 to LAN.
- "27027:27017"
volumes:
- /media/p3608a/mongodb-mongo2/data:/data/db
- /media/p3608a/mongodb-mongo2/configdb:/data/configdb
- /media/p3608a/mongodb-mongo2/mongod.conf:/etc/mongod.conf:ro
command: ["mongod", "--config", "/etc/mongod.conf"]
mem_limit: 250g
memswap_limit: 250g
ulimits:
nofile:
soft: 1048576
hard: 1048576
healthcheck:
test:
[
"CMD-SHELL",
"mongosh --quiet --eval 'db.adminCommand({ ping: 1 }).ok' | grep 1",
]
interval: 20s
timeout: 5s
retries: 10
start_period: 30smongod.conf 示例:
storage:
dbPath: /data/db
wiredTiger:
engineConfig:
cacheSizeGB: 200
net:
bindIpAll: true
# This port is inside the container namespace. The host port is mapped in compose.yml.
port: 27017
processManagement:
timeZoneInfo: /usr/share/zoneinfo
setParameter:
diagnosticDataCollectionEnabled: false启动和查看状态:
cd /media/p3608a/mongodb-mongo2
docker compose -f compose.yml up -d
docker compose -f compose.yml ps
docker compose -f compose.yml logs --tail 100 mongo2连接测试:
mongosh --host xeon --port 27027其中 mem_limit/memswap_limit 限制容器可用内存,storage.wiredTiger.engineConfig.cacheSizeGB 限制 WiredTiger 缓存。一般应让 WiredTiger cache 小于容器内存上限,给连接、聚合、日志和文件系统缓存留出余量。
允许远程访问
IP 绑定 — MongoDB 手册 v7.0
修改配置文件 sudo nano /etc/mongod.conf,将 bindIp 改为 0.0.0.0,以允许所有 IP 远程访问:
# network interfaces
net:
port: 27017
# bindIp: 127.0.0.1
bindIp: 0.0.0.0重启服务:
sudo systemctl restart mongod设置内存占用上限
Is there any option to limit mongodb memory usage? - Stack Overflow
storage.wiredTiger.engineConfig.cacheSizeGB
修改配置文件 sudo nano /etc/mongod.conf,例如,将缓存上限设为 320GB:
# engine:
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 320重启服务:
sudo systemctl restart mongod安装 GUI 工具
13个Mongodb GUI可视化管理工具,总有一款适合你-阿里云开发者社区
MongoDB Compass
- 界面比较简陋,不过可以在设置里改成暗色模式
注意要下载完整版(区别于只读版和隔离版) :
Studio 3T
- 启动略慢
- 颜值比 Compass 高很多
- 需要注册账号,填写手机号,才能试用 30 天(免费版无法 SQL 查询)
连接到远程 MongoDB
mongodb://<hostname>:27017部署副本集
将独立运行的 mongod 转换为副本集 - MongoDB 手册 v7.0
使用配置文件部署副本集
关闭实例服务
sudo systemctl stop mongod配置副本集
sudo nano /etc/mongod.conf添加如下内容:
replication:
replSetName: "rs0"
# oplogSizeMB: <int>
# enableMajorityReadConcern: <boolean>replSetName: 副本集名称oplogSizeMB: oplog 大小,默认为磁盘空间的 5%enableMajorityReadConcern: 从 v5.0 开始不可更改,始终为true,
配置文件选项: replication.replSetName
启动服务
sudo systemctl start mongod初始化副本集
进入命令行:
mongosh初始化副本集:
rs.initiate()输出形如:
{
info2: 'no configuration specified. Using a default configuration for the set',
me: '<hostname>:27017',
ok: 1
}查看副本集配置:
rs.conf()输出形如:
{
_id: 'rs0',
version: 1,
term: 1,
members: [
{
_id: 0,
host: '<hostname>:27017',
arbiterOnly: false,
buildIndexes: true,
hidden: false,
priority: 1,
tags: {},
secondaryDelaySecs: Long('0'),
votes: 1
}
],
...
}查看副本集状态:
rs.status()使用命令行部署副本集
关闭实例
mongoshuse admin
db.adminCommand( { shutdown: 1, comment: "Convert to cluster" } )启动实例
样例:
mongod --replSet rs0 --port 27017 --dbpath /path/to/mongodb/dbpath --authenticationDatabase "admin" --username "adminUser" --password参数说明:
--replSet: 副本集名称--port: 进程端口--dbpath: 数据库路径--authenticationDatabase,--username,--password: 身份验证
初始化副本集
同上。