目录

  • 知识储备
    • 1.为什么我们需要搭建副本集模式呢?
    • 2.副本集成员构架
  • 应用目标
  • 实践步骤
    • 一、部署副本集
      • 1. 创建数据目录
      • 2. 启动副本集
      • 3. 关闭MongoDB服务
      • 4.登录mongod实例
      • 5. 创建副本集配置对象rsconf
      • 6. 初始化副本集
      • 7. 查看副本集成员状态
      • 8. 判断是否为主节点
    • 二、验证副本集数据的一致性
      • 1. 主节点添加数据
      • 2. 副节点查看数据
    • 三、移除一台服务器
    • 四、 添加一台服务器
    • 五、 故障转移
    • 六、 调整副本优先级
    • 七、配置隐藏节点
    • 八、配置延迟节点
    • 九、配置副本集投票权
  • 写在最后

知识储备

1.为什么我们需要搭建副本集模式呢?

MongoDB独立模式可以简单且快速的构建MongoDB数据库系统,然而独立模式存在弊端,即一旦MongoDB发生宕机,将会面临数据丢失的风险,这在生产环境中是不允许发生的,此时我们可以利用MongoDB提供的高可用机制,即复制。

MongoDB支持两种复制类型:传统的主/从复制副本集,副本集可以理解为传统主/从复制的一种复杂形
式 , 支持自动故障恢复功能 , 拥有更高的可用性 。

2.副本集成员构架


客户端程序(Client Application)通过驱动器(Driver)连接副本集主节点(Primary)进行读写操作,当主节点数据副本发生变化,此时副本节点(Secondary)通过Replication(复制)同步主节点的数据副本,使副本集中副本节点与主节点存储相同数据副本

副本集中的各节点还会通过传递心跳信息(Heartbeat)来检测各自的健康状态。当主节点故障时,拥有投票权的副本节点和仲裁节点(Arbiter)会触发一次新的选举操作,并从副本节点中选举出新的主节点,以确保副本集正常运行。

应用目标

学习回顾完上述基础知识框架以后,我们有了更明确的实践目标。知道我们接下来要实践的内容从哪里来,到哪里去,要完成具体哪个任务。此篇博文主要记录如何在本机完成MongoDB副本集的部署。

实践步骤

一、部署副本集

1. 创建数据目录

打开dos窗口 (win+R)
创建如下三个文件夹 : 为每个成员创建必要的数据目录

mkdir d:\srv\mongodb\rs0-0
mkdir d:\srv\mongodb\rs0-1
mkdir d:\srv\mongodb\rs0-2

执行完上述操作之后,会在d:\srv\mongodb\目录下创建rs0-0、rs0-1和\rs0-2三个文件夹。

相应文件夹路径下具体结果如图所示:

2. 启动副本集

First memeber: 新打开一个dos窗口执行如下命令(以管理员身份打开):

C:\WINDOWS\system32> mongod --replSet rs0 --port 27017 --dbpath d:\srv\mongodb\rs0-0

Second member: 再新打开一个dos窗口 执行如下命令(以管理员身份打开):

C:\WINDOWS\system32> mongod --replSet rs0 --port 27019 --dbpath d:\srv\mongodb\rs0-1

Third member: 再次新打开一个dos窗口 执行如下命令(以管理员身份打开):

C:\WINDOWS\system32>mongod --replSet rs0 --port 27020 --dbpath d:\srv\mongodb\rs0-2

这将以名为rs0的副本集的成员的身份启动每个实例,
每个实例运行在不同的端口上(27017,27019,27020),
并使用 --dbpath设置指定数据目录的路径

3. 关闭MongoDB服务

  1. 任务栏搜索服务和应用程序,找到相应位置
  2. 选择MongoDB服务,单击将服务手动关闭

4.登录mongod实例

通过mongo shell连接到mongod实例之一,通过指定其端口号来指示哪个实例
(采用cmd打开mongodb服务需要提前配置环境变量,没有相应概念的小伙伴找找其他资料; 也可以直接打开找到mongo.exe文件所在位置打开mongo shell)

这里采用第一种方式:直接使用cmd连接mongo客户端

C:\WINDOWS\system32>mongo --port 27020

运行结果如下:

5. 创建副本集配置对象rsconf

>rsconf = { _id: "rs0", members: [ {  _id: 0, host: "127.0.0.1:27017"  },  {_id: 1, host: "127.0.0.1:27019"}, {  _id: 2, host: "127.0.0.1:27020" }]}

运行结果如下:
_id 为rs0
members共有三个副本集节点(注意仔细查看运行信息:标注了三个端口情况)

6. 初始化副本集

使用rs.initiate()初始化副本集,然后将rsconf文件传递给rs.initiate()

> rs.initiate(rsconf)

运行结果如下:
ok:1 表示初始化成功

7. 查看副本集成员状态

  1. 主节点查看成员状态:
rs0:PRIMARY> rs.status()

部分结果如下:

  1. 副节点查看成员状态:
rs0:SECONDARY> rs.status()

部分结果如下:

8. 判断是否为主节点

如何判断主节点和辅助节点 : db.isMaster()

 rs0:PRIMARY> db.isMaster()
  • hosts标注三个副本集结点的端口号
  • primary指明主节点
  • me指明当前端口所对应的节点


至此,本机环境的MongoDB副本集部署完成,接下来我们需要使用副本集完成数据一致性的检验以及其他配置。

二、验证副本集数据的一致性

1. 主节点添加数据

向主节点添加一条数据,查看辅助接点是否也有此条数据
(按照上述的配置,主节点的端口是27020,此端口是随机的可能存在差异)

  1. 使用admin数据库
rs0:PRIMARY> db
rs0:PRIMARY> use admin

  1. 给变量p赋值
rs0:PRIMARY> p={"ammeterId" : "110004217635", "rulerCode" : "04000102", "dataItem" : "193710", "terminalTime" : "2019-06-20 19:29:51", "storageTime" : "2019-06-21 10:30:12" }

  1. 插入变量p
rs0:PRIMARY> db.zt.insert(p)

  1. 查找对应记录
rs0:PRIMARY>db.zt.find().pretty()

2. 副节点查看数据

新开一个dos窗口,登录到辅助节点
查看辅助节点(27019)是否有主节点(27020)插入的数据

C:\WINDOWS\system32> mongo --port  27019

运行结果如下:

同理执行主节点上述操作:

rs0:SECONDARY> db

test

rs0:SECONDARY> use admin

switched to db admin

rs0:SECONDARY> db.zt.find()

{
“_id” : ObjectId(“6198e49b2614961bf6baa4aa”),
“ammeterId” : “110004217635”,
“rulerCode” : “04000102”,
“dataItem” : “193710”,
“terminalTime” : “2019-06-20 19:29:51”,
“storageTime” : “2019-06-21 10:30:12”
}

特别想强调一点,在查询数据的过程中会遇到一个错误:
报错信息及解决方法在结果图中给出:

db.getMongo().setSecondaryOk()

三、移除一台服务器

移除27019这个辅助节点,删除服务必须在admin数据库下,在执行下面操作之前,先执行 use admin操作。然后执行以下操作:

  1. 关闭副节点

  1. 此时在主节点上查看状态rs.status()是会看到一些辅助节点的错误信息的如下
  2. 连接到主节点mongoshell
    执行以下命令来移除该成员 rs.remove(“127.0.0.1:27019”)
  3. 此时再在主节点查看副本集状态信息,则不会有辅助节点的错误信息 。表明删除辅助节点(移除一台服务器)成功
    如图所示只存在两个端口,不存在27019端口相关信息。

四、 添加一台服务器

将一个新的活跃成员添加到副本集,就像处理其他成员一样

  1. 首先打开一个新的命令提示符并且创建数据目录, (新成员的端口为 27019)
C:\WINDOWS\system32>mongod --replSet rs0 --port 27019 --dbpath d:\srv\mongodb\rs0-1

2.连接到主节点(27020)的mongoshell控制台,将这个新成员添加到副本集 rs.add("127.0.0.1:27019")

3. 查看副本集状态信息 rs.status()
如图所示:新添加节点id为3 端口号为27019

五、 故障转移

移除当前主节点27020观察故障转移,首先执行use admin,然后执行以下操作。

  1. 连接到mongo实例通过mongo+27020
    执行以下命令 db.shutdownServer()
  2. 此时,主节点27020的服务已经关闭,然后查询剩下的副节点的状态,从结果看27017变成了新的主节点。
  3. 重新添加27020节点,发现27020变成副节点。

具体操作原理和步骤参照如何添加新节点:
主节点添加新的副本集节点

查看节点信息:
id为4 端口号为27020 端口状态为secondary

六、 调整副本优先级

rs0:PRIMARY> con=rs.conf()
  • 所有节点默认优先级为1

  • 修改27019端口的优先级为2
rs0:PRIMARY>con.members[1].priority = 2

  • 然后将优先级的操作应用到副本集,之后会发现27019变成了主节点
rs0:PRIMARY> rs.reconfig(con)

七、配置隐藏节点

  1. 将副本集配置信息赋值到变量con。
rs0:PRIMARY> con=rs.conf()


2. 设置服务器中副本节点(27020)的优先级为0

3. 设置服务器中副本节点为隐藏节点

4. 将调整副本集成员的操作应用到副本集

5. 验证隐藏节点信息(27020端口的hidden属性修改为true)

八、配置延迟节点

延迟节点是副本节点的另一种表现形式,它代表此节点的数据与主节点的数
据有一定的延迟同步,通过设定一个延迟的属性来确定。实现延迟副本节点的前
提是该节点为隐藏节点。

  1. 将副本集配置信息赋值到变量cfg
rs0:PRIMARY> cfg = rs.conf()
  1. 设置延迟时间为3600秒
rs0:PRIMARY> cfg.members[2].slaveDelay =3600
  1. 将调整副本集成员的操作应用到副本集

九、配置副本集投票权

副本集中允许有七个拥有投票权的成员,配置副本集成员拥有投票权需要修
改参数votes的值为1,如修改值为0则代表该成员不具备投票权,默认情况下在
副本集中创建的成员都具备投票权,即votes的值为1。

  1. 将副本集配置信息赋值到变量cfg
cfg = rs.conf()
  1. 设置端口27020中隐藏节点的投票权设置为0,即不可投票
cfg.members[2].votes = 0
  1. 将调整副本集成员的操作应用到副本集
rs.reconfig(cfg)

写在最后

  1. 本次实践反反复复折腾了好几个轮回,理清实践所需的知识框架和目的之后对实践的理解更深刻,也知道从哪里来,到哪里去,更明白我在完成什么样的一个小目标。
  2. 如何看配置成功或者失败的相关信息也是需要不断提升的地方,借此机会将每部分对应的结果图分析都做了一个简明扼要的提示,也有利于加深对项目的理解。

Mongodb本机部署副本集相关推荐

  1. MongoDB部署副本集

    本页包含内容 概览 系统需求 部署一个基于Key文件实现访问控制的副本集 x.509 内部身份验证 概述 首发于sf.gg. 原文翻译自MongoDB官方文档.我一直认为,与其从网上随便扒一些教程,不 ...

  2. MongoDB高级——复制(副本集)

    复制(副本集) 什么是复制 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,并可以保证数据的安全性 复制还允许从硬件故障和服务中断中恢复数据 为什么要复制 数据备份 数据灾 ...

  3. MongoDB(五)-- 副本集(replica Set)

    一.副本集介绍 搭建副本集是为了实现mongodb高可用. Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点.主备节点存储数据,仲裁节点不存储数据.客户 ...

  4. Mongodb sharding转换一个副本集为分片集群

    2019独角兽企业重金招聘Python工程师标准>>> 1. 部署一个测试副本集 创建第一个副本集实例,名称为firstset: 1.1 创建副本集并且插入数据如下:/data/ex ...

  5. 搭建高可用的MongoDB集群:MongoDB的配置与副本集

    在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写.海量数据高效存储.高可扩展性和高可用性这些难题.不过就是因为这些问题Nosql诞生了. NOSQL有这些优势: 大数据量,可以通过 ...

  6. 搭建高可用的MongoDB集群(一):MongoDB的配置与副本集

    传统的关系数据库具有不错的性能及稳定性,同时,久经历史考验,许多优秀的数据库沉淀了下来,比如MySQL.然而随着数据体积的爆发性增长,数据类型的增多,许多传统关系数据库扩展难的特点也爆发了出来,NoS ...

  7. mongodb一致性协议_mongodb副本集用一致性快照方法添加从节点步骤

    环境描述 主节点 192.168.0.1:27002 两个从节点 192.168.0.2:27002 192.168.0.3:27002 目标:用一致性快照方式添加第三个从节点192.168.0.3 ...

  8. mongodb带认证的副本集搭建

    Mongodb副本集带用户认证的 概述 本次实验是在一台虚拟机上做的,正式环境一定要分开实现,以免影响服务的正常使用和性能. 准备工作: 操作系统:centos7.2 Mongodb版本:3.4.1 ...

  9. MongoDB副本集(一主一备+仲裁)环境部署

    https://www.cnblogs.com/kevingrace/p/7881496.html, https://blog.csdn.net/com_it/article/details/8470 ...

最新文章

  1. [转载] 别人的心得感悟
  2. APP检测软件更新逻辑
  3. rxjs的一个例子:什么是rxjs的OperatorFunction?
  4. spring jms 事务_Spring JMS:处理事务中的消息
  5. Spring JPA数据+Hibernate+ MySQL + Maven
  6. php中队列控制的方法,学习猿地-php 队列的实现方法
  7. [转]将微信和支付宝支付的个二维码合二为一
  8. (转)编码剖析Spring管理Bean的原理
  9. 中国石化:五年要建充换电站5000座
  10. 安全漏洞整改解决方案
  11. 对于 js 性能优化的启发,debounce 和 throttle。
  12. Javascript - Cookie
  13. MacBookpro安装mysql教程_mac安装mysql的两种方法
  14. vue.js入门以及和echarts整合之柱状图和中国地图
  15. whl的文件怎么用python打开_windows - 如何使用.whl文件安装Python包?
  16. keep跑步记录伪造_Keep、悦跑圈、咕咚、悦动圈,四个跑步App比对
  17. 38241415106——胡应兰(实验一)
  18. Hbase Locality
  19. algodoo是什么意思_ooc表示的是什么意思什么梗 网络用语OOC含义
  20. 荣耀4a鸿蒙,华为 Plan B 揭开面纱:鸿蒙要超越安卓?小米 OPPO 们买单吗?

热门文章

  1. 北航 2018计算机学院排课,关于2018—2019学年秋季学期排课的通知
  2. 12 DB操作 Hibernate Panache
  3. WOBENZYMN PS REVISED 100'S
  4. 一次性查寻出全国所有省份,城市,县区(解决多层for循环嵌套查询的问题)
  5. 【基础】python-docx包之----设置段落样式(缩进/对齐/间距)
  6. html拖拽手势,h5实现手势操作放大缩小拖动等
  7. 分布式事务之Seata个人吐血整理
  8. Win10配置pytorch深度学习环境
  9. 【#不求人】天空盒模型制作
  10. 遇到“more than one device/emulator”解决方法