docker搭建mongodb单节点副本集的实现

目录
  • 背景
  • 启动步骤
  • 可能遇到的问题
  • 解决办法

背景

在开发中,我们很容易通过docker启动一个普通的mongodb数据库服务。但是有时候为了保持与线上环境一致,或者为了利用mongodb副本集的某些特性,我们需要在本地部署mongodb副本集。副本集往往需要启动多个mongodb服务作为副本集成员,而通常用于开发的笔记本资源比较有限。鉴于此,官方文档给了解决办法,可以直接将一个单节点mongodb服务转换为单节点副本集(standlone replica set)(https://www.mongodb.com/docs/manual/tutorial/convert-standalone-to-replica-set/)

启动步骤

按照官方文档的说明,如果利用docker部署服务,那么依次有如下步骤:

  • 第一步, 假如已经存在一个运行中的普通mongodb容器服务。此时,需要关闭服务,并通过指定--replSet参数重启该服务或者重新启动一个新的mongodb容器。

    假如mongodb的服务名及容器名均为mongodb_rs,运行端口映射为27017:27017,副本集名称为rs0,数据存储目录指定为/srv/mongodb/db0,数据卷挂载目录为./data:/srv/mongodb/db0。那么docker-compose.yaml 文件可编写如下:

    version: "3"
    services:
      mongodb_rs:
        network_mode: bridge
        container_name: mongodb_rs
        image: mongo:latest
        ports:
          - "27017:27017"
        restart: always
        # environment:
        #   MONGO_INITDB_ROOT_USERNAME: username
        #   MONGO_INITDB_ROOT_PASSWORD: pwd
        command: mongod --port 27017 --replSet rs0 --dbpath /srv/mongodb/db0
        volumes:
          - ./data:/srv/mongodb/db0
  • 第二步,执行如下命令启动mongodb服务
    docker-compose up -d mongodb_rs
  • 第三步,进入容器mongosh,执行初始化副本集命令
    docker exec -it mongodb_rs mongo
    # mongosh
    rs.initiate()
    
    # ---
    # > rs.initiate()
    # {
    #	 "info2" : "no configuration specified. Using a default configuration for the set",
    #	 "me" : "f76081e20602:27017",
    #	 "ok" : 1
    # }
    # rs0:SECONDARY>
    # rs0:PRIMARY>|
  • 第四步,退出容器,容器服务正常运行

可能遇到的问题

按照上述步骤执行后,通常情况下容器服务可以正常运行,应用程序可以正常进行连接,到这里基本就成功了。以golang代码测试:

package main

import (
	"context"
	"fmt"
	"log"

	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
)

func main() {
	clientOpts := options.Client().ApplyURI("mongodb://localhost:27017/?replicaSet=rs0")
	client, err := mongo.Connect(context.TODO(), clientOpts)
	if err != nil {
		log.Fatal(err)
	}
	colls, _ := client.Database("admin").ListCollectionNames(context.TODO(), bson.M{})
	fmt.Printf("colls: %v\n", colls)
}
// colls: [system.keys system.version]

但是有时候可能会出现本地程序代码无法连接副本集服务,控制台会报类似连接错误的问题,报错的原因在于副本集无法识别成员host

在单节点副本集下,本机既是主也是从,在容器的mongo shell中可进行查看, members只有一个成员,其name"f76081e20602:27017", 所以如果你遇到无法连接或者其他类似错误,根本原因在于本地启动的这个副本集无法识别f76081e20602这个host

rs.status()
---
rs0:PRIMARY> rs.status()
{
	"set" : "rs0",
	"date" : ISODate("2022-05-06T18:59:21.417Z"),
# ...
	"members" : [
		{
			"_id" : 0,
			"name" : "f76081e20602:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 1433,
			"optime" : {
				"ts" : Timestamp(1651863555, 1),
				"t" : NumberLong(1)
			},
		# ...
		}
	],
# ...
}

解决办法

曾经遇到上述问题,百度csdn上有多篇内容一样的文章,都说这种情况需要将应用程序也通过容器进行启动,并将应用程序与mongdb副本集服务置于同一个docker网络中,就可以正常连接了。这样做确实也可行,但似乎过于麻烦了,有点走歪路的感觉。

从上述内容已经知道是副本集成员host的识别问题,那么在初始化mongodb副本集时,我们可以显式的去指定成员host,不使用默认的副本集配置。具体而言,将启动步骤中的第三步更改为:

  • 进入mongosh

    docker exec -it mongodb_rs mongo
  • 自定义配置
    # mongosh
    conf = {
       _id : "rs0",
       members: [
          { _id: 0, host: "<本机ip地址>:27017" },
       ]
    }
  • 初始化副本集
    # mongosh
    rs.initiate(conf)

如此,通过指定成员ip,mongo单节点副本集就可以准确的识别到副本集成员,对于多节点副本集如果出现连接问题,此方法同样适用。

到此这篇关于docker搭建mongodb单节点副本集的实现的文章就介绍到这了,更多相关docker搭建mongodb单节点副本集内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Docker 部署 MongoDB容器的方法

    目录 Docker是什么 部署 1. 拉取镜像 2. 查看镜像 3. 运行容器 4. 创建用户 5. 连接 DB 6. UI Docker是什么 " Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口." MongoDB 是一个免费的开源跨平台面向文档的 NoSQL 数据库程序. 下面给大家介绍Docker 部署 MongoDB的详细教程

  • 如何使用Docker安装一个MongoDB最新版

    1 安装 本文假设大家已经安装好了docker并能正常使用,所以不讲解如何安装docker了.用docker安装MongoDB最新版本如下: # 从repository查找mongo的相关镜像,结果很多,其中第一条为官方的镜像 $ docker search mongo # 下载官方镜像的最新版本 $ docker pull mongo:latest # 完成后,检查是否下载成功 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE cento

  • docker-compose搭建mongodb、mysql的详细过程

    下面看下docker-compose搭建mongodb.mysql的详细方法,内容如下所示: version: '3' services: mysqldbservice: image: 'mysql:latest' restart: always container_name: mysqlcontainer volumes: - ./data:/var/lib/mysql - ./my.cnf:/etc/mysql/my.cnf - ./init:/docker-entrypoint-initd

  • docker中使用mongodb数据库详解(在局域网访问)

    前言 有了docker,基本上就告别了各种软件.数据库的安装,直接从镜像库pull下来,爽,想想以前那真是一个遭罪啊. 这文章就来看一下如何跑mongo的docker镜像,并且可以在局域网访问,内容相对简单,也是记录我的自学过程. 第一步 获得mongo镜像,命令如下, # 拉取mongo镜像 docker pull mongo # 查看本地库mongo镜像 docker images mongo 第二步 启动mongo镜像,如下 # 启动mongo镜像 docker run -itd -P -

  • Docker mongoDB 4.2.1 安装并收集springboot日志的步骤详解

    一:docker安装好mongodb 第一步:docker安装好mongodb [root@iZbp1gp1t778obaz5m8vk8Z /]# docker search mongo [root@iZbp1gp1t778obaz5m8vk8Z /]# docker pull mongo:latest Trying to pull repository docker.io/library/mongo ... latest: Pulling from docker.io/library/mong

  • Docker连接mongodb实现过程及代码案例

    容器启动后 先登录admin,创建一个新用户 $ docker exec -it mongo mongo admin # 创建一个名为 admin,密码为 123456 的用户. >db.createUser({user:"duser",pwd:"test1mongodb23","roles" : [{"role" : "dbAdmin","db" : "cpeduclo

  • Docker 搭建集群MongoDB的实现步骤

    前言 由于公司业务需要,我们打算自己搭建 MongoDB 的服务,因为 MongoDB 的云数据库好贵,我们这次采用副本集的方式来搭建集群,三台服务器,一主.一副.一仲裁 基本概念 Replica Set 副本集:一个副本集就是一组 MongoDB 实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成 主节点(master):主节点接收所有写入操作.主节点将对其数据集所做的所有更改记录到其 oplog. 副节点(secondary):复制主节点的 oplog

  • 在Docker中使用mongodb数据库的实现代码

    获取 mongo 镜像 sudo docker pull mongo 运行 mongodb 服务 sudo docker run -p 27017:27017 -v /tmp/db:/data/db -d mongo 运行 mongodb 客户端 sudo docker run -it mongo mongo --host <宿主机IP地址> --port 27017 > show dbs admin 0.000GB config 0.000GB local 0.000GB > u

  • docker搭建mongodb单节点副本集的实现

    目录 背景 启动步骤 可能遇到的问题 解决办法 背景 在开发中,我们很容易通过docker启动一个普通的mongodb数据库服务.但是有时候为了保持与线上环境一致,或者为了利用mongodb副本集的某些特性,我们需要在本地部署mongodb副本集.副本集往往需要启动多个mongodb服务作为副本集成员,而通常用于开发的笔记本资源比较有限.鉴于此,官方文档给了解决办法,可以直接将一个单节点mongodb服务转换为单节点副本集(standlone replica set)(https://www.m

  • mongodb 4.0副本集搭建的全过程

    前言 近期有同学问mongodb副本集难不难部署,我的回答是不难,很快,几分钟搞定,比mysql MHA简单的不止一点半点. 那么到底如何部署呢?请看下文. 1.  准备工作 1.1 下载软件 选择版本并下载mongodb的软件,注意操作系统版本等.本次我选用的是percona分支的mongodb 4.2.8版本搭建,操作系统为centos6 cd /usr/local/ wget https://www.percona.com/downloads/percona-server-mongodb-

  • MongoDB 复制(副本集)学习笔记

    本文实例讲述了MongoDB 复制(副本集).分享给大家供大家参考,具体如下: replication set复制集, 复制集,多台服务器维护相同的数据副本,提高服务器的可用性. MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允许您从硬件故障和服务中断中恢复数据. 设置过程: (1)创建示例 假设创建三台,创建三个实例目录和日志目录: mkdir /home/m17 /home/m

  • 如何为MongoDB添加分片副本集

    背景是这样的:线上一个MongoDB集群保存了很多历史数据,这些历史数据是按照时间字段进行分片的,最近到了2021年,有些分片的截止时间要到了,为了能容纳更多的数据,需要在当前分片的基础上增加相应的分片. 线上环境中,每个分片本身也是一个3副本的副本集,所以添加的时候有些特定的流程需要注意,我再测试环境中简单测了一下这个过程,记录下来. 整个过程大概的流程是: 1.新建分片副本集 2.使用addShard命令将分片副本集添加到集群中 3.使用addShardTag命令为分片打标签 4.使用add

  • linux系统下MongoDB单节点安装教程

    前言 MongoDB是一个高性能.开源.无模式的.基于分布式文件存储的文档型数据库,相信对大家都不陌生,这里就不过多介绍了,本文主要介绍了关于mongo单节点(linux下)的安装教程,分享出来供大家参考学习,下面话不多说了,来一起看看详细的安装过程吧. 安装包 下载地址: (https://www.mongodb.com/download-center) 用户权限/目录 1.创建 dbuser用户 groupadd dbgroup useradd dbuser -m -d /home/dbus

  • Mongodb 副本集搭建问题总结及解决办法

    Mongodb 副本集搭建问题总结及解决办法 Mongodb数据库的副本集是由多台服务器组成,基中一台是主节点,其它为从节点,如果主节点宕机就自动切换到任意一个从节点.如果以前的主节点修复完成和正常运行就自动变成从节点,从节点不能查询数据.也可以在一台服务器装多个Mongodb端口不一样. 在我以往的认知中,一个系统一旦正式上线,多半不会轻易的迁移服务器,尤其是那种涉及到多个关联应用,涉及到多台硬件服务器的系统,因为这种迁移将是牵一发而动全身的. 但是,却仍然有这种情况存在,就如我这几天主要负责

  • MongoDB 副本集的搭建过程

    今天的内容说下副本集的搭建过程吧. 下面的例子,是我自己在一台腾讯云服务器上搭建的过程,每个操作步骤都有,写出来大家看看. 本次操作是搭建一主,一从.一仲裁的三节点副本集,具体的过程如下: 1.创建节点目录 mkdir -p /data/mongo_28018/{data,log} mkdir -p /data/mongo_28019/{data,log} mkdir -p /data/mongo_28020/{data,log} 2.创建配置文件,配置文件内容如下: storage:   db

  • Kafka单节点伪分布式集群搭建实现过程详解

    Kafka集群搭建分为单节点的伪分布式集群和多节点的分布式集群两种,首先来看一下单节点伪分布式集群安装.单节点伪分布式集群是指集群由一台ZooKeeper服务器和一台Kafka broker服务器组成,如下图所示: 为了搭建单节点Kafka集群,需要依次安装如下软件:安装Java-->安装ZooKeeper-->安装Kafka. 一.安装Java 可以参考linux安装jdk,来进行安装 二.安装ZooKeeper 下载地址:https://www-us.apache.org/dist/zoo

  • mongodb使用docker搭建replicaSet集群与变更监听(最新推荐)

    目录 安装环境 docker方式mongodb集群安装 目录与key准备 运行mongodb 配置节点 官方客户端验证 变更监听 在mongodb如果需要启用变更监听功能(watch),mongodb需要在replicaSet或者cluster方式下运行. replicaSet和cluster从部署难度相比,replicaSet要简单许多.如果所存储的数据量规模不算太大的情况下,那么使用replicaSet方式部署mongodb是一个不错的选择. 安装环境 mongodb版本:mongodb-6

随机推荐