docker搭建mongo副本集

news2024/11/25 2:28:31

1、mongo集群分类

MongoDB集群有4种类型,分别是主从复制、副本集、分片集群和混合集群。

  1. MongoDB的主从复制是指在一个MongoDB集群中,一个节点(主节点)将数据写入并同步到其他节点(从节点)。主从复制提供了数据的冗余备份,并且可以实现高可用性和故障恢复。
  2. 副本集(Replica Set):副本集由一个主节点和多个从节点组成。主节点负责处理写入操作和数据同步,从节点负责处理读取操作。主节点的写入操作会异步地传播到所有从节点,保证数据的冗余和可用性。如果主节点不可用,从节点可以选举出一个新的主节点,实现自动故障转移。

  3. 分片集群(Sharded Cluster):分片集群将数据库分成多个分片,每个分片在不同的服务器上存储一部分数据。每个分片都是一个独立的MongoDB实例,负责存储和处理一部分数据。分片集群通过路由器将客户端的请求路由到正确的分片上。分片集群可以实现水平扩展,提高数据库的吞吐量和性能。

  4. 混合集群(Mixed Cluster):混合集群是复制集群和分片集群的结合。在混合集群中,每个分片都是一个复制集群,由主节点和从节点组成。这样在每个分片上可以实现故障转移和数据冗余的功能,同时通过分片集群的方式实现水平扩展。

每种类型的集群都有其适用场景和优势,选择合适的集群类型需要根据具体的业务需求和数据库规模来决定。下面演示如何使用docker部署副本集。

2、docker部署mongo副本集

2.1、配置mongo容器

新建容器卷目录

mkdir mongo01 && cd mongo01
mkdir -p conf data logs
cd conf
touch mongod.conf

编辑mongod.conf文本内容:

##设置数据存储目录
dbpath=/data/db
##设置日志存储文件
##logpath=data/log/mongod.log
##日志追加模式
logappend=true
##允许客户端任意ip连接
bind_ip=0.0.0.0
##绑定端口
port=27017
##副本集名称(非常重要)
replSet=rs

批量创建4个节点,挂载卷目录及端口映射 

#!/bin/bash
docker run -d --name mongo01 -p 27018:27017 --privileged=true -v ./mongo01/data:/data/db -v ./mongo01/conf:/data/configdb -v ./mongo01/logs:/data/log/ mongo -f /data/configdb/mongod.conf 
docker run -d --name mongo02 -p 27019:27017 --privileged=true -v ./mongo02/data:/data/db -v ./mongo02/conf:/data/configdb -v ./mongo02/logs:/data/log/ mongo -f /data/configdb/mongod.conf
docker run -d --name mongo03 -p 27020:27017 --privileged=true -v ./mongo03/data:/data/db -v ./mongo03/conf:/data/configdb -v ./mongo03/logs:/data/log/ mongo -f /data/configdb/mongod.conf
docker run -d --name mongo04 -p 27021:27017 --privileged=true -v ./mongo04/data:/data/db -v ./mongo04/conf:/data/configdb -v ./mongo04/logs:/data/log/ mongo -f /data/configdb/mongod.conf

 通过docker exec进入第一个容器内部

docker exec -it mongo01 mongo

2.2、副本集操作命令

在 MongoDB 中,副本集(Replica Set)使用一系列特定的命令来进行管理和操作。以下是一些常用的 MongoDB 副本集命令

rs.add()添加成员到复制集
rs.addArb()添加仲裁节点
rs.conf()查看复制集配置
rs.freeze()阻止当前节点进行选举和接受写操作
rs.help()用户帮助手册
rs.initiate()初始化副本集
rs.reconfig()修改副本集的配置
rs.remove()remove("hostname:port") - 从副本集中移除指定的成员
rs.secondaryOk()允许连接到副本集的 secondary 成员
rs.status()查看副本集状态
rs.stepDown()强制当前主节点成为 secondary 节点

2.3、关于主节点的选举

副本集在选取主节点的时候,需要由大多数决定,主节点只有在得到大多数支持才能继续作为主节点。这里的大多数定义为“副本集一半以上的成员”,如下表所示:

副本集中的成员总数副本集中的大多数
1        1
22
32
43
53
64
74

注意:副本集中的大多数是基于副本集的配置来计算的。即使副本集中有些成员停止运行或者不可用时,不改变副本集的成员总数。

从上表可以看出,MongoDB副本集最少需要3个节点才能正常处理节点宕机的情况。一个副本集包含一个主节点(Primary)和若干个从节点(Secondary),以及一个仲裁节点(Arbiter)。主节点负责处理所有的写操作,并将数据同步到从节点上。从节点则负责复制主节点的数据,并可以处理读请求。仲裁节点用于在选举新的主节点时进行投票。 

如下图所示,假如有一个包含5个成员的副本集,其中db1到db3不可用,db4,db5可以正常工作。这2个成员不能达到副本集的大多数成员规则(至少需要3个成员),因此无法选举出主节点。即使这2个成员其中一个之前是主节点,那么当它注意到无法得到大多数成员支持时,就会从主节点上退位。最终结果是,副本集包含2个从节点和3个无法访问的成员了。

那为什么剩下的2个成员不能选择出主节点呢?问题在于,db1到db3可能没有宕机,而只是因为网络故障不可达(地理隔离)。在这种情况下,左侧的3个成员将选举出一个主节点。我们不希望因为地理隔离而导致两边网络各自选择出一个主节点,因为那样副本集就拥有两个主节点,2个主节点都可以写入数据的话,整个副本集的数据便混乱了。只有得到“大多数成员支持”的情况才能选举和维持主节点,这是避免出现多个主节点的有效方式。

2.4、配置副本集

本文设置3个节点,1个仲裁节点。

rs.initiate({_id:"rs",members:[{_id:0,host:"192.168.0.121:27018"},{_id:1,host:"192.168.0.121:27019"},{_id:2,host:"192.168.0.121:27020"},{_id:3,host:"192.168.0.121:27021",arbiterOnly:true}]})

关于仲裁节点:

MongoDB副本集中只能有一个仲裁节点。仲裁节点是在副本集中用于投票和选举新主节点的节点。它不存储任何数据,只提供投票的功能。

2.5、navicat连接mongo副本集

专业版的navicat客户端不仅可以操作关系型数据库,也可以连接mongo,如下所示:

3、副本集测试案例

3.1、主节点进行写操作

进入主节点,插入测试数据

use test;
db.game.insert({"name":"LuckyDefense"})

3.2、从节点无法写数据,默认也无法读数据

exit退出容器,进入第二个节点(从节点

docker exec -it mongo02 bash

执行命令 

show databases;

从节点可能会因为延迟而缺少最新的写入数据,所以默认从节点不允许读取,以防止应用程序意外读取过期数据。如果期望在从节点进行查询操作,可以执行以下命令,即可。

rs.secondaryOk()

然而,在从节点尝试执行写入数据,会出现以下报错

报错显示,从节点不接受写操作。从节点只能通过复制功能写入数据,不接受客户端的写操作。

3.3、模拟节点宕机

当其中一个节点崩溃,服务对外仍可工作。模拟节点宕机情况,执行

docker stop mongo01

从navicat可以检测到副本集的状态(总共4个节点,剩余3个节点,可以重新选择新主节点),如下:

继续删除一个节点

docker stop mongo02

发现集群已经不可用。

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

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

相关文章

游戏高度可配置化(二)用“模型抽象”化解游戏策划和程序员的江湖恩怨

游戏高度可配置化(二)用“模型抽象”化解游戏策划和程序员的江湖恩怨 码客 卢益贵 ygluu 关键词:模型抽象、功能抽象、抽象工厂模式、游戏服务端引擎、高度可配置化、恩怨情仇、游戏策划、数据引擎、生产消费模型、订阅-通知模型 一、前言…

Go语言之基础入门

网站:http://hardyfish.top/ 免费书籍分享: 免费专栏分享: Go语言优势 语法简洁,相比其他语言更容易上手,开发效率更高; 自带垃圾回收(GC),不用再手动申请释放内存&…

管综 之 逻辑

1.复言命题 1.1假言推理 1.命题模型识别:当题干中出现如果那么,只有才,当且仅当等典型关联词时此题考的是简单假言推理问题 2.三步解题法:1️⃣:画箭头 2️⃣:递否 3️⃣:找答案 口诀: [口诀1]充分条件前推后 [口诀2]逆否命题等价于原命题 […

第13关:存储过程1、第14关:存储过程2。(2021数据库期末一)

目录 首先需要学习和了解的知识 第13关:存储过程1 任务描述 答案 第14关:存储过程2 任务描述 答案 本篇博客的答案博主是学习别人得来的,敢于借鉴和学习哈哈!! 首先需要学习和了解的知识 了解什么是存储过程以及…

3D开发工具HOOPS为BIM应用提供支持:复杂大模型实现Web端轻量化!

在数字化转型的浪潮中,Tech Soft 3D以其HOOPS SDK工具包,为软件开发人员提供了强大的支持。这一工具包不仅支持Windows、Linux、OSX和移动平台等多样化的操作系统,还使得开发人员能够构建出庞大而复杂的建筑和BIM应用程序。HOOPS SDK的多格式…

现在的Android程序员为什么会感到焦虑?焦虑的源头在哪里?该怎么去缓解焦虑呢?——没有无中生有的贩卖焦虑,只有你的挣扎和不甘。

二、知识为何产生焦虑 先说两个世界,知识的世界和现实的世界。 知识的世界,由承载知识的那些载体组成,比如图书、音视频、报刊、自媒体等。 现实的世界,就是我们每天生活的、做出各种行为的世界。 学习的目的是什么呢&#xff1…

纯js开发在线截图生成器工具,思路和方法在这里

不谈使用转账付款交易截图的用途是什么,我这里只谈怎么通过代码来实现这个功能的思路,以及用到的技术。 最近有个客户找到探奇客需要定制一个截图生成的工具。开发后的效果是这样的 开发这个转账付款交易截图生成器用到了这些组件,这里就直接…

UsersGUI.java用户界面

完成效果图: 点击阅读按钮: 点击删除按钮: 点击新建按钮: Code /* This GUI application allows users to manage their diaries: ​ Read: Users can read existing diaries. Create: Users can create new diaries. Delete: Us…

2024年【N1叉车司机】考试及N1叉车司机考试题库

题库来源:安全生产模拟考试一点通公众号小程序 N1叉车司机考试是安全生产模拟考试一点通总题库中生成的一套N1叉车司机考试题库,安全生产模拟考试一点通上N1叉车司机作业手机同步练习。2024年【N1叉车司机】考试及N1叉车司机考试题库 1、【多选题】《中…

如何与情绪好好相处,真正成为情绪的主人

一、教程描述 若要成为一个聪明的人,就要学会做情绪的主人,而不是被情绪控制自己,为什么要做情绪的主人?至少有以下两个方面原因。 其一,都说,世上还是好人多。可是,为什么你身边没有一个好人…

java基于ssm+jsp 人才公寓管理系统

1管理员功能模块 管理员登录,通过填写用户名、密码进行登录,如图1所示。 图1管理员登录界面图 管理员登录进入人才公寓管理系统可以查看个人中心、住户管理、小区公告管理、停车位管理、安保人员管理、安保值班管理、房屋信息管理、外来登记管理、物品…

知乎客户端跨平台-Hybrid-调试实战

在开发上述功能的过程中,发现了 flipper 这个工具 flipper 提供了一个桌面客户端,然后这个桌面客户端提供了一个和手机客户端通信的机制,免去了 socket 服务的开销,依靠这个通信机制,我们可以把上述的功能复制过来 基…

淦!在外包开发的三年给整废了,备战两个月终拿到Android阿里字节哈啰offer总结,阿里P6+这回稳了!

面试时候就感觉不靠谱,因为面试地点是位于近江附近的望江国际里面的温州银行,面试前网上搜了广电运通的信息,说是国企,所以我就硬着头皮接下 offer 了,没想到面试 Android 结果做的 C,而且也是驻场开发。 …

1.1 数据采集总览

正所谓巧妇难为无米之炊,数据采集是数据处理的第一步。 什么是数据采集 数据采集,也称为数据收集,是将原始数据从各种来源获取并存储起来的过程。这个过程是数据分析和数据仓库建设的第一步,涉及到从不同的数据源中提取数据&…

游戏高度可配置化(一)通用数据引擎(data-e)及其在模块化游戏开发中的应用构想图解

游戏高度可配置化(一)通用数据引擎(data-e)及其在模块化游戏开发中的应用构想图解 码客 卢益贵 ygluu 关键词:游戏策划 可配置化 模块化配置 数据引擎 条件系统 红点系统 一、前言 在插件式模块化软件开发当中,既要模块高度独…

MK的前端精华笔记

文章目录 MK的前端精华笔记第一阶段:前端基础入门1、(1)、(2)、 2、3、4、5、6、7、 第二阶段:组件化与移动WebAPP开发1、(1)、(2)、 2、3、4、5、6、7、 第三…

新能源燃气灶用的是什么燃料?无需燃料,电生明火

新能源燃气灶广义的讲就是用电生明火的烹饪灶具,如:电焰灶、电燃灶或电火灶,无需任何燃料和氧气助燃;而狭义上讲是采用出电能以外的一切新燃料烹饪灶具,如:高功率燃气灶、生物合成油灶等。在厨房革命的浪潮…

C++系列-String(一)

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” string是用于字符串,可以增删改查 首先,我们来看一下string的底层 接下来,我们来看一下string的常用接口有哪些: #define _CRT_S…

双非本,3年时间从外包到阿里P6(Android岗),看我是怎么逆袭成功的?

而在小公司,因为我也在小公司呆过,所以我有最直接的感受。整个部门技术人员没几个,我又大学刚毕业,带我的人,问啥啥不会,只有一个大佬,跳槽来的,是我们技术总监,有问题谁…

stm32学习笔记---新建工程步骤和点灯演示

目录 STM32的三种开发方式 基于寄存器的方式 基于库函数的方式 基于Hal库的方式 固件库介绍 新建基于标准库的工程步骤 配置寄存器来完成点灯操作 添加库函数来完成点灯操作 添加库函数 开始点灯操作 第一步:使能时钟 第二步:配置端口模式 …