Mongodb 以Docker的方式部署多副本集(replSet)

本文详细介绍如何使用Docker安装并配置MongoDB 3.6版本的复制集集群,包括镜像拉取、数据目录创建、容器运行及集群初始化过程,并提供Node.js连接示例与数据同步测试方法。

准备工作:

  docker安装(如果需要,参考https://blog.youkuaiyun.com/nickDaDa/article/details/92816938

  拉取镜像(这里使用3.6版本测试)  

sudo docker pull mongo:3.6

  创建宿主机数据挂载目录 /data/mongo0  /data/mongo1  /data/mongo2

安装:

sudo docker run --name mongo0 -p 27017:27017 -v /data/mongo0/:/data/db/ -d mongo:3.6 --replSet "mongoRs" --bind_ip_all

sudo docker run --name mongo1 -p 37017:27017 -v /data/mongo1/:/data/db/ -d mongo:3.6 --replSet "mongoRs" --bind_ip_all

sudo docker run --name mongo2 -p 47017:27017 -v /data/mongo2/:/data/db/ -d mongo:3.6 --replSet "mongoRs" --bind_ip_all
sudo docker exec -it mongo0 /bin/bash 。进入到mongo0的容器内部
执行 mongo 。 连接到mongodb
执行:rs.initiate({

   _id : "mongoRs",

   members: [

      { _id: 0, host: "10.0.0.5:27017" },

      { _id: 1, host: "10.0.0.6:37017" },

      { _id: 2, host: "10.0.0.7:47017" }

   ]

});

返回OK即可,间隔10s,执行rs.status(); 可以看到集群关系

连接:

以nodejs为例,其它语言同理:

var dbclient;
var db;

// mongo config
var cfg = {
  "dbconn": "mongodb://宿主机IP:27017,宿主机IP:37017,宿主机IP:47017",
  "dbname": "db-name",
  "rsconf": {
    replicaSet: 'mongoRs',
    poolSize: 5,
    autoReconnect: true,
    useNewUrlParser: true 
  }
}

// connect
async function SetupConnection() {
  try {
    dbclient = await mongo.MongoClient.connect(cfg["dbconn"], cfg["rsconf"]);
    db = dbclient.db(cfg["dbname"]);
  } catch (error) {
    console.log(`Connect to mongodb error for ${error.message}`);
  }
}

测试:

  1. 程序连接成功之后,写入一条数据
  2. 以docker exec -it mongo0/1/2 /bin/bash 的方式分别进入三个容器,执行mongo命令连接之后查看,数据如果已经同步,则表示成功
  3. 如果在slave节点报错,不能查看,执行 rs.slaveOk(); 即可查看
要使用 Swarm 部署 MongoDB 副本,您需要遵循以下步骤: 1. 创建一个 Docker Swarm 群,并为 MongoDB 副本创建一个网络。 ``` docker network create --driver overlay mongo-net ``` 2. 在 Swarm 群上创建三个服务,每个服务都运行一个 MongoDB 实例。您需要指定适当的副本配置和网络设置。以下是一个示例 `docker-compose.yml` 文件: ``` version: &#39;3&#39; services: mongo1: image: mongo command: mongod --replSet rs0 --bind_ip_all networks: - mongo-net deploy: replicas: 1 placement: constraints: [node.role == manager] restart_policy: condition: on-failure volumes: - mongo1-data:/data/db mongo2: image: mongo command: mongod --replSet rs0 --bind_ip_all networks: - mongo-net deploy: replicas: 1 placement: constraints: [node.role == worker] restart_policy: condition: on-failure volumes: - mongo2-data:/data/db mongo3: image: mongo command: mongod --replSet rs0 --bind_ip_all networks: - mongo-net deploy: replicas: 1 placement: constraints: [node.role == worker] restart_policy: condition: on-failure volumes: - mongo3-data:/data/db volumes: mongo1-data: mongo2-data: mongo3-data: networks: mongo-net: driver: overlay ``` 在此示例中,我们正在创建三个服务,每个服务都运行一个 MongoDB 实例。这些服务都位于 `mongo-net` 网络中,并使用不同的 `placement` 约束来分别分配到 Swarm 群中的管理节点和工作节点上。 3. 在其中一个 MongoDB 实例上初始化副本。您可以使用以下命令连接到其中一个实例: ``` docker exec -it <mongo1_container_id> mongo ``` 一旦您连接到了 MongoDB 实例,您需要执行以下命令来初始化副本: ``` rs.initiate({_id: "rs0", members: [ {_id: 0, host: "mongo1:27017"}, {_id: 1, host: "mongo2:27017"}, {_id: 2, host: "mongo3:27017"} ]}) ``` 在此示例中,我们正在创建一个名为 `rs0` 的副本,并将三个 MongoDB 实例添加为成员。 4. 验证副本是否正常工作。您可以使用以下命令连接到其中一个 MongoDB 实例: ``` docker exec -it <mongo1_container_id> mongo ``` 一旦您连接到了 MongoDB 实例,您可以执行以下命令来查看副本状态: ``` rs.status() ``` 如果一切正常,您应该能够看到所有三个成员都已成功加入副本。 这样,您就可以使用 Docker Swarm 部署 MongoDB 副本了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值