【赵渝强老师】部署MongoDB复制集

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
简介: 本文介绍了如何在单个节点上搭建MongoDB复制集环境,通过监听不同端口实现多节点配置。详细步骤包括创建数据目录、编辑配置文件、启动节点、初始化复制集、查看状态以及测试主从库的读写操作。文中还提供了视频讲解和代码示例,帮助读者更好地理解和操作。

b074.png

在了解到了MongoDB复制集的体系架构以后,下面将通过具体的步骤来演示如何搭建单个节点的MongoDB复制集环境。下表列举了MongoDB复制集的配置信息。


提示:上表在一台主机上通过监听不同的端口来搭建MongoDB复制集环境,也可以使用三台主机来搭建。

   

视频讲解如下:

   

下面是具体的搭建步骤:


(1)创建MongoDB复制集每个节点数据存储的目录。

mkdir -p /data/primary/
mkdir -p /data/slave01/
mkdir -p /data/slave02/


(2)编辑主库的配置文件/data/primary/mongo_primary.conf。

dbpath=/data/primary/ 
port=27017 
fork=true
logpath=/data/primary/primary.log
replSet=mycluster

提示:在搭建MongoDB复制集环境时,最重要的参数就是replSet。该参数将用于标识该节点从属的复制集信息。


(3)编辑第一个从库的配置文件/data/slave01/mongo_slave01.conf。

dbpath=/data/slave01/ 
port=27018
fork=true
logpath=/data/slave01/slave01.log
replSet=mycluster


(4)编辑第二个从库的配置文件/data/slave02/mongo_slave02.conf

dbpath=/data/slave02/ 
port=27019
fork=true
logpath=/data/slave02/slave02.log
replSet=mycluster


(5)使用mongod命令启动每个节点。

mongod --config /data/primary/mongo_primary.conf
mongod --config /data/slave01/mongo_slave01.conf 
mongod --config /data/slave02/mongo_slave02.conf


(6)确定MongoDB实例监听的地址信息。

netstat -ntulp | grep mongod

# 输出的信息如下:
tcp 0 0 127.0.0.1:27019  0.0.0.0:*  LISTEN      46922/mongod        
tcp 0 0 127.0.0.1:27017  0.0.0.0:*  LISTEN      46804/mongod        
tcp 0 0 127.0.0.1:27018  0.0.0.0:*  LISTEN      46868/mongod


(7)使用mongoshell登录其中的一个MongoDB数据库实例。

mongo


(8)查看复制集的状态。

> rs.status()

# 输出的信息如下:
{
  "ok" : 0,
  "errmsg" : "no replset config has been received",
  "code" : 94,
  "codeName" : "NotYetInitialized"
}

提示:MongoDB复制集在使用前需要先执行初始化。


(9)创建复制集的配置信息,将各个节点添加到复制集配置信息中。

> cfg = {"_id":"mycluster",
     "members":[{"_id":0,"host":"127.0.0.1:27017"},
          {"_id":1,"host":"127.0.0.1:27018"},
          {"_id":2,"host":"127.0.0.1:27019"}]}


(10)执行复制集的初始化

> rs.initiate(cfg)


(11)查看副本集的状态。

> rs.status()

# 输出的信息如下:
{
  "set" : "mycluster",
  "date" : ISODate("2022-04-06T04:03:05.729Z"),
  "myState" : 2,
  "term" : NumberLong(0),
  "syncSourceHost" : "",
  "syncSourceId" : -1,
  "heartbeatIntervalMillis" : NumberLong(2000),
  "majorityVoteCount" : 2,
  "writeMajorityCount" : 2,
  "votingMembersCount" : 3,
  "writableVotingMembersCount" : 3,
  ......
  "members" : [
    {
      "_id" : 0,
      "name" : "127.0.0.1:27017",
      "health" : 1,
      "state" : 2,
      "stateStr" : "SECONDARY",
      "uptime" : 603,
      "optime" : {
        "ts" : Timestamp(1649217783, 1),
        "t" : NumberLong(-1)
      },
    ......
    },
    {
      "_id" : 1,
      "name" : "127.0.0.1:27018",
      "health" : 1,
      "state" : 2,
      "stateStr" : "SECONDARY",
      "uptime" : 2,
      "optime" : {
        "ts" : Timestamp(1649217783, 1),
        "t" : NumberLong(-1)
      },
      "optimeDurable" : {
        "ts" : Timestamp(1649217783, 1),
        "t" : NumberLong(-1)
      },
    ......
    },
    {
      "_id" : 2,
      "name" : "127.0.0.1:27019",
      "health" : 1,
      "state" : 2,
      "stateStr" : "SECONDARY",
      "uptime" : 2,
      "optime" : {
        "ts" : Timestamp(1649217783, 1),
        "t" : NumberLong(-1)
      },
      "optimeDurable" : {
        "ts" : Timestamp(1649217783, 1),
        "t" : NumberLong(-1)
      },
    ......
    }
  ],
  "ok" : 1,
  ......
}

提示:输出的三个节点信息包含以下的字段信息:

"stateStr" : "SECONDARY",

这说明MongoDB复制集正在执行选举的操作,此时的三个节点都是从库。


(12)等待一段时间,再次查看副本集的状态。


> rs.status()

# 输出的信息如下:
......
"members" : [
  {
    "_id" : 0,
    "name" : "127.0.0.1:27017",
    "health" : 1,
    "state" : 1,
    "stateStr" : "PRIMARY",
    "uptime" : 961,
    ......
  },
  {
    "_id" : 1,
    "name" : "127.0.0.1:27018",
    "health" : 1,
    "state" : 2,
    "stateStr" : "SECONDARY",
    "uptime" : 360,
    ......
  },
  {
    "_id" : 2,
    "name" : "127.0.0.1:27019",
    "health" : 1,
    "state" : 2,
    "stateStr" : "SECONDARY",
    "uptime" : 360,
    ......
  }
],
......

提示:MongoDB复制集经过选举后,27017的节点被选举成了主库,而27018和27019的节点成为了从库。


(13)在主库上创建一个集合并插入一条文档。

> use demo
> db.test1.insert({name:'Tom'})


(14)在主库上查询文档。

> db.test1.find()

# 输出的信息如下:
{ "_id" : ObjectId("624d13bc587b73632da622ce"), "name" : "Tom" }


(15)使用mongoshell登录到其中一个从库上,并查看数据库信息。

mongo --port 27018
> show dbs

# 输出的错误信息如下:
......
uncaught exception: Error: listDatabases failed:{
  "topologyVersion" : {
    "processId" : ObjectId("624d0ea30b93b269b4c404d6"),
    "counter" : NumberLong(4)
  },
  "ok" : 0,
  "errmsg" : "not master and slaveOk=false",
  "code" : 13435,
  "codeName" : "NotPrimaryNoSecondaryOk",
  "$clusterTime" : {
    "clusterTime" : Timestamp(1649218594, 1),
    "signature" : {
      "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
      "keyId" : NumberLong(0)
    }
  },
  "operationTime" : Timestamp(1649218594, 1)
} :
......

提示:在默认情况下,MongoDB复制集的从库是不可用的,需要手动启用从库。


(16)启用从库并查看数据库信息。

> rs.slaveOk()
> show dbs

# 输出的信息如下:
admin   0.000GB
config  0.000GB
demo    0.000GB
local   0.000GB


(17)查看demo数据库中的集合。

> use demo
> db.test1.find()


(18)在从库上插入一条新的文档。

> db.test1.insert({name:'Mary'})

# 输出的错误信息如下:
WriteCommandError({
  "topologyVersion" : {
    "processId" : ObjectId("624d0ea30b93b269b4c404d6"),
    "counter" : NumberLong(4)
  },
  "ok" : 0,
  "errmsg" : "not master",
  "code" : 10107,
  "codeName" : "NotWritablePrimary",
  "$clusterTime" : {
    "clusterTime" : Timestamp(1649221014, 1),
    "signature" : {
      "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
      "keyId" : NumberLong(0)
    }
  },
  "operationTime" : Timestamp(1649221014, 1)
})

提示:在MongoDB复制集的环境中从库是只读的状态。




相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
NoSQL MongoDB
MongoDB-复制集搭建
在安装目录下新建 data/conf/log 3个文件夹,在conf文件夹下新建 mongo.config,在mongo.config中配置如下内容:
85 0
|
17小时前
|
存储 NoSQL MongoDB
【赵渝强老师】MongoDB复制集的体系架构
MongoDB的复制集是一种集群技术,由一个Primary节点和多个Secondary节点组成,实现数据的高可用性。Primary节点处理写入请求,Secondary节点同步数据。当Primary节点故障时,Secondary节点可通过选举成为新的Primary节点。视频讲解和示意图详见正文。
|
17小时前
|
存储 NoSQL MongoDB
【赵渝强老师】MongoDB复制集中的成员
MongoDB复制集通常由一个主库和两个从库组成,可选添加仲裁者。主库负责所有写操作并记录Oplog日志,从库异步同步主库的Oplog日志并应用操作。仲裁者不存储数据,主要用于保证复制集中成员数量为奇数,参与选举投票。视频讲解详见B站链接。
|
6月前
|
监控 NoSQL 安全
【MongoDB 专栏】MongoDB 的复制集:高可用性配置
【5月更文挑战第10天】MongoDB的复制集是实现数据高可用性的重要机制,由主节点和次节点构成,主节点处理写操作,次节点同步数据确保一致。在主节点故障时,次节点自动提升接替,保证服务不间断。通过复制集,可实现数据保护、持续服务,适用于关键业务系统和数据备份。配置时需关注网络稳定性、节点性能和数据一致性。案例显示,复制集能有效保障服务高可用,防止数据丢失和业务中断,是现代数据库管理的关键工具。在数据驱动的世界,复制集为高可用性提供了坚实保障。
137 0
【MongoDB 专栏】MongoDB 的复制集:高可用性配置
|
存储 NoSQL 数据处理
MongoDB-复制集开篇
MongoDB 高可用性 • 如果所有用户都从同一台MongoDB服务器上读写数据, 那么如果这台MongoDB服务器宕机了, 用户就不能进行读写了 • 如果我们有多台MongoDB服务器, 并且每台服务器中存储的内容都相同,那么即使有一台服务器宕机了, 用户依然可以进行读写数据, 因为用户还可以继续使用其它保存了相同内容的服务器
65 0
|
NoSQL 算法 Linux
MongoDB学习笔记(五) 集群搭建之副本集
MongoDB学习笔记(五) 集群搭建之副本集
408 0
|
NoSQL Linux MongoDB
部署MongoDB复制集群(最全)
部署MongoDB复制集群(最全)
488 0
部署MongoDB复制集群(最全)
|
运维 监控 NoSQL
【MongoDB训练营】第三课:复制集使用及原理介绍 答疑汇总
【MongoDB训练营】第三课:复制集使用及原理介绍 答疑汇总
511 0
|
存储 缓存 NoSQL
|
NoSQL 网络协议 Shell
下一篇
无影云桌面