docker搭建mongo副本集
1、mongo集群分类
MongoDB集群有4种类型,分别是主从复制、副本集、分片集群和混合集群。
- MongoDB的主从复制是指在一个MongoDB集群中,一个节点(主节点)将数据写入并同步到其他节点(从节点)。主从复制提供了数据的冗余备份,并且可以实现高可用性和故障恢复。
-
副本集(Replica Set):副本集由一个主节点和多个从节点组成。主节点负责处理写入操作和数据同步,从节点负责处理读取操作。主节点的写入操作会异步地传播到所有从节点,保证数据的冗余和可用性。如果主节点不可用,从节点可以选举出一个新的主节点,实现自动故障转移。
-
分片集群(Sharded Cluster):分片集群将数据库分成多个分片,每个分片在不同的服务器上存储一部分数据。每个分片都是一个独立的MongoDB实例,负责存储和处理一部分数据。分片集群通过路由器将客户端的请求路由到正确的分片上。分片集群可以实现水平扩展,提高数据库的吞吐量和性能。
-
混合集群(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 |
2 | 2 |
3 | 2 |
4 | 3 |
5 | 3 |
6 | 4 |
7 | 4 |
注意:副本集中的大多数是基于副本集的配置来计算的。即使副本集中有些成员停止运行或者不可用时,不改变副本集的成员总数。
从上表可以看出,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
发现集群已经不可用。
相关文章:

docker搭建mongo副本集
1、mongo集群分类 MongoDB集群有4种类型,分别是主从复制、副本集、分片集群和混合集群。 MongoDB的主从复制是指在一个MongoDB集群中,一个节点(主节点)将数据写入并同步到其他节点(从节点)。主从复制提供…...

关于Pytorch转换为MindSpore的一点建议
一、事先准备 必须要对Mindspore有一些了解,因为这个框架确实有些和其它流程不一样的地方,比如算子计算、训练过程中的自动微分,所以这两个课程要好好过一遍,官网介绍文档最好也要过一遍 1、零基础Mindspore:https://…...

JetBrains IDEA 新旧UI切换
JetBrains IDE 新旧UI切换 IntelliJ IDEA 的老 UI 以其经典的布局和稳定的性能,成为了许多开发者的首选。而新 UI 则在此基础上进行了全面的改进,带来了更加现代化、响应式和高效的用户体验。无论是新用户还是老用户,都可以通过了解和适应这…...
iOS KeychainAccess的了解与使用
KeychainAccess 是一个用于 iOS、macOS、tvOS 和 watchOS 上的 Swift 密钥链访问库。它提供了一个简单且安全的 API,用于在设备的密钥链中存储和检索数据。 KeychainAccess 的一些主要特点包括: 简单易用的 API:该库提供了一个直观的 API,可以轻松地将数据存储和检…...

STM32 Customer BootLoader 刷新项目 (二) 方案介绍
STM32 Customer BootLoader 刷新项目 (二) 方案介绍 文章目录 STM32 Customer BootLoader 刷新项目 (二) 方案介绍1. 需求分析2. STM32 Memery介绍3. BootLoader方案介绍4. 支持指令 1. 需求分析 首先在开始编程之前,我们先详细设计一下BootLoder的方案。 本项目做…...

2-14 基于matlab的GA优化算法优化车间调度问题
基于matlab的GA优化算法优化车间调度问题。n个工作在m个台机器上加工。已知每个工作中工序加工顺序、各工序的加工时间以及每个工件所包含的工序,在满足约束条件的前提下,目的是确定机器上各工件顺序,以保证某项性能指标最优。程序功能说明&a…...

Program-of-Thoughts(PoT):结合Python工具和CoT提升大语言模型数学推理能力
Program of Thoughts Prompting:Disentangling Computation from Reasoning for Numerical Reasoning Tasks github:https://github.com/wenhuchen/Program-of-Thoughts 一、动机 数学运算和金融方面都涉及算术推理。先前方法采用监督训练的形式,但这…...
ansible setup模块
用于收集有关目标主机的系统和网络信息,并将这些信息存储为一个facts变量,可以在Playbook的后续任务中使用。setup模块可以用来获取主机的操作系统、软件包、IP地址、内存、磁盘和其他硬件信息。这些信息对编写Playbook和进行条件判断非常有用。当你在Pl…...

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的测试用例执行计划(100分) - 三语言AC题解(Python/Java/Cpp)
🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 https://app5938.acapp.acwing.com.cn/contest/2/problem/OD…...

NSIS 入门教程 (一)
介绍 大多数应用程序都附带一个安装程序,它将所需的文件复制到正确的文件夹中,创建注册表项,并提供卸载例程以(希望)从计算机中彻底删除应用程序. 有多种解决方案可以为自主开发的应用程序配备安装程序。除了Install …...

cve-2015-3306-proftpd-vulfocus
1.原理 proftp是用于搭建基于ftp协议的应用软件 ProFTPD是ProFTPD团队的一套开源的FTP服务器软件。该软件具有可配置性强、安全、稳定等特点。 ProFTPD 1.3.5中的mod_copy模块允许远程攻击者通过站点cpfr和site cpto命令读取和写入任意文件。任何未经身份验证的客户端都可以…...

超详细!想进华为od的请疯狂看我!
三分钟带你全面了解华为OD 【合同及管理】签约方为科锐国际/外企德科(人力服务公司),劳动合同期为4年,试用期6个月。员工关系合同管理、五险一金、考勤发薪由科锐国际/外企德科负责;定级定薪、员工培训、工作安排、绩…...
MQTT协议与TCP/IP协议在性能上的区别
MQTT协议与TCP/IP协议在性能上的区别主要体现在以下几个方面: 1.协议开销与传输效率: ① MQTT:MQTT协议针对消息传递进行了优化,使用了小型的控制包和变长的包头设计,极大程度地减少了数据传输过程中的冗余和带宽消耗…...
LeetCode 每日一题 2024/6/17-2024/6/23
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 6/17 522. 最长特殊序列 II6/18 2288. 价格减免6/19 2713. 矩阵中严格递增的单元格数6/20 2748. 美丽下标对的数目6/21 LCP 61. 气温变化趋势6/22 2663. 字典序最小的美丽字…...

FlinkCDC pipeline模式 mysql-to-paimon.yaml
flinkcdc 需要引入: source端: flink-cdc-pipeline-connector-mysql-xxx.jar、mysql-connector-java-xxx.jar、 sink端: flink-cdc-pipeline-connector-paimon-xxx.jar flinkcdc官方提供connect包下载地址,pipeline模式提交作业和…...
mysql数据库入门手册
数据库 常见的数据库查看当前用户及其权限创建用户授权用户访问数据库撤销用户权限修改用户密码删除用户增创建一个数据库创建表表中插入数据表中添加字段(三种方式) 删删除表记录删除表字段删除表(三种方式)删除数据库 改修改表名…...

增强大型语言模型(LLM)可访问性:深入探究在单块AMD GPU上通过QLoRA微调Llama 2的过程
Enhancing LLM Accessibility: A Deep Dive into QLoRA Through Fine-tuning Llama 2 on a single AMD GPU — ROCm Blogs 基于之前的博客《使用LoRA微调Llama 2》的内容,我们深入研究了一种称为量化低秩调整(QLoRA)的参数高效微调࿰…...

空间复杂度 线性表,顺序表尾插。
各位少年,大家好,我是那一脸阳光,本次分享的主题是时间复杂度和空间复杂度 还有顺序表文章讲解和分享,如有不对可以评论区指导。 时间复杂度例题 // 计算斐波那契递归Fib的时间复杂度? long long Fib(size_t N){if(N…...
linux创建用户、切换用户、删除用户
创建用户 # 创建新用户 sudo useradd newuser# 设置新用户的密码 sudo passwd newuser切换用户 # 切换到新用户 su newuser# 验证用户切换 whoami 删除用户 # 删除用户 sudo userdel -r username# 验证用户是否已被删除 grep username /etc/passwd 如果删除用户时提示&…...

BC64 牛牛的快递(c++)
牛牛的快递 题目描述输入描述输出描述示例代码 解题思路例如 题目描述 牛牛正在寄快递,他了解到快递在 1kg 以内的按起步价 20 元计算,超出部分按每 kg 1元计算,不足 1kg 部分按 1kg计算。如果加急的话要额外付五元,请问牛牛总共要…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...

【Qt】控件 QWidget
控件 QWidget 一. 控件概述二. QWidget 的核心属性可用状态:enabled几何:geometrywindows frame 窗口框架的影响 窗口标题:windowTitle窗口图标:windowIconqrc 机制 窗口不透明度:windowOpacity光标:cursor…...