MongoDB搭建复制集集群(Docker版)

这篇具有很好参考价值的文章主要介绍了MongoDB搭建复制集集群(Docker版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

复制集注意事项

关于复制集:

  • 复制集为 MongoDB 提供了数据可靠性,当某个节点挂掉,可以重新选举出主节点;
  • 复制集为 MongoDB 提供了数据安全性,当节点宕机后,备份数据保证数据不丢失;
  • 复制集为 MOngoDB 提供了高性能,可通过配置主从读写分离提高服务性能;

关于硬件:

  • 因为正常的复制集节点都有可能成为主节点,它们的地位是一样的,因此硬件配置上必须一致;
  • 为了保证节点不会同时宕机,各节点使用的硬件必须具有独立性;
  • 此处用的 Docker 在同一个虚拟机上模拟三个节点;

关于软件:

  • 复制集各节点软件版本必须一致,以避免出现不可预知的问题;
  • 增加节点不会增加系统写性能;
  • 此处用的 MongoDB 6.0.5 版本;

环境准备

  • Docker 安装 MongoDB 并配置好环境变量;
  • 确保有 10GB 以上的硬盘空间;
  • 默认已安装 Docker,没安装的话请参考我的 Docker 教程;
  • 宿主机器为 CentOS7;

一主两从架构图:
MongoDB搭建复制集集群(Docker版),# MongoDB,mongodb,docker,复制集,集群,高可用,高性能

安装步骤

(1)准备配置文件
复制集的每个 mongod 进程应该位于不同的服务器。我们现在在一台机器上运行 3 个进程,因此要为它们各自配置:

  • 不同的端口(28017/28018/28019)
  • 不同的数据目录
mkdir -p /data/db{1,2,3}

MongoDB搭建复制集集群(Docker版),# MongoDB,mongodb,docker,复制集,集群,高可用,高性能

  • 不同日志文件路径(例如:/data/db1/logs)
mkdir -p /data/db{1,2,3}/logs

创建配置文件/data/db1/mongod.conf,内容如下:

systemLog:
  destination: file
  path: /data/logs/mongod.log # log path
  logAppend: true
storage:   
  dbPath: /data/db # data directory      
net:
  bindIp: 0.0.0.0
  port: 27017 # port
replication:
  replSetName: rs0 # 复制集名称
# processManagement: # 设置了该项会导致docker exec -it mongodb1 bash 进入容器后马上自动退出
#   fork: true

将该配置文件复制都 db2、db3 对应的目录下,注意其中配置的是容器中的地址,而不是宿主机对应的地址,且必须是 yaml 格式。
MongoDB搭建复制集集群(Docker版),# MongoDB,mongodb,docker,复制集,集群,高可用,高性能

(2)启动 docker
启动第 1 个 mongod:

docker run --name mongodb1 -d --restart=always -v /data/db1:/data/db -v /data/db1/logs:/data/logs -v /data/db1/mongod.conf:/data/conf/mongod.conf -p 28017:27017 mongo:6.0.5 --config /data/conf/mongod.conf

–name:指定容器名称
-d:后台运行
–restart:设置容器的重启策略,always 表示重启宿主机自动运行 docker
-v:将宿主机文件挂载到容器中,注意格式为:“宿主机路径 : 容器路径”
-p:绑定宿主机和容器的端口,注意格式为:“宿主机端口 : 容器端口”
mongo:6.0.5:指定镜像名和版本号
–config:指定启动的配置文件,容器中的路径

启动第 2 个 mongod:

docker run --name mongodb2 -d --restart=always -v /data/db2:/data/db -v /data/db2/logs:/data/logs -v /data/db2/mongod.conf:/data/conf/mongod.conf -p 28018:27017 mongo:6.0.5 --config /data/conf/mongod.conf

启动第 3 个 mongod:

docker run --name mongodb3 -d --restart=always -v /data/db3:/data/db -v /data/db3/logs:/data/logs -v /data/db3/mongod.conf:/data/conf/mongod.conf -p 28019:27017 mongo:6.0.5 --config /data/conf/mongod.conf

查看 docker 进程状态及网络端口:
MongoDB搭建复制集集群(Docker版),# MongoDB,mongodb,docker,复制集,集群,高可用,高性能
注意 docker 启动,宿主机的防火墙 firewalld 必须开启,否则会报如下错误:
MongoDB搭建复制集集群(Docker版),# MongoDB,mongodb,docker,复制集,集群,高可用,高性能
通过客户端工具访问 mongodb:
MongoDB搭建复制集集群(Docker版),# MongoDB,mongodb,docker,复制集,集群,高可用,高性能
进入 docker 容器操作 mongodb:

# 宿主机进入容器
docker exec -it mongodb1 bash
# 进入容器mongodb的命令行模式
mongosh
# 查看mongodb数据库
show dbs

MongoDB搭建复制集集群(Docker版),# MongoDB,mongodb,docker,复制集,集群,高可用,高性能
至此,三个 mongod 节点安装完成。

配置复制集

复制集通过 mongosh 的 rs.initiate() 进行初始化,初始化后各个成员间开始发送心跳消息,并发起 Priamry 选举操作,获得大多数成员投票支持的节点,会成为 Primary,其余节点成为 Secondary。

进入 mongdb1 节点后执行 mongosh 命令后:

# mongosh --port 28017 
# 初始化复制集
> rs.initiate({
    _id: "rs0",
    members: [{
        _id: 0,
        host: "192.168.10.101:28017"
    },{
        _id: 1,
        host: "192.168.10.101:28018"
    },{
        _id: 2,
        host: "192.168.10.101:28019"
    }]
})

提示{ok:1}表示初始化成功:
MongoDB搭建复制集集群(Docker版),# MongoDB,mongodb,docker,复制集,集群,高可用,高性能

验证主从节点读写操作:

  • MongoDB 主节点进行写入
# mongosh --port 28017
rs0 [direct: primary] test> db.user.insertMany([{name:"firechou"},{name:"monkey"}])

MongoDB搭建复制集集群(Docker版),# MongoDB,mongodb,docker,复制集,集群,高可用,高性能

  • 切换到从节点写入,抛出异常 MongoBulkWriteError: not primary
# mongosh --port 28018  
rs0 [direct: secondary] test> db.user.insertMany([{name:"firechou"},{name:"monkey"}])

MongoDB搭建复制集集群(Docker版),# MongoDB,mongodb,docker,复制集,集群,高可用,高性能

  • MongoDB 从节点进行读
# mongosh --port 28018
# 指定从节点可读
rs0:SECONDARY> rs.secondaryOk() # 需要执行该命令,否则会报错
rs0:SECONDARY> db.user.find()

MongoDB搭建复制集集群(Docker版),# MongoDB,mongodb,docker,复制集,集群,高可用,高性能
或者执行如下命令开启从节点读:

db.getMongo().setReadPref("secondary")

MongoDB搭建复制集集群(Docker版),# MongoDB,mongodb,docker,复制集,集群,高可用,高性能

  • 模拟重新选举 Master

停掉 mongodb1 服务:
MongoDB搭建复制集集群(Docker版),# MongoDB,mongodb,docker,复制集,集群,高可用,高性能
查看 mongodb2 服务已被选举成了 Primary 节点:
MongoDB搭建复制集集群(Docker版),# MongoDB,mongodb,docker,复制集,集群,高可用,高性能
启动 mongodb1 后再次执行写入操作,提示非主节点不能写入:
MongoDB搭建复制集集群(Docker版),# MongoDB,mongodb,docker,复制集,集群,高可用,高性能

复制集状态查询

  • 查看复制集整体状态:
rs.status()

可查看各成员当前状态,包括是否健康,是否在全量同步,心跳信息,增量同步信息,选举信息,上一次的心跳时间等。
MongoDB搭建复制集集群(Docker版),# MongoDB,mongodb,docker,复制集,集群,高可用,高性能
说明:

members:数组,一列体现了所有复制集成员的状态,主要如下:
health:成员是否健康,通过心跳进行检测。
state/stateStr:成员的状态,PRIMARY 表示主节点,而 SECONDARY 则表示备节点,如果节点出现故障,则可能出现一些其他的状态,例如 RECOVERY。
uptime:成员的启动时间。
optime/optimeDate:成员同步最后一条 oplog 的时间。
optimeDurable/optimeDurableDate:成员同步最后一条 oplog 持久化的时间。
pingMs:成员与当前节点的 ping 时延。
syncingTo:成员的同步来源。

  • 查看当前节点角色:
db.isMaster()

除了当前节点角色信息,是一个更精简化的信息,也返回整个复制集的成员列表,真正的 Primary 是谁,协议相关的配置信息等,Driver 在首次连接复制集时会发送该命令。文章来源地址https://www.toymoban.com/news/detail-814090.html

Mongos 复制集常用命令

**命令 ** 描述
rs.add() 为复制集新增节点
rs.addArb() 为复制集新增一个 arbiter
rs.conf() 返回复制集配置信息
rs.freeze() 防止当前节点在一段时间内选举成为主节点
rs.help() 返回 replica set 的命令帮助
rs.initiate() 初始化一个新的复制集
rs.printReplicationInfo() 以主节点的视角返回复制的状态报告
rs.printSecondaryReplicationInfo() 以从节点的视角返回复制状态报告
rs.reconfig() 通过重新应用复制集配置来为复制集更新配置
rs.remove() 从复制集中移除一个节点
rs.secondaryOk() 为当前的连接设置从节点可读
db.getMongo().setReadPref(“secondary”) 为当前的连接设置从节点可读,推荐使用
rs.status() 返回复制集状态信息
rs.stepDown() 让当前的 primary 变为从节点并触发
electionrs.syncFrom() 设置复制集节点从哪个节点处同步数据,将会覆盖默认选取逻辑

到了这里,关于MongoDB搭建复制集集群(Docker版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 轻松掌握组件启动之MongoDB(上):高可用复制集架构环境搭建

    在生产环境中,强烈不建议使用单机版的MongoDB服务器。原因如下: 单机版的MongoDB无法保证系统的可靠性。一旦进程发生故障或是服务器宕机,业务将直接不可用。此外,一旦服务器上的磁盘损坏,数据会直接丢失,而此时并没有任何副本可用。 为了确保数据的高可用性和冗

    2024年02月08日
    浏览(52)
  • 轻松掌握组件启动之MongoDB(番外篇):高可用复制集架构环境搭建-mtools

    在前两章节中,我们详细讲解了如何手动配置启动MongoDB。然而,现在有许多不同的工具可以帮助我们更方便地启动和创建MongoDB数据库。因此,今天我将介绍一个名为mtools的开源项目,它可以帮助我们更轻松地启动MongoDB。 官方文档地址:mtools mtools是一个基于Python实现的Mong

    2024年02月08日
    浏览(42)
  • 基于 k8s+docker 环境构建一个高可用、高性能的 web 集群。

    目录 项目架构图 项目描述 项目环境 环境准备 IP地址规划 关闭selinux和firewall 配置静态ip地址 修改主机名 升级系统(可做可不做) 添加hosts解析 项目步骤 一.使用ProcessOn设计了整个集群的架构,规划好服务器的IP地址,使用kubeadm安装k8s单master的集群环境(1个master+2个node节点

    2024年02月07日
    浏览(72)
  • 使用docker搭建mongodb

    使用 Docker CLI 搭建 MongoDB 1. 运行 MongoDB 容器 首先,我们使用以下命令来启动一个 MongoDB 容器: 参数解释: -itd : 这三个参数通常一起使用, i 表示交互式模式, t 分配一个伪终端, d 表示后台运行。 --name mongodb_comm : 为容器指定一个名字 mongodb_comm ,方便后续的操作和管理。

    2024年03月18日
    浏览(77)
  • 【保姆级教程】:docker搭建MongoDB三节点副本集

    欢迎关注公众号:天天说编程 你的关注是我最大的动力! 容器可以理解为一个进程,镜像是把环境,组件等都配置好,运行成容器的,容器里面运行服务,也可以说是一个进程。镜像是模板,镜像是实例。 一个镜像可以创建多个实例。也就是多个容器,容器之间相互独立。

    2024年02月03日
    浏览(46)
  • MongoDB复制集集群部署及管理

    简述: MongoDB是由C++语言编写一个基于 分布式 文件存储的开源NoSQL数据库系统。在高负载的情况下,可添加更多的节点(实例),以保证服务性能。在许多场景下用于代替传统的关系型数据库或键/值存储方式。旨在为Web应用提供可扩展的高性能数据存储解决方案。 MongoDB提供

    2024年02月12日
    浏览(45)
  • mongodb复制集集群部署、测试、选举原理

    目录 一、基本概念 二、 mongodb安装部署 1、关闭防火墙和selinux 2、指定一个进程同一时间最多可开启的文件数 3、用户最多可开启的进程数目 4.安装版本下载地址,并优化命令 5、创建数据目录,日志文件及目录并创建相应配置文件 6、启动MongoDB数据库,-f指定配置文件 7、设

    2024年02月12日
    浏览(41)
  • 使用Docker搭建开发环境:MySQL、Redis、MongoDB和Selenium Grid

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何支持Docker的平台上。在本篇博客中,我们将详细介绍如何用Docker安装MySQL、Redis、MongoDB和Selenium Grid,并给出相应的代码案例。 在开始之前,确保您的系统上安

    2024年02月19日
    浏览(41)
  • 如何在Ubuntu系统使用Docker搭建MongoDB结合内网穿透实现公网连接

    本文主要介绍如何在Linux Ubuntu系统使用Docker快速部署MongoDB,并结合cpolar内网穿透工具实现公网远程访问本地数据库。 MongoDB服务端可以运行在Linux、Windows、MacOS平台,可以存储比较复杂的数据类型,支持的查询语言非常强大,几乎可以实现类似关系数据库单表查询的绝大部分

    2024年03月26日
    浏览(57)
  • 在k8s 中部署有状态服务MongoDB高可用集群详解(附带镜像)

    🐇明明跟你说过:个人主页 🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅 🔖行路有良友,便是天堂🔖 目录 一、前言  1、k8s简介 2、MongoDB介绍 3、为什么要使用MongoDB  4、Mongodb高可用方案  二、环境准备 1、k8s集群搭建 2、MongoDB镜像准备 3、NFS存储准备 4、PV准

    2024年04月16日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包