目录
一、创建相关目录 及授权
创建主节点mongodb数据及日志目录并授权
mkdir -p /usr/local/mongodb/mongodb1/data
mkdir -p /usr/local/mongodb/mongodb1/logs
chmod 777 /usr/local/mongodb/mongodb1
创建从节点mongodb数据及日志目录并授权
mkdir -p /usr/local/mongodb/mongodb2/data
mkdir -p /usr/local/mongodb/mongodb2/logs
chmod 777 /usr/local/mongodb/mongodb2
创建keyFile
keyFile 是一个共享的密钥文件,用于主从节点数据复制时数据主从节点交互安全性,所有复制集成员必须拥有相同的文件内容,并且权限为 600(仅所有者可读)
openssl rand -base64 750 > /usr/local/mongodb/mongodb1/mongodb-keyfile
chmod 600 /usr/local/mongodb/mongodb1/mongodb-keyfile
主从节点使用同一个keyfile
cp /usr/local/mongodb/mongodb1/mongodb-keyfile /usr/local/mongodb/mongodb2
chmod 600 /usr/local/mongodb/mongodb2/mongodb-keyfile
MongoDB 容器默认以 mongodb 用户运行,需确保该用户有权限访问密钥文件
chown -R 999:999 /usr/local/mongodb/mongodb1/mongodb-keyfile
chown -R 999:999 /usr/local/mongodb/mongodb2/mongodb-keyfile
二、下载并运行MongoDB容器
docker pull mongo:latest

运行mongoDB容器
运行主节点容器
docker run -d \
--name mongodb1 \
-p 27017:27017 \
-v /usr/local/mongodb/mongodb1/data:/data/db \
-v /usr/local/mongodb/mongodb1/logs:/var/log/mongodb \
-v /etc/localtime:/etc/localtime:ro \
-v /usr/local/mongodb/mongodb1/mongodb-keyfile:/keyfile \
-e MONGO_INITDB_ROOT_USERNAME=root \
-e MONGO_INITDB_ROOT_PASSWORD="123456" \
-e MONGO_BIND_IP=0.0.0.0 \
--restart=always \
--privileged \
mongo:latest \
--replSet rs0 \
--keyFile /keyfile \
--auth
运行从节点 容器
docker run -d \
--name mongodb2 \
-p 37017:27017 \
-v /usr/local/mongodb/mongodb2/data:/data/db \
-v /usr/local/mongodb/mongodb2/logs:/var/log/mongodb \
-v /etc/localtime:/etc/localtime:ro \
-v /usr/local/mongodb/mongodb2/mongodb-keyfile:/keyfile \
-e MONGO_INITDB_ROOT_USERNAME=root \
-e MONGO_INITDB_ROOT_PASSWORD="123456" \
-e MONGO_BIND_IP=0.0.0.0 \
--restart=always \
--privileged \
mongo:latest \
--replSet rs0 \
--keyFile /keyfile \
--auth
docker ps查看容器运行状态,如下图显示已成功启动
三、配置主从复制
- 通过mongosh登录mongodb1(主节点)
docker exec -it mongodb1 mongosh -u root -p '123456' --authenticationDatabase admin
- 切换到admin库
use admin
始化复制集
rs.initiate({ _id: "rs0", members: [ { _id: 0, host: "192.168.7.46:27017", priority: 1 }, { _id: 1, host: "192.168.7.46:37017", priority: 0.5 } ] });
priority 参数用于控制节点在选举(election)过程中成为 Primary(主节点) 的优先级,priority=0则仅作为从节点(长用于同步数据); priority: 1, votes: 0 则 无投票权,仅备份检查复制集状态
确保所有成员状态为 PRIMARY/SECONDARY(配置均设置0,表示暂停主从复制,实际使用主节点设置1、从节点设置0即可)
rs.status()
四、客户端远程连接
上述配置完成后,使用navicat等客户端连接工具远程连接mongodb主库

navicate连接成功后创建一个账户,用于程序连接账号使用(可选)

按上述再远程连接从库,最终两个库都连接成功

五、验证主从同步
navicate连接到主库,创建测试库、测试集合、给集合插入数据
//使用 use 命令切换到目标数据库(若不存在则创建)
use test;
//创建集合
db.createCollection("sys_users")
//给集合插入数据
db.sys_users.insertOne({ name: "Alice", age: 30 });
刷新从库后,也生成了测试库、测试集合、并且插入了数据

同理,修改、删除主库的数据库、集合、数据,刷新从库,从库也会同步修改、删除主库的数据库、集合、数据
六、停止和恢复复制集
停止复制集
连接到主节点
docker exec -it mongodb1 mongosh -u root -p '123456' --authenticationDatabase admin
切换到 admin 数据库
use admin
执行重置复制集配置脚本(只保留主节点,达到临时停止主从复制的效果)
rs.reconfig({
_id: "rs0",
members: [
{ _id: 0, host: "192.168.7.46:27017", priority: 1 }
]
});
查看复制集配置,确认更新结果
var newConfig = rs.conf();
printjson(newConfig);
查看节点状态
rs.status();
恢复复制集连接到主节点
docker exec -it mongodb1 mongosh -u root -p '123456' --authenticationDatabase admin
切换到 admin 数据库
use admin
执行恢复脚本
rs.reconfig({
_id: "rs0",
members: [
{ _id: 0, host: "192.168.7.46:27017", priority: 1 },
{ _id: 1, host: "192.168.7.46:37017", priority: 0.5 }
]
});
查看复制集配置,确认更新结果
var newConfig = rs.conf();
printjson(newConfig);
查看节点状态
rs.status();
七、常用命令
- 使用 use 命令切换到目标数据库(若不存在则创建)
use test;
- 创建集合
db.createCollection("sys_users")
- 给集合插入数据
db.sys_users.insertOne({ name: "Alice", age: 30,hisdate: 19981201 });
- 后台创建索引(针对大数量集合,异步原理,防止数据库卡顿)
db.sys_users.createIndex({ hisdate: 1 }, { background: true });
- 删除索引
db.sys_users.dropIndex("indexName")
- 查询某个集合索引
db.sys_users.getIndexes();
- 大数据量集合创建索引执行状态查询
db.currentOp({ "command.createIndexes": "sys_users" });
- 解释sql,查看查询语句是否使用索引优化
db.sys_users.find(
{ hisdate: { gte: 20250101, lte: 20250101 } }
).explain("executionStats");
- 查询某个集合存储大小(单位:GB)
printjson(db.runCommand({ collstats: 'daq_result_tmp_curve' }).storageSize/(1024*1024*1024))
- mongodb资源实时监控
mongostat 是MongoDB自带的实时监控工具,每秒刷新一次关键指标,以下是几个关键指标:
cpu:CPU使用率(用户+系统),低版本可能不支持
res:MongoDB进程的物理内存(Resident Set Size)使用量
flushes:WiredTiger每秒缓存强制刷新次数(高值(如>1/s)可能表示磁盘性能不足或内存不足)
qr|qw:读/写队列长度(高值表示操作积压)
ar:活跃客户端数
docker exec mongodb1 /usr/bin/mongostat --host 192.168.7.46 --port 27017 -u root -p '123456' --authenticationDatabase admin
- 查询指定库每个集合文档总数和索引总数
//切换数据库
use acquistion-system;
// 集合总数
var collectionNum=0;
// 查询指定库里集合总数和索引总数
var indexCount = db.getCollectionInfos().reduce((total, coll,collParam) => {
// 获取当前集合的引用
var collection = db.getCollection(coll.name);
// 获取文档数
var documentCount = collection.count();
// 获取索引数
var indexCount = collection.getIndexes().length;
// 输出结果
print("集合名称: " + coll.name + ", 文档数: " + documentCount + ", 索引数: " + indexCount);
collectionNum++;
return total + db.getCollection(coll.name).getIndexes().length;
}, 0);
print("集合总数:" + collectionNum + "; 索引总数: " + indexCount);
- 创建函数进行查询集合相关统计信息
function getCollectionStats(collectionName) {
const stats = db[collectionName].stats();
return {
collectionName: stats.ns,
documentCount: stats.count,
indexCount: stats.nindexes+'个',
memorySizeGB: (stats.size / (1024 * 1024 * 1024)).toFixed(2)+'GB'+'('+stats.size+')',
storageSizeGB: (stats.storageSize / (1024 * 1024 * 1024)).toFixed(2)+'GB'+'('+stats.storageSize+')',
avgDocSize: (stats.avgObjSize/1024).toFixed(2)+'KB'+'('+stats.avgObjSize+')',
totalIndexSizeKB: (stats.totalIndexSize / (1024 * 1024)).toFixed(2)+'KB'+'('+stats.totalIndexSize+')'
};
}
查询指定库里所有集合相关统计信息
use test;
db.getCollectionNames().forEach(function(collection) {
printjson(getCollectionStats(collection));
});
查询指定集合相关统计信息
printjson(getCollectionStats('sys_users'));