MongoDB 复制篇
mongoDB 复制篇
复制集简介
Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写入Primary,Secondary从Primary同步写入的数据,以保持复制集内所有成员存储相同的数据集。
官方文档上的复制集

Primary选举
复制集在初始化之后要进行Priamry选举,在获得大多数的成员投票之后的节点会成为Priamry节点,其余的成为Secondary节点	
初始化复制集
config = {
_id : "my_replica_set",
members : [
     {_id : 0, host : "rs1.example.net:27017"},
     {_id : 1, host : "rs2.example.net:27017"},
     {_id : 2, host : "rs3.example.net:27017"},
   ]
}
rs.initiate(config)
大多数的定义为N/2 + 1 N为复制集数量。当复制集的存活的数量不足大多数时,整个复制集无法选出Priamry ,复制集只提供读服务。
特殊的Secondary
Priamry的作用是将自己的数据同步给其他的Secondary。并保持最新的数据
下面是一些特殊的Secondary的节点的介绍,这些几点的主要作用是在Priamry节点主动或被动退出时,选举出新的Priamry节点
Arbiter
Arbiter节点只参与投票,不能被选为Primary,并且不从Primary同步数据。
Arbiter本身不存储数据,是非常轻量级的服务
Arbiter本身不存储数据,是非常轻量级的服务
Priority0节点的选举优先级为0,不会被选举为Primary
Vote0
Mongodb 3.0里,复制集成员最多50个,参与Primary选举投票的成员最多7个,其他成员(Vote0)的vote属性必须设置为0,即不参与投票。
Hidden
Hidden节点不能被选为主(Priority为0),并且对Driver不可见。
Delayed
Delayed节点必须是Hidden节点,并且其数据落后与Primary一段时间(可配置,比如1个小时)。
主要作用是Delayed的节点数据比Priamry的数据落后,这样当Priamry的数据出现错误的时候,可以通过Delayed节点的数据进行恢复
###数据的同步
**同步的原理**
	**Primary**与**Secondary**之间通过**oplog**来同步数据,**Primary**上的写操作完成后,会向特殊的***local.oplog.rs***特殊集合写入一条**oplog**,**Secondary**不断的从**Primary**取新的**oplog**并应用。
当然oplog的数据也不是一直在增加,当容量达到上限时,会将最旧的数据删除。
**oplog**的格式
{
  "ts" : Timestamp(1446011584, 2),
  "h" : NumberLong("1687359108795812092"),
  "v" : 2,
  "op" : "i",
  "ns" : "test.nosql",
  "o" : { "_id" : ObjectId("563062c0b085733f34ab4129"), "name" : "mongodb", "score" : "100" }
}
- ts: 操作时间,当前timestamp + 计数器,计数器每秒都被重置
 - h:操作的全局唯一标识
 - v:oplog版本信息
 - op:操作类型
 - 1 i:插入操作
 - 2 u:更新操作
 - 3 d:删除操作
 - 4 c:执行命令(如createDatabase,dropDatabase)
 - 5 n:空操作,特殊用途
 - ns:操作针对的集合
 - o:操作内容,如果是更新操作
 - o2:操作查询条件,仅update操作包含该字段
 
###修改复制集配置
当需要修改复制集时,比如增加成员、删除成员、或者修改成员配置(如**priorty**、**vote**、**hidden**、**delayed**等属性),可通过**replSetReconfig**命令(**rs.reconfig()**)对复制集进行重新配置。
例如下面的例子
cfg = rs.conf();
cfg.members[1].priority = 2;
rs.reconfig(cfg);
这个例子的作用是将复制集的第二个成员的Priamry设置为2
###Primary选举的选举细节
下面的几种情况会引复制集的U型安居
- 复制集被reconfig
- Secondary节点检测到Primary宕机时,会触发新Primary的选举
- 当有Primary节点主动stepDown(主动降级为Secondary)时,也会触发新的Primary选举
**Priamry**的选举受到多个因素的影响 例如 **点间心跳**  **优先级**  **最新的oplog时间**的其他的因素
节点间心跳
复制集成员间默认每2s会发送一次心跳信息,如果10s未收到某个节点的心跳,则认为该节点已宕机;如果宕机的节点为Pri
mary,Secondary(前提是可被选为Primary)会发起新的Primary选举。
节点优先级
- 每个节点都倾向于投票给优先级最高的节点
 - 优先级为0的节点不会主动发起Primary选举 也就是Priority0节点
 - 当Primary发现有优先级更高Secondary,并且该Secondary的数据落后在10s内,则Primary会主动降级,让优先级更高的Secondary有成为Primary的机会。
 
Optime
拥有最新optime(最近一条oplog的时间戳)的节点才能被选为主。
网络分区
只有更大多数投票节点间保持网络连通,才有机会被选Primary;
复制集的读写设置
Read Preference
默认情况下,复制集的所有读请求都发到Primary.
Driver (客户端)可通过设置Read Preference来将读请求路由到其他的节点。
- primary: 默认规则,所有读请求发到Primary
 - primaryPreferred: Primary优先,如果Primary不可达,请求Secondary
 - secondary: 所有的读请求都发到secondary
 - secondaryPreferred:Secondary优先,当所有Secondary不可达时,请求Primary
 - nearest:读请求发送到最近的可达节点上(通过ping探测得出最近的节点)
 
Write Concern
默认情况下,Primary完成写操作即返回,但是Driver可通过设置Write Concern来设置写成功的规则
例如
db.products.insert(
  { item: "envelopes", qty : 100, type: "Clasp" },
  { writeConcern: { w: majority, wtimeout: 5000 } }
)
write concern规则设置写必须在大多数节点上成功,超时时间为5s。
上面的设置方式是针对单个请求的,也可以修改副本集默认的write concern,这样就不用每个请求单独设置
cfg = rs.conf()
cfg.settings = {}
cfg.settings.getLastErrorDefaults = { w: "majority", wtimeout: 5000 }
rs.reconfig(cfg)
异常处理(rollback)
这里的异常处理主要是在进行节点选举之后的新旧Primary节点的数据不同步。要讲旧的Priamry的进行回滚部分,以保证数据集与新的Priamry一致
MongoDB 复制篇的更多相关文章
- MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划
		
这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下 一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存 ...
 - MongoDB 复制集 (一) 成员介绍
		
一 MongoDB 复制集简介 MongoDB的复制机制主要分为两种: Master-Slave (主从复制) 这个已经不建议使用 ...
 - MongoDB 索引篇
		
MongoDB 索引篇 索引的简介 索引可以加快查询的速度,但是过多的索引或者规范不好的索引也会影响到查询的速度.且添加索引之后的对文档的删除,修改会比以前速度慢.因为在进行修改的时候会对索引进行更新 ...
 - MongoDB复制
		
1. 什么是复制 (1)MongoDB复制是将数据同步在多个服务器的过程. (2)复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. (3)复制还允 ...
 - mongodb 复制集
		
mongodb 复制集 复制集简介 Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写 ...
 - MongoDB 复制(副本集)
		
MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允许您从硬件故障和服务中断中恢复数据. ...
 - mongodb复制+分片集原理
		
----------------------------------------复制集---------------------------------------- 一.复制集概述: Mongodb ...
 - Raft与MongoDB复制集协议比较
		
在一文搞懂raft算法一文中,从raft论文出发,详细介绍了raft的工作流程以及对特殊情况的处理.但算法.协议这种偏抽象的东西,仅仅看论文还是比较难以掌握的,需要看看在工业界的具体实现.本文关注Mo ...
 - MongoDB复制集
		
1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 1.1.1 复制集的目的 ...
 
随机推荐
- JDK API文档中,<E>、<T>、<?>分别代表什么意思?
			
Type ParameterConventionsYou have already seen the angle bracketand single letter notation used tore ...
 - java web开发时的绝对路径与相对路径
			
相对路径 不以/开头的路径为相对路径,使用相对路径时的路径为当前访问的文件的父目录,即如果现在访问文件的路径为http://localhost:8080/项目名/目录/文件,那么使用相对路径时路径前缀 ...
 - pdf.js跨域问题的分析
			
最近在做公司业务时,需要在线浏览pdf.在现代浏览器中, 均可直接浏览pdf文件,无兼容性问题.但公司的业务线需要支持到ie8. 经过自己的搜索调研, pdf.js比较适合.pdf.js兼容到ie9, ...
 - WIN7+IE8环境QTP11不能录制和识别web对象的解决方法
			
在项目稍微空闲的时间,在办公电脑上面装上QTP11来学习.但是发现在录制脚本时无法录制web对象,在网上找解决方法说以管理员的身份运行QTP就可以解决无法录制的问题,用这方法证明是ok的.后来用Obj ...
 - Spark Structured Streaming框架(2)之数据输入源详解
			
Spark Structured Streaming目前的2.1.0版本只支持输入源:File.kafka和socket. 1. Socket Socket方式是最简单的数据输入源,如Quick ex ...
 - Ext.grid.EditorGridPanel点击单元格添加菜单栏
			
1.定义菜单栏需要的全局变量 var khbm; var type; 2.新建一个菜单栏 var smenu = new Ext.menu.Menu({ id:"sMenu", i ...
 - github+hexo搭建自己的博客网站(六)进阶配置(搜索引擎收录,优化你的url)
			
详细的可以查看hexo博客的演示:https://saucxs.github.io/ 绑定了域名: http://www.chengxinsong.cn hexo+github博客网站源码(可以clo ...
 - mysql时间戳的获取
			
时间戳函数:current_timestamp() 在此位置添加时间戳函数. 然后整体的写法就是下图这样: 根据当前时间戳更新有没有打钩将决定你的时间是什么时间(一个是数据完成写入的时间,一个时间戳回 ...
 - Java  GUI+mysql+分页查询
			
1.要求 : 创建一个学生信息管理数据库 2.实现分页查询 代码如下: a)学生实体类: /** * @author: Annie * @date:2016年6月23日 * @description: ...
 - 201521123082 《Java程序设计》第14周学习总结
			
201521123082 <Java程序设计>第14周学习总结 标签(空格分隔):java 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. Answ ...