Docker快速安装MongoDB并配置主从同步

目录

一、创建相关目录及授权

二、下载并运行MongoDB容器

三、配置主从复制

四、客户端远程连接

五、验证主从同步

六、停止和恢复复制集

七、常用命令


一、创建相关目录 及授权

创建主节点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'));

相关推荐
功德+n4 小时前
Linux下安装与配置Docker完整详细步骤
linux·运维·服务器·开发语言·docker·centos
小敬爱吃饭5 小时前
Ragflow Docker部署及问题解决方案(界面为Welcome to nginx,ragflow上传文件失败,Docker中的ragflow-cpu-1一直重启)
人工智能·python·nginx·docker·语言模型·容器·数据挖掘
木子欢儿5 小时前
Docker Hub 镜像发布指南
java·spring cloud·docker·容器·eureka
coppher7 小时前
Ubuntu 22.04 amd64 离线安装 Docker 完整教程
linux·docker
虚伪的空想家8 小时前
k8s集群configmap和secrets备份脚本
linux·容器·kubernetes
SXJR8 小时前
k8s中的Pod
云原生·容器·kubernetes
文静小土豆8 小时前
K8s 滚动更新在 Java 应用中的实践与优化
java·容器·kubernetes
w6100104669 小时前
CKA-2026-Ingress
云原生·容器·kubernetes·cka
bloglin999999 小时前
docker logs 如何一直监听日志输出
运维·docker·容器
说实话起个名字真难啊10 小时前
Docker 入门之网络基础
网络·docker·php