当前位置: 首页 > article >正文

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'));










 

相关文章:

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

目录 一、创建相关目录及授权 二、下载并运行MongoDB容器 三、配置主从复制 四、客户端远程连接 五、验证主从同步 六、停止和恢复复制集 七、常用命令 一、创建相关目录及授权 创建主节点mongodb数据及日志目录并授权 mkdir -p /usr/local/mongodb/mongodb1/data mkdir …...

Kafka 中的事务

Kafka 中的 事务(Transactions) 是为了解决 消息处理的原子性和幂等性问题,确保一组消息要么全部成功写入、要么全部失败,不出现中间状态或重复写入。事务机制尤其适合于 “精确一次(Exactly-Once)” 的处理…...

C++ 内存访问模式优化:从架构到实践

内存架构概览:CPU 与内存的 “速度博弈” 层级结构:从寄存器到主存 CPU 堪称计算的 “大脑”,然而它与内存之间的速度差距,宛如高速公路与乡间小路。现代计算机借助多级内存体系来缓和这一矛盾,其核心思路是&#xf…...

Golang系列 - 内存对齐

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

SOMEIP通信矩阵解读

目录 1 摘要2 SOME/IP通信矩阵详细属性定义与示例2.1 服务基础属性2.2 数据类型定义2.3 服务实例与网络配置参数2.4 SOME/IP-SD Multicast 配置(SOME/IP服务发现组播配置)2.5 SOME/IP-SD Unicast 配置2.6 SOME/IP-SD ECU 配置参数详解 3 总结 1 摘要 本…...

Excel + VBA 实现“准实时“数据的方法

Excel 本身是静态数据处理工具,但结合 VBA(Visual Basic for Applications) 可以实现 准实时数据更新,不过严格意义上的 实时数据(如毫秒级刷新)仍然受限。以下是详细分析: 1. Excel + VBA 实现“准实时”数据的方法 (1) 定时刷新(Timer 或 Application.OnTime) Appl…...

网络原理 - HTTP/HTTPS

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

C++设计模式-解释器模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析

一、解释器模式的基本介绍 1.1 模式定义与核心思想 解释器模式(Interpreter Pattern)是一种行为型设计模式,其核心思想是为特定领域语言(DSL)定义语法规则,并构建一个解释器来解析和执行该语言的句子。它…...

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;然而对于具体的转换实现…...

AF3 OpenFoldDataLoader类解读

AlphaFold3 data_modules 模块的 OpenFoldDataLoader 类继承自 PyTorch 的 torch.utils.data.DataLoader。该类主要对原始 DataLoader 做了批数据增强与控制循环迭代次数(recycling)相关的处理。 源代码: class OpenFoldDataLoader(torch.utils.data.DataLoader):def __in…...

初见TypeScript

类型语言&#xff0c;在代码规模逐渐增大时&#xff0c;类型相关的错误难以排查。TypeScript 由微软开发&#xff0c;它本质上是 JavaScript 的超集&#xff0c;为 JavaScript 添加了静态类型系统&#xff0c;让开发者在编码阶段就能发现潜在类型错误&#xff0c;提升代码质量&…...

常见的 JavaScript 框架和库

在现代前端开发中&#xff0c;JavaScript框架和库成为了构建高效、可维护应用程序的关键工具。本文将介绍四个常见的JavaScript框架和库&#xff1a;React、Vue.js、Angular 和 Node.js&#xff0c;并探讨它们的特点、使用场景及适用场合。 1. React — 构建用户界面的JavaScri…...

机器学习代码基础——ML2 使用梯度下降的线性回归

ML2 使用梯度下降的线性回归 牛客网 描述 编写一个使用梯度下降执行线性回归的 Python 函数。该函数应将 NumPy 数组 X&#xff08;具有一列截距的特征&#xff09;和 y&#xff08;目标&#xff09;作为输入&#xff0c;以及学习率 alpha 和迭代次数&#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。 在我们内…...

查询条件与查询数据的ajax拼装

下面我将介绍如何使用 AJAX 动态拼装查询条件和获取查询数据&#xff0c;包括前端和后端的完整实现方案。 一、前端实现方案 1. 基础 HTML 结构 html 复制 <div class"query-container"><!-- 查询条件表单 --><form id"queryForm">…...

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

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

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

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

Apache BookKeeper Ledger 的底层存储机制解析

Apache BookKeeper 的 ledger&#xff08;账本&#xff09;是其核心数据存储单元&#xff0c;底层存储机制结合了日志追加&#xff08;append-only&#xff09;、分布式存储和容错设计。Ledger 的数据存储在 Bookie 节点的磁盘上&#xff0c;具体实现涉及 Journal&#xff08;日…...

从代码上深入学习GraphRag

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

通俗地讲述DDD的设计

通俗地讲述DDD的设计 前言为什么要使用DDDDDD架构分层重构实践关键问题解决方案通过​​领域事件机制​​解耦服务依赖&#xff1a;防止逻辑下沉 领域划分电商场景下的领域划分 结语完结撒花&#xff0c;如有需要收藏的看官&#xff0c;顺便也用发财的小手点点赞哈&#xff0c;…...

【Redis】通用命令

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

网络安全技术文档

网络安全技术文档 1. 概述 网络安全是指通过技术手段和管理措施&#xff0c;保护网络系统的硬件、软件及其数据不受偶然或恶意破坏、更改、泄露&#xff0c;确保系统连续可靠运行&#xff0c;网络服务不中断。 2. 常见网络威胁 2.1 攻击类型 DDoS攻击&#xff1a;分布式拒…...

微前端随笔

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

【36期获取股票数据API接口】如何用Python、Java等五种主流语言实例演示获取股票行情api接口之沪深A股当天逐笔大单交易数据及接口API说明文档

​ 在量化分析领域&#xff0c;实时且准确的数据接口是成功的基石。经过多次实际测试&#xff0c;我将已确认可用的数据接口分享给正在从事量化分析的朋友们&#xff0c;希望能够对你们的研究和工作有所帮助&#xff0c;接下来我会用Python、JavaScript&#xff08;Node.js&…...

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

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

二叉树与红黑树核心知识点及面试重点

二叉树与红黑树核心知识点及面试重点 一、二叉树 (Binary Tree) 1. 基础概念 定义&#xff1a;每个节点最多有两个子节点&#xff08;左子节点和右子节点&#xff09; 术语&#xff1a; 根节点&#xff1a;最顶层的节点 叶子节点&#xff1a;没有子节点的节点 深度&#xf…...

GitHub 趋势日报 (2025年04月01日)

GitHub 趋势日报 (2025年04月01日) 本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星语言1punkpeye/awesome-mcp-serversA collection of MCP servers.⭐ 3280未指定2th-ch/youtube-musicYouTu…...