docker快速安装单节点和多点MongoDB副本集

文章目录

    • 概要
    • 一、单节点副本集
    • 二、多节点副本集
    • 三、参考

概要

最近项目的MongoDB版本终于升级到了MongoDB4.4了,可以使用使用事务了,但MongoDB的不支持单节点事务,至少是副本集。
测试环境没必要搭建复杂的副本集,还好官方给出了单节点副本集的方案,本文总结了如何用docker来快速搭建。

一、单节点副本集

1:拉取镜像

docker pull mongo:7.0

2:准备环境

mkdir -p /home/docker/mongo/data  #数据挂载目录
mkdir -p /home/docker/mongo/logs  #日志挂载目录
mkdir -p /home/docker/mongo/config #配置挂载目录
chmod 777  /home/docker/mongo/*      #授权
docker run -d --name mongo_tmp -p 27017:27017 mongo:7.0
docker cp mongo_tmp:/etc/mongod.conf.orig /home/docker/mongo/config/mongod.conf  #复制配置文件
docker rm mongo_tmp

3:调整配置
vim /home/docker/mongo/config/mongod.conf

# mongod.conf
# Where and how to store data.
storage:dbPath: /var/lib/mongodb
#  engine:
#  wiredTiger:# where to write logging data.
systemLog:destination: filelogAppend: truepath: /var/log/mongodb/mongod.log# network interfaces
net:port: 27017bindIp: 127.0.0.1# how the process runs
processManagement:timeZoneInfo: /usr/share/zoneinfo
#security:
#operationProfiling:
replication:  #开启副本集replSetName: rs  #设置副本集名称
#sharding:
## Enterprise-Only Options:
#auditLog:

4:启动容器

docker run -d -p 27017:27017 --name mongo \
-v /home/docker/mongo/data:/var/lib/mongodb \
-v /home/docker/mongo/logs:/var/log/mongodb \
-v /home/docker/mongo/config/mongod.conf:/etc/mongod.conf \mongo:7.0 -f /etc/mongod.conf

5:初始化副本集并检测

[root@test home]# docker exec mongo mongosh --version
2.2.0
[root@test home]# docker exec -it mongo bash
root@4250323d6d90:/# mongosh
Current Mongosh Log ID: 6606093080fcdce72edb83af
Connecting to:          mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.2.0
Using MongoDB:          7.0.7
Using Mongosh:          2.2.0
test> rs.initiate()  #初始化副本集
{info2: 'no configuration specified. Using a default configuration for the set',me: '4250323d6d90:27017',ok: 1
}
rs [direct: primary] test> rs.status() #检测
{set: 'rs',date: ISODate('2024-03-28T21:53:44.472Z'),myState: 1,term: Long('1'),syncSourceHost: '',syncSourceId: -1,heartbeatIntervalMillis: Long('2000'),majorityVoteCount: 1,writeMajorityCount: 1,votingMembersCount: 1,writableVotingMembersCount: 1,optimes: {lastCommittedOpTime: { ts: Timestamp({ t: 1711662813, i: 23 }), t: Long('1') },lastCommittedWallTime: ISODate('2024-03-28T21:53:33.694Z'),readConcernMajorityOpTime: { ts: Timestamp({ t: 1711662813, i: 23 }), t: Long('1') },appliedOpTime: { ts: Timestamp({ t: 1711662813, i: 23 }), t: Long('1') },durableOpTime: { ts: Timestamp({ t: 1711662813, i: 23 }), t: Long('1') },lastAppliedWallTime: ISODate('2024-03-28T21:53:33.694Z'),lastDurableWallTime: ISODate('2024-03-28T21:53:33.694Z')},lastStableRecoveryTimestamp: Timestamp({ t: 1711662813, i: 1 }),electionCandidateMetrics: {lastElectionReason: 'electionTimeout',lastElectionDate: ISODate('2024-03-28T21:53:33.621Z'),electionTerm: Long('1'),lastCommittedOpTimeAtElection: { ts: Timestamp({ t: 1711662813, i: 1 }), t: Long('-1') },lastSeenOpTimeAtElection: { ts: Timestamp({ t: 1711662813, i: 1 }), t: Long('-1') },numVotesNeeded: 1,priorityAtElection: 1,electionTimeoutMillis: Long('10000'),newTermStartDate: ISODate('2024-03-28T21:53:33.645Z'),wMajorityWriteAvailabilityDate: ISODate('2024-03-28T21:53:33.661Z')},members: [{_id: 0,name: '4250323d6d90:27017',health: 1,state: 1,stateStr: 'PRIMARY',uptime: 381,optime: { ts: Timestamp({ t: 1711662813, i: 23 }), t: Long('1') },optimeDate: ISODate('2024-03-28T21:53:33.000Z'),lastAppliedWallTime: ISODate('2024-03-28T21:53:33.694Z'),lastDurableWallTime: ISODate('2024-03-28T21:53:33.694Z'),syncSourceHost: '',syncSourceId: -1,infoMessage: 'Could not find member to sync from',electionTime: Timestamp({ t: 1711662813, i: 2 }),electionDate: ISODate('2024-03-28T21:53:33.000Z'),configVersion: 1,configTerm: 1,self: true,lastHeartbeatMessage: ''}],ok: 1,'$clusterTime': {clusterTime: Timestamp({ t: 1711662813, i: 23 }),signature: {hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0),keyId: Long('0')}},operationTime: Timestamp({ t: 1711662813, i: 23 })
}
rs [direct: primary] test> rs.config()
{_id: 'rs',version: 1,term: 1,members: [{_id: 0,host: '4250323d6d90:27017', #可以看到这里的host有问题,不过单节点副本集可以不用管,不影响使用,多节点就不行了arbiterOnly: false,buildIndexes: true,hidden: false,priority: 1,tags: {},secondaryDelaySecs: Long('0'),votes: 1}],protocolVersion: Long('1'),writeConcernMajorityJournalDefault: true,settings: {chainingAllowed: true,heartbeatIntervalMillis: 2000,heartbeatTimeoutSecs: 10,electionTimeoutMillis: 10000,catchUpTimeoutMillis: -1,catchUpTakeoverDelayMillis: 30000,getLastErrorModes: {},getLastErrorDefaults: { w: 1, wtimeout: 0 },replicaSetId: ObjectId('6605e6dd4e61b074963931a1')}
}

6:go程序连接

项目中使用的是官方MongoDB库,需要在mongo url中添加connect=direct,如mongodb://127.0.0.1:27017/?connect=direct,仍按照单mongo实例连接,毕竟不是真的副本集。

二、多节点副本集

我们这里以三节点为例。
按照第一章节的操作起三个容器。

1:容器一

mkdir -p /home/docker/mongo_rs1/data  #数据挂载目录
mkdir -p /home/docker/mongo_rs1/logs  #日志挂载目录
mkdir -p /home/docker/mongo_rs1/config #配置挂载目录
chmod 777  /home/docker/mongo_rs1/*      #授权

vim /home/docker/mongo_rs1/config/mongod.conf

storage:dbPath: /var/lib/mongodb
systemLog:destination: filelogAppend: truepath: /var/log/mongodb/mongod.log
net:port: 27021bindIp: 0.0.0.0
processManagement:timeZoneInfo: /usr/share/zoneinfo
replication:  #开启副本集replSetName: rs  #设置副本集名称
docker run -d -p 27021:27021 --name mongo-rs1 \
-v /home/docker/mongo_rs1/data:/var/lib/mongodb \
-v /home/docker/mongo_rs1/logs:/var/log/mongodb \
-v /home/docker/mongo_rs1/config/mongod.conf:/etc/mongod.conf \mongo:7.0 -f /etc/mongod.conf

2:容器二
按照容器一创建挂载目录和修改配置文件监听端口为27022

docker run -d -p 27022:27022 --name mongo-rs2 \
-v /home/docker/mongo_rs2/data:/var/lib/mongodb \
-v /home/docker/mongo_rs2/logs:/var/log/mongodb \
-v /home/docker/mongo_rs2/config/mongod.conf:/etc/mongod.conf \mongo:7.0 -f /etc/mongod.conf

3:容器三
按照容器一创建挂载目录和修改配置文件监听端口为27023

docker run -d -p 27023:27023 --name mongo-rs3 \
-v /home/docker/mongo_rs3/data:/var/lib/mongodb \
-v /home/docker/mongo_rs3/logs:/var/log/mongodb \
-v /home/docker/mongo_rs3/config/mongod.conf:/etc/mongod.conf \mongo:7.0 -f /etc/mongod.conf

进入容器一:

[root@test home]# docker exec -it mongo-rs1 bash
root@74963372ad8f:/# mongosh --port 27021
Current Mongosh Log ID: 66061117cc4fbc0923db83af
Connecting to:          mongodb://127.0.0.1:27021/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.2.0
Using MongoDB:          7.0.7
Using Mongosh:          2.2.0
test> rs.status()
MongoServerError[NotYetInitialized]: no replset config has been received
test> rs.initiate({_id:"rs",members : [{_id:0, host:"192.168.30.213:27021"},{_id:1, host:"192.168.30.213:27022"},{_id:2, host:"192.168.30.213:27023"}]}) 
{ ok: 1 }  #注意docker下多节点副本集初始化时一定指定配置,且host不能是127.0.0.1,
rs [direct: other] test> rs.status()
{set: 'rs',date: ISODate('2024-03-29T00:57:45.865Z'),myState: 1,term: Long('1'),syncSourceHost: '',syncSourceId: -1,heartbeatIntervalMillis: Long('2000'),majorityVoteCount: 2,writeMajorityCount: 2,votingMembersCount: 3,writableVotingMembersCount: 3,optimes: {lastCommittedOpTime: { ts: Timestamp({ t: 1711673864, i: 7 }), t: Long('1') },lastCommittedWallTime: ISODate('2024-03-29T00:57:44.102Z'),readConcernMajorityOpTime: { ts: Timestamp({ t: 1711673864, i: 7 }), t: Long('1') },appliedOpTime: { ts: Timestamp({ t: 1711673864, i: 7 }), t: Long('1') },durableOpTime: { ts: Timestamp({ t: 1711673864, i: 7 }), t: Long('1') },lastAppliedWallTime: ISODate('2024-03-29T00:57:44.102Z'),lastDurableWallTime: ISODate('2024-03-29T00:57:44.102Z')},lastStableRecoveryTimestamp: Timestamp({ t: 1711673852, i: 1 }),electionCandidateMetrics: {lastElectionReason: 'electionTimeout',lastElectionDate: ISODate('2024-03-29T00:57:43.488Z'),electionTerm: Long('1'),lastCommittedOpTimeAtElection: { ts: Timestamp({ t: 1711673852, i: 1 }), t: Long('-1') },lastSeenOpTimeAtElection: { ts: Timestamp({ t: 1711673852, i: 1 }), t: Long('-1') },numVotesNeeded: 2,priorityAtElection: 1,electionTimeoutMillis: Long('10000'),numCatchUpOps: Long('0'),newTermStartDate: ISODate('2024-03-29T00:57:43.516Z'),wMajorityWriteAvailabilityDate: ISODate('2024-03-29T00:57:44.039Z')},members: [{_id: 0,name: '192.168.30.213:27021',health: 1,state: 1,stateStr: 'PRIMARY',uptime: 547,optime: { ts: Timestamp({ t: 1711673864, i: 7 }), t: Long('1') },optimeDate: ISODate('2024-03-29T00:57:44.000Z'),lastAppliedWallTime: ISODate('2024-03-29T00:57:44.102Z'),lastDurableWallTime: ISODate('2024-03-29T00:57:44.102Z'),syncSourceHost: '',syncSourceId: -1,infoMessage: 'Could not find member to sync from',electionTime: Timestamp({ t: 1711673863, i: 1 }),electionDate: ISODate('2024-03-29T00:57:43.000Z'),configVersion: 1,configTerm: 1,self: true,lastHeartbeatMessage: ''},{_id: 1,name: '192.168.30.213:27022',health: 1,state: 2,stateStr: 'SECONDARY',uptime: 13,optime: { ts: Timestamp({ t: 1711673864, i: 7 }), t: Long('1') },optimeDurable: { ts: Timestamp({ t: 1711673864, i: 7 }), t: Long('1') },optimeDate: ISODate('2024-03-29T00:57:44.000Z'),optimeDurableDate: ISODate('2024-03-29T00:57:44.000Z'),lastAppliedWallTime: ISODate('2024-03-29T00:57:44.102Z'),lastDurableWallTime: ISODate('2024-03-29T00:57:44.102Z'),lastHeartbeat: ISODate('2024-03-29T00:57:45.509Z'),lastHeartbeatRecv: ISODate('2024-03-29T00:57:44.514Z'),pingMs: Long('0'),lastHeartbeatMessage: '',syncSourceHost: '192.168.30.213:27021',syncSourceId: 0,infoMessage: '',configVersion: 1,configTerm: 1},{_id: 2,name: '192.168.30.213:27023',health: 1,state: 2,stateStr: 'SECONDARY',uptime: 13,optime: { ts: Timestamp({ t: 1711673864, i: 7 }), t: Long('1') },optimeDurable: { ts: Timestamp({ t: 1711673864, i: 7 }), t: Long('1') },optimeDate: ISODate('2024-03-29T00:57:44.000Z'),optimeDurableDate: ISODate('2024-03-29T00:57:44.000Z'),lastAppliedWallTime: ISODate('2024-03-29T00:57:44.102Z'),lastDurableWallTime: ISODate('2024-03-29T00:57:44.102Z'),lastHeartbeat: ISODate('2024-03-29T00:57:45.509Z'),lastHeartbeatRecv: ISODate('2024-03-29T00:57:44.516Z'),pingMs: Long('0'),lastHeartbeatMessage: '',syncSourceHost: '192.168.30.213:27021',syncSourceId: 0,infoMessage: '',configVersion: 1,configTerm: 1}],ok: 1,'$clusterTime': {clusterTime: Timestamp({ t: 1711673864, i: 7 }),signature: {hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0),keyId: Long('0')}},operationTime: Timestamp({ t: 1711673864, i: 7 })
}

注意:如果副本集初始化错无,可以用rs.rs.reconfig()命令调整。

三、参考

1]:docker搭建mongodb单节点副本集
2]:MongoDB 单节点升级为副本集高可用集群
3]:MongoDB—副本集配置、管理
4]:Install MongoDB with Docker

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

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

相关文章

【动手学深度学习-pytorch】-9.3深度循环神经网络

到目前为止,我们只讨论了具有一个单向隐藏层的循环神经网络。 其中,隐变量和观测值与具体的函数形式的交互方式是相当随意的。 只要交互类型建模具有足够的灵活性,这就不是一个大问题。 然而,对一个单层来说,这可能具有…

量化交易入门(二十七)回撤、收益率、夏普比率

回撤 一、回撤的定义与计算 回撤是指投资组合或交易账户从历史最高点下跌到后来最低点的幅度,通常用百分比表示。计算公式为: 回撤 (历史最高净值 - 当前净值) / 历史最高净值 100% 例如,某策略历史最高净值为150万,当前净值跌到了100万,则回撤为:(150-100)/150100%33.33%…

synchronized 和 ReentrantLock 的区别是什么

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:synchronized 和 ReentrantLock 的区别是什么 1. 获取锁的方式 synchronized:synchronized的锁获取是隐式的。当线程进入synchronized修饰的代码…

探索SOCKS5代理、代理IP与跨界电商、游戏技术的网络安全实践

介绍数字时代跨境业务的兴起,特别是跨界电商和全球游戏市场的扩张。 简述网络安全在支持跨境业务扩展中的核心作用,特别是SOCKS5代理和代理IP技术的重要性。 第一章:出海业务概述 跨界电商与全球化挑战:介绍跨界电商的基本模式&am…

Oracle 19C RAC集群补丁升级

文章目录 一、补丁包概述二、OPatch检查和更新Grid用户更新OPatchOracle用户更新OPatch 三、验证Oracle Inventory的有效性四、运行 OPatch 冲突检查五、运行opatch命令检查GI HOME下是否有足够的空间六、补丁冲突检测与解决(修补程序)七、使用root用户应…

Linux - 第三节

改变用户类型 su 仅单纯的进行身份变化 依旧处于普通用户里面 su - 进行重新登录更改身份 退出用exit / ctrld su 用户名 改成成其他身份 对一条命令进行提权 sudo command r:可读 w:可写 x:可执行 -:对应的权限位置,没有权限 去掉所有权限 chmod u…

MongoDB聚合运算符:$linearFill

文章目录 MongoDB聚合运算符:$linearFill语法使用对比$fill和$linearFill 举例使用线性插值填充缺失值在单个阶段中使用多种填充方法 MongoDB聚合运算符:$linearFill $linearFill聚合运算符在一个窗口中基于附近字段的值使用线性插值填充null和缺失字段…

Kafka开机自启脚本

1.虚拟机编辑定时任务 crontab -e reboot /usr/local/startShell.sh 2.编辑自定义启动脚本 #!/bin/sh# 进入kafka安装目录 cd /usr/local/kafka_2.12-3.7.0# 初始化java变量 export JAVA_HOME/usr/local/jdk1.8.0_401 export JRE_HOME${JAVA_HOME}/jre export PATH$PATH:${J…

多视图三维重建-SFM简介

背景 掌握传统的多视图三维重建基本流程 总体流程 多视图三维重建的Pipieline如下图,总共分为四个步骤: 拍摄场景多视角的图像建立这些图像之间的联系(Data Association)SFM稀疏重建MVS稠密重建 Data Association 建立图像…

向开发板上移植ip工具:将ip工具移植到开发板系统中

一. 简介 前面一篇文章对 ip工具源码进行了交叉编译,生成了ip工具。文章如下: 向开发板上移植ip工具:交叉编译 ip工具-CSDN博客 本文对生成的 ip工具进行移植,即移植到开发板系统中,并确定是否可用。 二. 向开发板…

Nagios工具

一 nagios 相关概念 Nagios 是一款开源的免费网络监视工具,能有效监控 Windows、Linux 和 Unix 的主机状态,交换机路由器等网络设置,打印机等。在系统或服务状态异常时发出邮件或短信报警第 一时间通知网站运维人员,在状态恢复后…

CY2300相位对齐时钟乘法器

这份文件是关于Cypress Semiconductor Corporation生产的CY2300型号的Phase-Aligned Clock Multiplier(相位对齐时钟乘法器)的技术手册。以下是该文件的核心内容概述: 产品特性: 4倍频输出配置。单一锁相环(PLL&#x…

顶顶通呼叫中心中间件-声音编码自适应配置方法(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-声音编码自适应配置方法讲解(mod_cti基于FreeSWITCH) 声音编码自适应介绍 声音编码自适应,通常在语音通信和音频处理领域中指的是一种能够根据信号特性和传输环境自动调整编码参数的技术。其目的是在不同的网络状况和音质要求下,…

6.1物联网RK3399项目开发实录-驱动开发之ADC驱动(wulianjishu666)

物联网嵌入式开发源码例程: 链接:https://pan.baidu.com/s/1B3oqq5QBhN-VmTFt9CI-7A?pwd2ihg ******************************************************************************************* ADC 使用 简介 AIO-3399J 开发板上的 AD 接口有两种…

服务未注册到nacos通过gateway转发的配置

1.现实场景 服务需要部署到内网阿里云,通过edas可以进行服务的自动部署和注册,但是有些服务需要调用同一环境中的C命令,于是通过建立ECS服务器,进行jar包的部署,那么在新建的ECS部署的jar包如何通过gateway转发&#…

5-规范设计(下):commit信息风格迥异、难以阅读,如何规范?

我们在做代码开发时,经常需要提交代码,提交代码时需要填写 Commit Message(提交说明),否则就不允许提交。 所以在 Go 项目开发时,一个好的 Commit Message 至关重要: 可以使自己或者其他开发人…

基于SSM的百货中心供应链管理系统设计与实现(论文+源码)_kaic

摘 要 社会发展日新月异,用计算机应用实现数据管理功能已经算是很完善的了,但是随着移动互联网的到来,处理信息不再受制于地理位置的限制,处理信息及时高效,备受人们的喜爱。本次开发一套百货中心供应链管理系统有管理…

u盘插在电脑上显示要格式化磁盘怎么办

咨询:“U盘插入电脑,提示需要先格式化 才可使用。对于此种情况,在不需要格式化的情况下,是否可以恢复U盘内容?谢谢” 当我们尝试将U盘插入电脑时,有时会遇到一个令人困惑的提示:电脑要求我们格式…

Game Audio Programming

音频编程时游戏开发中最容易忽略,学习资源又是很少的环节。接下来,你将和我探索人耳的工作机制。 what is sound? 我们可以解释电视机是如何通过眼睛传递视觉信息的,但却往往无法对听觉信息做出类似的解释。 对声音的科学研究被称为声学&…

vlan间单臂路由

【项目实践4】 --vlan间单臂路由 一、实验背景 实验的目的是在一个有限的网络环境中实现VLAN间的通信。网络环境包括两个交换机和一个路由器,交换机之间通过Trunk链路相连,路由器则连接到这两个交换机的Trunk端口上。 二、案例分析 在网络工程中&#…