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

news2025/4/9 12:21:10

目录

一、创建相关目录及授权

二、下载并运行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'));










 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2329703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang系列 - 内存对齐

Golang系列-内存对齐 常见类型header的size大小内存对齐空结构体类型参考 摘要: 本文将围绕内存对齐展开, 包括字符串、数组、切片等类型header的size大小、内存对齐、空结构体类型的对齐等等内容. 关键词: Golang, 内存对齐, 字符串, 数组, 切片 常见类型header的size大小 首…

网络原理 - HTTP/HTTPS

1. HTTP 1.1 HTTP是什么? HTTP (全称为 “超文本传输协议”) 是⼀种应用非常广泛的应用层协议. HTTP发展史: HTTP 诞生于1991年. 目前已经发展为最主流使用的⼀种应用层协议 最新的 HTTP 3 版本也正在完善中, 目前 Google / Facebook 等公司的产品已经…

OCC Shape 操作

#pragma once #include <iostream> #include <string> #include <filesystem> #include <TopoDS_Shape.hxx> #include <string>class GeometryIO { public:// 加载几何模型&#xff1a;支持 .brep, .step/.stp, .iges/.igsstatic TopoDS_Shape L…

深度学习入门(四):误差反向传播法

文章目录 前言链式法则什么是链式法则链式法则和计算图 反向传播加法节点的反向传播乘法节点的反向传播苹果的例子 简单层的实现乘法层的实现加法层的实现 激活函数层的实现ReLu层Sigmoid层 Affine层/SoftMax层的实现Affine层Softmax层 误差反向传播的实现参考资料 前言 上一篇…

Linux:页表详解(虚拟地址到物理地址转换过程)

文章目录 前言一、分页式存储管理1.1 虚拟地址和页表的由来1.2 物理内存管理与页表的数据结构 二、 多级页表2.1 页表项2.2 多级页表的组成 总结 前言 在我们之前的学习中&#xff0c;我们对于页表的认识仅限于虚拟地址到物理地址转换的桥梁&#xff0c;然而对于具体的转换实现…

PostgreSQL 一文从安装到入门掌握基本应用开发能力!

本篇文章主要讲解 PostgreSQL 的安装及入门的基础开发能力,包括增删改查,建库建表等操作的说明。navcat 的日常管理方法等相关知识。 日期:2025年4月6日 作者:任聪聪 一、 PostgreSQL的介绍 特点:开源、免费、高性能、关系数据库、可靠性、稳定性。 官网地址:https://w…

WEB安全--内网渗透--LMNTLM基础

一、前言 LM Hash和NTLM Hash是Windows系统中的两种加密算法&#xff0c;不过LM Hash加密算法存在缺陷&#xff0c;在Windows Vista 和 Windows Server 2008开始&#xff0c;默认情况下只存储NTLM Hash&#xff0c;LM Hash将不再存在。所以我们会着重分析NTLM Hash。 在我们内…

8.用户管理专栏主页面开发

用户管理专栏主页面开发 写在前面用户权限控制用户列表接口设计主页面开发前端account/Index.vuelangs/zh.jsstore.js 后端Paginator概述基本用法代码示例属性与方法 urls.pyviews.py 运行效果 总结 欢迎加入Gerapy二次开发教程专栏&#xff01; 本专栏专为新手开发者精心策划了…

室内指路机器人是否支持与第三方软件对接?

嘿&#xff0c;你知道吗&#xff1f;叁仟室内指路机器人可有个超厉害的技能&#xff0c;那就是能和第三方软件 “手牵手” 哦&#xff0c;接下来就带你一探究竟&#xff01; 从技术魔法角度看哈&#xff1a;好多室内指路机器人都像拥有超能力的小魔法师&#xff0c;采用开放式…

从代码上深入学习GraphRag

网上关于该算法的解析都停留在大概流程上&#xff0c;但是具体解析细节未知&#xff0c;由于代码是PipeLine形式因此阅读起来比较麻烦&#xff0c;本文希望通过阅读项目代码来解析其算法的具体实现细节&#xff0c;特别是如何利用大模型来完成图谱生成和检索增强的实现细节。 …

【Redis】通用命令

使用者通过redis-cli客户端和redis服务器交互&#xff0c;涉及到很多的redis命令&#xff0c;redis的命令非常多&#xff0c;我们需要多练习常用的命令&#xff0c;以及学会使用redis的文档。 一、get和set命令&#xff08;最核心的命令&#xff09; Redis中最核心的两个命令&…

微前端随笔

✨ single-spa&#xff1a; js-entry 通过es-module 或 umd 动态插入 js 脚本 &#xff0c;在主应用中发送请求&#xff0c;来获取子应用的包&#xff0c; 该子应用的包 singleSpa.registerApplication({name: app1,app: () > import(http://localhost:8080/app1.js),active…

C++中的浅拷贝和深拷贝

浅拷贝只是将变量的值赋予给另外一个变量&#xff0c;在遇到指针类型时&#xff0c;浅拷贝只会把当前指针的值&#xff0c;也就是该指针指向的地址赋予给另外一个指针&#xff0c;二者指向相同的地址&#xff1b; 深拷贝在遇到指针类型时&#xff0c;会先将当前指针指向地址包…

车载诊断架构 --- 整车重启先后顺序带来的思考

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…

【C++11(下)】—— 我与C++的不解之缘(三十二)

前言 随着 C11 的引入&#xff0c;现代 C 语言在语法层面上变得更加灵活、简洁。其中最受欢迎的新特性之一就是 lambda 表达式&#xff08;Lambda Expression&#xff09;&#xff0c;它让我们可以在函数内部直接定义匿名函数。配合 std::function 包装器 使用&#xff0c;可以…

Windows 10/11系统优化工具

家庭或工作电脑使用时间久了&#xff0c;会出现各种各样问题&#xff0c;今天给大家推荐一款专为Windows 10/11系统设计的全能优化工具&#xff0c;该软件集成了超过40项专业级实用程序&#xff0c;可针对系统性能进行深度优化、精准调校、全面清理、加速响应及故障修复。通过系…

浅谈在HTTP中GET与POST的区别

从 HTTP 报文来看&#xff1a; GET请求方式将请求信息放在 URL 后面&#xff0c;请求信息和 URL 之间以 &#xff1f;隔开&#xff0c;请求信息的格式为键值对&#xff0c;这种请求方式将请求信息直接暴露在 URL 中&#xff0c;安全性比较低。另外从报文结构上来看&#xff0c…

LightRAG实战:轻松构建知识图谱,破解传统RAG多跳推理难题

作者&#xff1a;后端小肥肠 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 2025防失业预警&#xff1a;不会用DeepSeek-RAG建知识库的人正在被淘汰_deepseek-embedding-CSDN博客 从PDF到精准答案&#xff1a;Coze…

C++多线程编码二

1.lock和try_lock lock是一个函数模板&#xff0c;可以支持多个锁对象同时锁定同一个&#xff0c;如果其中一个锁对象没有锁住&#xff0c;lock函数会把已经锁定的对象解锁并进入阻塞&#xff0c;直到多个锁锁定一个对象。 try_lock也是一个函数模板&#xff0c;尝试对多个锁…

垃圾回收——三色标记法(golang使用)

三色标记法(tricolor mark-and-sweep algorithm)是传统 Mark-Sweep 的一个改进&#xff0c;它是一个并发的 GC 算法&#xff0c;在Golang中被用作垃圾回收的算法&#xff0c;但是也会有一个缺陷&#xff0c;可能程序中的垃圾产生的速度会大于垃圾收集的速度&#xff0c;这样会导…