docker搭建mongo副本集

2024-06-23 19:52
文章标签 docker 搭建 副本 mongo

本文主要是介绍docker搭建mongo副本集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

发现集群已经不可用。

这篇关于docker搭建mongo副本集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1088123

相关文章

Mycat搭建分库分表方式

《Mycat搭建分库分表方式》文章介绍了如何使用分库分表架构来解决单表数据量过大带来的性能和存储容量限制的问题,通过在一对主从复制节点上配置数据源,并使用分片算法将数据分配到不同的数据库表中,可以有效... 目录分库分表解决的问题分库分表架构添加数据验证结果 总结分库分表解决的问题单表数据量过大带来的性能

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

Docker集成CI/CD的项目实践

《Docker集成CI/CD的项目实践》本文主要介绍了Docker集成CI/CD的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、引言1.1 什么是 CI/CD?1.2 docker 在 CI/CD 中的作用二、Docke

如何在一台服务器上使用docker运行kafka集群

《如何在一台服务器上使用docker运行kafka集群》文章详细介绍了如何在一台服务器上使用Docker运行Kafka集群,包括拉取镜像、创建网络、启动Kafka容器、检查运行状态、编写启动和关闭脚本... 目录1.拉取镜像2.创建集群之间通信的网络3.将zookeeper加入到网络中4.启动kafka集群

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联