欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > Docker快速安装MongoDB并配置主从同步

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

2025/4/7 16:50:49 来源:https://blog.csdn.net/wangchange/article/details/146917703  浏览:    关键词: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'));










 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词