Replica Set在国内叫做副本集,简单来说就是一份数据在多个地方存储。

        1.为什么要用副本集,什么时候使用副本集?

     有人说一份数据在多个地方存储占用了大量的额外空间,是一种浪费。

   这个说法不能说对也不能说不对,要从不同的角度考虑。如果公司的业务量很少,数据不多,一台服务器就可以搞定,那就不需要将一份数据存储在多个地方。随着公司的发展壮大,业务量越来越多,数据也越来越多,这时就需要考虑使用分布式集群的方式来解决了,将数据分散在不同的服务器中。此时仍可以不使用副本,通过将数据分散在不同的服务器中来分散各服务器的压力也可以跟上公司目前的业务量。如果公司规模进一步扩大,用户量越来越多,有可能很多客户要访问同一份资源,此时就有可能造成存放该资源的服务器压力过大。副本的必要性就显现出来了。

        2.使用副本集有什么好处?

副本集提供了容错性,高可用性。当然容灾备份,读写分离等也使用到了副本。

        3.MongoDB Replica Set集群介绍

        先上一个典型的 Replica Set图:

        为方便介绍,以下简称rs集群

         (1).rs集群是由多个Mongod实例节点组成,其中只有一个节点是primary,其它节点是secondary,还有一个是可有可无的仲裁节点。当集群有偶数个节点时,通过会添加一个仲裁节点,如果集群有奇数个节点时,就不需要使用仲裁节点了。仲裁节点不存储数据,只用于投票选举出哪个节点是primary,而且仲裁节点不要求有专门的服务器,但不能运行在已经安装了primary或secondary节点的服务器上,可以运行在应用或监控服务器上(之前看到有人说仲裁节点除了投票外,还可以在primary节点失效后,在secondary节点中再选举出一个primary,这是不对的,仲裁节点的作用仅仅是有一票之权)。

(2).primary用于接收client的读和写请求,并记录操作日志,secondary用于从primary处异步同步primary的操作日志,并更新自己的数据集。通常情况下secondary不能响应client的读操作,以免读取脏数据。但rs集群有多个数据中心时,client可以请求读取secondary数据,当primay在北京的服务器上,其中一个Secondary在重庆,重庆的用户在读取数据时,考虑到地理位置和网速的关系,可选择只读primary,primary优先,只读secondary,secondary优先和读取最近(nearest)节点的数据。

(3).当primary不能访问时,剩下的secondary节点中会再选出一个primary节点。

       4.RS集群部署示例

(1).有三台服务器,由于是奇数服务器,所以不选择仲裁节点。

(2).下载MongodDB手动安装版(我下载的是Linux 64位版本),并解压到一个目录下,将解压的文件夹名字改成mongoDB,进入mongoDB目录,新建一个配置文件mongod.conf

#mongod.conf
#数据保存路径
dbpath=mongodb/data/mongod #日志保存路径
logpath=mongodb/log/mongod.log
logappend=true #后台运行保存的进程pid
pidfilepath=/home/yanggy/mongodb/mongod.pid
#每个数据库一个目录
directoryperdb=true #replica set的名字
replSet=testrs #绑定IP与Host
bind_ip=server1
port=27001 #日志文件大小
oplogSize=100 #后台运行
fork=true #不提前加载数据到内存
noprealloc=true

将此配置文件复制到其它服务器中,修改绑定的IP即可,并手动在各服务器建立相应的数据和日志目录。

(3).在各服务器启动mongod实例

mongod -f mongodb/mongod.conf 

(4).使用mongo连接其中一台服务器

mongo --host server1 --port 27001

(5).初始化rs集群

> cfg = {_id:"testrs",members:[{_id:0,host:"server1:27001",priority:3},
                  {_id:1,host:"server2:27001",priority:2},
                  {_id:2,host:"server3:27001",priority:1}]}

输出:
{
"_id" : "testrs",
"members" : [
{
"_id" : 0,
"host" : "server1:27001",
"priority" : 3
},
{
"_id" : 1,
"host" : "server2:27001",
"priority" : 2
},
{
"_id" : 2,
"host" : "server3:27001",
"priority" : 1
}
]
} >rs.initiate(cfg)

输出:
{
"ok" : 1,
"operationTime" : Timestamp(1521190572, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1521190572, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
} >rs.status() 输出:
{
"set" : "testrs",
"date" : ISODate("2018-03-16T08:56:23.948Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"appliedOpTime" : {
"ts" : Timestamp(1521190572, 1),
"t" : NumberLong(-1)
},
"durableOpTime" : {
"ts" : Timestamp(1521190572, 1),
"t" : NumberLong(-1)
}
},
"members" : [
{
"_id" : 0,
"name" : "server1:27001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 220,
"optime" : {
"ts" : Timestamp(1521190572, 1),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("2018-03-16T08:56:12Z"),
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1521190582, 1),
"electionDate" : ISODate("2018-03-16T08:56:22Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 1,
"name" : "server2:27001",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 11,
"optime" : {
"ts" : Timestamp(1521190572, 1),
"t" : NumberLong(-1)
},
"optimeDurable" : {
"ts" : Timestamp(1521190572, 1),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("2018-03-16T08:56:12Z"),
"optimeDurableDate" : ISODate("2018-03-16T08:56:12Z"),
"lastHeartbeat" : ISODate("2018-03-16T08:56:22.733Z"),
"lastHeartbeatRecv" : ISODate("2018-03-16T08:56:19.659Z"),
"pingMs" : NumberLong(0),
"configVersion" : 1
},
{
"_id" : 2,
"name" : "server3:27001",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 11,
"optime" : {
"ts" : Timestamp(1521190572, 1),
"t" : NumberLong(-1)
},
"optimeDurable" : {
"ts" : Timestamp(1521190572, 1),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("2018-03-16T08:56:12Z"),
"optimeDurableDate" : ISODate("2018-03-16T08:56:12Z"),
"lastHeartbeat" : ISODate("2018-03-16T08:56:22.733Z"),
"lastHeartbeatRecv" : ISODate("2018-03-16T08:56:19.641Z"),
"pingMs" : NumberLong(0),
"configVersion" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1521190572, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1521190582, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}

可以看到priority值越大的节点越有可能成为primary。

好了,相信大家对Replica Set已经有了初步体验和认识,如果上文中有什么表述的不准备或者错误的地方,欢迎指出,大家共同探讨进步。

参考: MongoDB Replication

MongoDB3.6之Replica Set初步体验的更多相关文章

  1. mysql connector c++ 1.1 API初步体验

    mysql connector c++ 1.1 API初步体验 1,常用的头文件 #include <mysql_connection.h> #include <mysql_driv ...

  2. 移动端之Android开发的几种方式的初步体验

    目前越来越多的移动端混合开发方式,下面列举的大多数我都略微的尝试过,就初步的认识写个简单的心得: 开发方式 开发环境 是否需要AndroidSDK 支持跨平台 开发语言&技能 MUI Win+ ...

  3. express 框架初步体验

    一. 安装express 1.打开cmd  全局安装express 输入:npm install -gd express 2. 安装命令行工具,不然你输入express 会出现 不是内部命令. 输入: ...

  4. 2014年新一代的报表利器 Qlik Sense Desktop 初步体验

    点击进入 QlikView/QlikSense 社区  交流群:432998033 Qlik Sense Desktop 的案例展示 先上几个刚刚边看边学完成的几个报表案例效果 (如果图片显示不正常, ...

  5. 中国移动MIFI--CM510,4G TD-LTE MIFI 上网终端开箱及初步体验@上海

    上海的,前期在4G官网报名专页登记了http://www.10086.cn/lte/recruit.html 当时由于报名结束了,所以先注册登记了信息. 1.15号中午收到10086的短信邀请,立马报 ...

  6. 初步体验libsvm用法1(官方自带工具)

    在机器学习和模式识别领域,svm理论使用得很广泛,其理论基础是统计学习,但是如果我们的研究方向不是svm理论,我们只是利用已有的svm工具来对我们的任务进行分类和回归,那么libsvm是一个不错的选择 ...

  7. 初步体验javascript try catch机制

    javascript在ECMAScript3中引入了try catch finally机制,大致原理和其他语言一样. 我们也可以自定义错误事件. 但是事先声明:我们自定义的错误事件,只支持对name. ...

  8. 【Struts2】新建一个Struts2工程,初步体验MVC

    实现目标 地址栏输入http://localhost:88/Struts2HelloWorld/helloworld.jsp 输入用户名,交由http://localhost:88/Struts2He ...

  9. Yeelink初步体验

    环境 Qemu: 2.8.0 开发板:vexpress-ca9   概述     前面的博文已经使我们的虚拟开发板具备了访问外网的目的,离物联网越来越近了.要玩物联网,Yeelink不得不说,它提供了 ...

随机推荐

  1. Springdata mongodb 版本兼容 引起 Error [The 'cursor' option is required, except for aggregate with the explain argument

    在Spring data mongodb 中使用聚合抛出异常 mongodb版本 为 3.6 org.springframework.dao.InvalidDataAccessApiUsageExce ...

  2. C语言老司机学Python (二)

    标准数据类型: 共6种:Number(数字),String(字符串),List(列表),Tuple(元组),Sets(集合),Dictionary(字典) 本次学习主要是和数据类型混个脸熟,知道每样东 ...

  3. accordion 分类

    <!--accordion--><h1>accordion 分类</h1><div id="accordionId" class=&quo ...

  4. Http协议规范及格式

    HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616.HTTP协议采用了请求/响应模型.客户 ...

  5. a链接在新窗口打开

    平时用的收集了几种方法 1.在head标签里添加,base最大的用处就是可以改变某一个网页默认的属性 <base target="_blank"/> 2.Jquery ...

  6. ORACLE虚拟索引(Virtual Index)

    ORACLE虚拟索引(Virtual Index)   虚拟索引概念 虚拟索引(Virtual Indexes)是一个定义在数据字典中的假索引(fake index),它没有相关的索引段.虚拟索引的目 ...

  7. Tomcat启动过程源码解读

    根据Tomcat源码来看一下Tomcat启动过程都做了什么 部分代码为主要流程代码,删去了try-catch以及一些校验逻辑,方便理解主流程 先来一张启动过程时序图,了解一下启动顺序 Tomcat启动 ...

  8. 迁移学习︱艺术风格转化:Artistic style-transfer+ubuntu14.0+caffe(only CPU)

    说起来这门技术大多是秀的成分高于实际,但是呢,其也可以作为图像增强的工具,看到一些比赛拿他作训练集扩充,还是一个比较好的思路.如何在caffe上面实现简单的风格转化呢? 好像网上的博文都没有说清楚,而 ...

  9. 2.1 存储器域与PCI总线域

    HOST主桥的实现因处理器系统而异.PowerPC处理器和x86处理器的HOST主桥除了集成方式不同之外,其实现机制也有较大差异.但是这些HOST主桥所完成的最基本功能依然是分离存储器域与PCI总线域 ...

  10. FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)

    FFMPEG中的swscale提供了视频原始数据(YUV420,YUV422,YUV444,RGB24...)之间的转换,分辨率变换等操作,使用起来十分方便,在这里记录一下它的用法. swscale主 ...