MongoDB3.6之Replica Set初步体验
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已经有了初步体验和认识,如果上文中有什么表述的不准备或者错误的地方,欢迎指出,大家共同探讨进步。
MongoDB3.6之Replica Set初步体验的更多相关文章
- mysql connector c++ 1.1 API初步体验
mysql connector c++ 1.1 API初步体验 1,常用的头文件 #include <mysql_connection.h> #include <mysql_driv ...
- 移动端之Android开发的几种方式的初步体验
目前越来越多的移动端混合开发方式,下面列举的大多数我都略微的尝试过,就初步的认识写个简单的心得: 开发方式 开发环境 是否需要AndroidSDK 支持跨平台 开发语言&技能 MUI Win+ ...
- express 框架初步体验
一. 安装express 1.打开cmd 全局安装express 输入:npm install -gd express 2. 安装命令行工具,不然你输入express 会出现 不是内部命令. 输入: ...
- 2014年新一代的报表利器 Qlik Sense Desktop 初步体验
点击进入 QlikView/QlikSense 社区 交流群:432998033 Qlik Sense Desktop 的案例展示 先上几个刚刚边看边学完成的几个报表案例效果 (如果图片显示不正常, ...
- 中国移动MIFI--CM510,4G TD-LTE MIFI 上网终端开箱及初步体验@上海
上海的,前期在4G官网报名专页登记了http://www.10086.cn/lte/recruit.html 当时由于报名结束了,所以先注册登记了信息. 1.15号中午收到10086的短信邀请,立马报 ...
- 初步体验libsvm用法1(官方自带工具)
在机器学习和模式识别领域,svm理论使用得很广泛,其理论基础是统计学习,但是如果我们的研究方向不是svm理论,我们只是利用已有的svm工具来对我们的任务进行分类和回归,那么libsvm是一个不错的选择 ...
- 初步体验javascript try catch机制
javascript在ECMAScript3中引入了try catch finally机制,大致原理和其他语言一样. 我们也可以自定义错误事件. 但是事先声明:我们自定义的错误事件,只支持对name. ...
- 【Struts2】新建一个Struts2工程,初步体验MVC
实现目标 地址栏输入http://localhost:88/Struts2HelloWorld/helloworld.jsp 输入用户名,交由http://localhost:88/Struts2He ...
- Yeelink初步体验
环境 Qemu: 2.8.0 开发板:vexpress-ca9 概述 前面的博文已经使我们的虚拟开发板具备了访问外网的目的,离物联网越来越近了.要玩物联网,Yeelink不得不说,它提供了 ...
随机推荐
- python 垃圾回收机制的思考
一.前言 Python 是一门高级语言,使用起来类似于自然语言,开发的时候自然十分方便快捷,原因是Python在背后为我们默默做了很多事情,其中一件就是垃圾回收,来解决内存管理,内存泄漏的问题. 内存 ...
- nyoj888 取石子(九) 反Nimm博弈
这题就是反Nimm博弈--分析见反Nimm博弈 AC代码 #include <cstdio> #include <cmath> #include <algorithm&g ...
- nyoj222 整数中的1 数位DP
从a枚举到b是一定会超时的.此题应该考虑数位dp,也可以理解为递推,假设给定数n,就能在O(32)复杂度算出所有小于等于n的数中1出现的次数,那么给定区间[a, b],solve(b) - solve ...
- 如何解决使用Gradle时出现的jar包冲突
前言 在我之前使用Gradle的博文中已经提到,Gradle对依赖的管理是比较智能的,如果有两个包依赖于相同的包,而版本不同的时候,Gradle会进行自动的选择,从而避免jar包的冲突. 也就是说,在 ...
- openstack-ocata-网络服务5
一. 网络服务概述 Networking(neutron),允许创建.插入接口设备,这些设备由其他的OpenStack服务管理.插件式的实现可以容纳不同的网络设备和软件,为OpenStack架构与部署 ...
- 1.5 PCI-X总线简介
PCI-X总线仍采用并行总线技术.PCI-X总线使用的大多数总线事务基于PCI总线,但是在实现细节上略有不同.PCI-X总线将工作频率提高到533MHz,并首先引入了PME(Power Managem ...
- U-Boot启动过程
开发板上电后,执行U-Boot的第一条指令,然后顺序执行U-Boot启动函数.看一下board/smdk2410/u-boot.lds这个链接脚本,可以知道目标程序的各部分链接顺序.第一个要链接的是c ...
- List转换成JSON对象报错(五)
List转换成JSON对象 1.具体错误如下 Exception in thread "main" java.lang.NoClassDefFoundError: org/apac ...
- JavaScript去除日期中的“-”
JavaScript去除日期中的"-" 1.说明 经常会出现这样的情况,页面的日期格式是:YYYY-MM-DD,而数据库中的日期格式是:YYYYMMDD,两者之间需要转换一下,方能 ...
- An internal error occurred during: "Requesting JavaScript AST from selection". GC overhead limit exc
1.错误描述 An internal error occurred during: "Requesting JavaScript AST from selection". ...