我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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单节点副本集内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

mongodb副本集搭建的步骤是什么

搭建MongoDB副本集的步骤如下:安装MongoDB:在每台服务器上安装MongoDB,并确保MongoDB服务正常运行。配置每个节点:在每个节点的MongoDB配置文件中指定副本集的名称、节点的IP地址、端口号等信息。启动第一个节点:选
mongodb副本集搭建的步骤是什么
2024-04-17

Docker-Compose搭建Redis集群的实现教程

目录1. 集群配置2.编写Redis.conf3. 在每个redis-*文件夹下创建redis.conf文件,并写入如下内容:4.编写docker-compose.yml文件5.开启集群6.测试6.1 查看节点属性6.2 查看节点信息6.3
2023-03-24

MongoDB与云计算的融合实践:从单节点到分布式集群

近年来,云计算技术的快速发展和普及,为企业带来了革命性的数据处理方式和存储方案。而在云计算之中,NoSQL 数据库 MongoDB 也备受青睐,其支持高并发、可伸缩性好等特点,使其广受欢迎。但是,单节点 MongoDB 实例仅能满足小规模应
MongoDB与云计算的融合实践:从单节点到分布式集群
2023-11-02

docker搭建redis主从哨兵集群的实现步骤

目录1:获取Redis镜像2:创建redis主从+哨兵docker-compose文件3:redis配置和哨兵配编程置说明4:启动docker-compose5:查看启动情况6:进入主节点查看集群情况本文以docker-compose 搭建
2022-07-10

docker搭建redis三主三从集群的实现步骤

目录一 准备Redis镜像、容器1.1 下载redis6.0.81.2 准备6台服务器配置文件1.3 创建6台redis容器二 创建主从集群关系2.1 进入任意一台redis容器2.3 查看集群状态三 主从容错切换迁移案例3.1 数据读写存
2022-08-17

docker搭建redis哨兵集群并且整合springboot的实现

目录1、创建两个文件夹Redis和sentinel文件夹用于存放docker-compose.yml文件2、redis下的docker-compose.yml3、sentinel下的docker-compose.yml文件以及sentine
2022-07-11

Pytorch搭建简单的卷积神经网络(CNN)实现MNIST数据集分类任务

这篇文章主要介绍了Pytorch搭建简单的卷积神经网络(CNN)实现MNIST数据集分类任务,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-03-23

编程热搜

目录