知识储备

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. 如何看配置成功或者失败的相关信息也是需要不断提升的地方,借此机会将每部分对应的结果图分析都做了一个简明扼要的提示,也有利于加深对项目的理解。
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐