返回目录

为什么用复制

为什么要使用复制呢?如果我们的数据库只存在于一台服务器,若这台服务器宕机了,那对于我们数据将会是灾难,当然这只是其中一个原因,若数据量非常大,读写操作势必会影响数据库的性能,这时候复制就显得相当重要了,因为 MongoDB 可以通过复制,实现读写分离。

复制是一种在多个服务器上同步数据的过程。通过在不同的数据库服务器上实现多个数据副本。总之,复制可以使你免受硬件故障与服务中断的影响,及时恢复数据。由于数据有多个副本,所以可以将其中一个副本用于灾难恢复、报告或备份。

复制的作用

  • 保证数据的安全性
  • 保证数据的高可用性(24*7)
  • 用户灾难恢复
  • 不需要停机维护(如备份,重建索引,压缩等任务)
  • 读写的灵活性

那么,复制是怎么实现的呢?MongoDB 用副本集实现复制的功能。副本集是一组托管同一数据集的 mongod 对象。在副本集中有三个成员:主节点(Primary)、从节点(Secondary)、仲裁节点(Arbiter)

副本集

先对副本集成员进行说明:

主节点(Primary)

提供所有增、删、查、改操作

从节点(Secondary)

可以提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到从节点上。

仲裁节点(Arbiter)

仲裁节点是一种特殊的节点,它本身并不存储数据,主要作用在于,当主节点挂掉以后,通过投票的方式决定哪个从节点成为主节点。如果没有仲裁节点,如果主节点挂掉,那么整个副本集中就没有了主节点。

那么,副本集是怎么实现主、从节点的数据同步的呢?原来,主节点上的所有操作都记录在oplog,从节点定期从主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。

  1. 副本集具有 2 个或多个节点(但一般最少需要 3 个节点)。
  2. 副本集只有一个主节点,其他全是从节点。
  3. 所有数据都是从主节点复制到从节点上的。
  4. 当发生自动故障转移或维护时,会重新推举一个新的主节点。
  5. 当失败节点恢复后,该节点重新又连接到副本集中,重新作为从节点。

下面展示一下典型的 MongoDB 复制图,客户端从主节点读取数据,在客户端写入数据到主节点时, 主节点与从节点进行数据交互保障数据的一致性。

副本集特点

  • 具有 N 个节点的集群
  • 任何节点都可能成为主节点
  • 所有写入操作必须由主节点来完成
  • 自动故障转移
  • 自动故障恢复
  • 重新推举主节点

创建副本集

1、关闭正在运行的 MongoDB 服务器

2、通过指定 --replSet 选项来启动mongoDB。--replSet 基本语法格式如下:

mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"

范例

因为没有安装虚拟机,就把 MongoDB 文件夹放在C盘、D盘、E盘、F盘,模拟放在多个服务器上。

1、先启动C盘上的 MongoDB 服务器:127.0.0.1:27017,指定端口为27017,并取副本集的名称为 "myRep"

mongod --port 27017 --dbpath c:\data\db --replSet myRep

2、然后启动D盘上的 MongoDB 服务器:127.0.0.1:27020,指定端口为27020,并取副本集的名称为 "myRep"

mongod --port 27020 --dbpath d:\data\db --replSet myRep

3、MongoDB 中用 rs.initiate() 命令初始化一个副本集,打开C盘上的 Mongo shell,输入以下命令

rs.initiate(
{
_id: "myRep",
members: [
{ _id: 0, host : "127.0.0.1:27017" },
{ _id: 1, host : "127.0.0.1:27020" }
]
}
)

4、除了用 rs.initiate() 命令初始化副本集外,MongoDB 还可以用 rs.add(HOST_NAME:PORT),给副本集添加节点。请记住,使用 rs.add() 之前,一定要用 rs.initiate() 初始化副本集,没有参数也可以。我们先启动E盘上 MongoDB 服务器:127.0.0.1:27022,指定端口为27022,并取副本集的名称为 "myRep"

mongod --port 27022 --dbpath e:\data\db --replSet myRep

5、我们用 rs.add() 命令添加一个节点。把服务连接到 主节点 上,在 Mongo shell 中输入以下命令

rs.add("127.0.0.1:27022")

6、没有仲裁节点的副本集是不完整的,MongoDB 中使用 rs.addArb(HOST_NAME:PORT) 命令添加仲裁节点。我们先启动F盘上 MongoDB 服务器:127.0.0.1:27030,指定端口为27030,并取副本集的名称为 "myRep"

mongod --port 27030 --dbpath f:\data\db --replSet myRep

7、我们用 rs.addArb() 命令添加一个仲裁节点。把服务连接到 主节点 上,在 Mongo shell 中输入以下命令

rs.addArb("127.0.0.1:27030")

8、MongoDB 可以使用 rs.status() 命令查看副本集的状态,可以清楚的看出哪个服务器是主节点,哪个服务器是从节点,哪个服务器是仲裁节点。在返回的结果中,members 文档中可以清楚的看到字段 stateStr 的值,该值标识服务器属于哪个类型的节点。通过返回结果可以看到C盘的 MongoDB 服务器是主节点。因为 status() 返回的结果太长,我就不截图了。

9、副本集已经建好了,是不是特别想试试它的奥秘啊,我们用 Mongo shell连接到主节点服务器,添加 user 集合,并添加文档

mongodb://127.0.0.1:27017   #连接主节点服务器
...db
test
myRep:PRIMARY>db.user.insert({"name":"liruihuan","age":18})

10、我们再连接到D盘上的服务器:127.0.0.1:27020,查看 test 数据库中是否有 user 集合,如果有,并查看 user 中的文档。

mongodb://127.0.0.1:27020   #连接D盘上的服务器
...db
test
myRep:PRIMARY>show collections #查看数据库 test 中的集合
user
myRep:PRIMARY>db.user.find()
{"_id" : ObjectId("58f0857b54caa5a0e463db06"), "name" : "liruihuan", "age" : 18}
myRep:PRIMARY>

哇,我们发现D盘上的服务器已经存在数据了。

业精于勤,荒于嬉;行成于思,毁于随。

如果你觉得这篇文章不错或者对你有所帮助,可以通过右侧【打赏】功能,给予博主一点点鼓励和支持

MongoDB基础教程系列--第八篇 MongoDB 副本集实现复制功能的更多相关文章

  1. MongoDB基础教程系列--第七篇 MongoDB 聚合管道

    在讲解聚合管道(Aggregation Pipeline)之前,我们先介绍一下 MongoDB 的聚合功能,聚合操作主要用于对数据的批量处理,往往将记录按条件分组以后,然后再进行一系列操作,例如,求最 ...

  2. MongoDB基础教程系列--第三篇 MongoDB基本操作(二)

    1.集合操作 1.1.创建集合 MongoDB 用 db.createCollection(name, options) 方法创建集合. 格式 db.createCollection(name, op ...

  3. MongoDB基础教程系列--第四篇 MongoDB 查询文档

    查询文档 查询文档可以用 find() 方法查询全部文档,可以用 findOne() 查询第一个文档,当然还可以根据 条件操作符 和 $type操作符 查询满足条件的文档. find() 和 find ...

  4. MongoDB基础教程系列--第五篇 MongoDB 映射与限制记录

    上一篇提到的 find() 的方法,细心的伙伴会发现查询的结果都是显示了集合中全部的字段,实际应用中,显然是不够用的.那么有没有办法指定特定的字段显示出文档呢?答案是肯定的,MongoDB 中用映射实 ...

  5. MongoDB基础教程系列--第六篇 MongoDB 索引

    使用索引可以大大提高文档的查询效率.如果没有索引,会遍历集合中所有文档,才能找到匹配查询语句的文档.这样遍历集合中整个文档的方式是非常耗时的,特别是处理大数据时,耗时几十秒甚至几分钟都是有可能的. 创 ...

  6. MongoDB基础教程系列--未完待续

    最近对 MongoDB 产生兴趣,在网上找的大部分都是 2.X 版本,由于 2.X 与 3.X 差别还是很大的,所以自己参考官网,写了本系列.MongoDB 的知识还是很多的,本系列会持续更新,本文作 ...

  7. MongoDB基础教程系列--目录结构

    最近对 MongoDB 产生兴趣,在网上找的大部分都是 2.X 版本,由于 2.X 与 3.X 差别还是很大的,所以自己参考官网,写了本系列.MongoDB 的知识还是很多的,本系列会持续更新,本文作 ...

  8. MongoDB基础教程系列--第一篇 进入MongoDB世界

    1.什么是MongoDB MongoDB是跨平台的.一个基于分布式文件存储的数据库.由C++语言编写.用它创建的数据库具备性能高.可用性强.易于扩展等特点.MongoDB将数据存储为一个文档,数据结构 ...

  9. MongoDB基础教程系列--第二篇 MongoDB基本操作(一)

    1.安装环境 在官网上下载MongoDB的最新版本,根据自身Windows版本下载正确的MongoDB版本.下载后,双击32位或者64位.msi文件,按操作提示安装就可以了. 说明: 32 位版本的 ...

随机推荐

  1. Angular控制器

    这里使用的是angular-1.0.1.min.js Angular的前端渲染 <div> <ul> <li ng-repeat="i in [1,2,3]&q ...

  2. Yii地址美化(nginx环境)

    通过urlmanager实现yii地址美化,需配合服务器中的rewrite配置     1.在'components'中加入    'urlManager'=>array(        'ur ...

  3. PetaPoco 快速上手

    今天来给大家分享一个好用的轻型的.net框架的ORM——PetaPoco 本着快速上手的原则,我们通过和EF对比,让大家能快速使用PetaPoco PetaPoco大家可能没有听说过,但大家一定听说过 ...

  4. Selenium Web 自动化 - 项目持续集成

    Selenium Web 自动化 - 项目持续集成 2017-02-13 目录 1环境准备  1.1 安装git  1.2 安装jenkins  1.3 安装jenkins插件  1.4 jekins ...

  5. CentOS 7安装配置FTP服务器

    CentOS 7下FTP服务器的安装配置. 假设我们有以下要求 路径 权限 备注 /ftp/open 公司所有人员包括来宾均可以访问 只读 /ftp/private 仅允许Alice.Jack.Tom ...

  6. 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚

    1651: [Usaco2006 Feb]Stall Reservations 专用牛棚 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 566  Sol ...

  7. PTVS在Visual Studio中的安装

    下载链接,点这里 PTVS是VS下的python开发插件 1.下载完成后,双击运行,安装完毕 2.解释脚本:打开VS,找到文件-新建-项目,在新建项目页面的左侧树形菜单的已安装->模板-> ...

  8. mysql语句sum求和为null的问题

    select sum(price) as price from order where status='SUCCESS'; 如果price对应的所有的值为0,那么算出来的和为null: 可以采用ifn ...

  9. MapReduce简介以及详细配置

    1.MapReduce(一个分布式运算框架)将数据分为数据块,发送到不同的节点,并行方式处理. 2.NodeManager和DataNode在一个节点上,程序与数据在一个节点. 3.内容分为两个部分 ...

  10. javascript 类型的判断

    在平常写js代码,类型判断必不可少,那么我们常见有哪几种?看到了标题,先不看你会想到那些方法 ,常用呢些呢?那么今天我自己总结一些判断类型的判断,如有错,万望告知! 1:typeof 常用这种方法不错 ...