1、概述

复制集是一个带有故障转移的主从集群。是从现有的主从模式演变而来,增加了自动故障转移和节点成员自动恢复。

复制集模式中没有固定的主结点,在启动后,多个服务节点间将自动选举 产生一个主结点。该主结点被称为primary,一个或多个从结点被称为secondaries。primary结点基本上就是master结点,不同之 处在于primary结点在不同时间可能是不同的服务器。如果当前的主结点失效了,复制集中的其余结点将会试图选出一个新的主结点。

复制集模式的好处是,一切自动化。首先,复制集模式本身做了大量的管理工作,自动管理从节点,确保数据不会不一致。其次,主节点挂掉后,会自动判断集群中的服务器并进行故障转移,推举新的主节点。

一个复制集集群支持1-7台服务器,在一个复制集中各个服务器数据保持完全一致。

在一个复制集集群中,各个服务器有以下几种状态:

  1. Primary 主节点,一个复制集有且仅有一台服务器处于Primary状态,只有主节点才对外提供读写服务。如果主节点挂掉,复制集将会投票选出一个备用节点成为新的主节点。
  2. Secondary 备用节点,复制集允许有多台Secondary,每个备用节点的数据与主节点的数据是完全同步的。
  3. Recovering 恢复中,当复制集中某台服务器挂掉或者掉线后数据无法同步,重新恢复服务后从其他成员复制数据,这时就处于恢复过程,数据同步后,该节点又回到备用状态。
  4. Arbiter 仲裁节点,该类节点可以不用单独存在,如果配置为仲裁节点,就主要负责在复本集中监控其他节点状态,投票选出主节点。该节点将不会用于存放数据。如果没有仲裁节点,那么投票工作将由所有节点共同进行。
  5. Down 无效节点,当服务器挂掉或掉线时就会处于该状态。

复制集的从节点读请求,也是在各个Driver层设置slaveOk的值来实现的。

2、示例

  • 创建一个包含三个服务器的mongodb 的副本集   (不要把 --auth 开启了 不然会使得 复本集之间无法通信)
/usr/local/mongodb/mongod -dbpath=/data/mongodbreplset/ --fork --port  --logpath=/usr/local/mongodb/log/mongodbreplset/m19.log --logappend --replSet rsdemo --smallfiles

/usr/local/mongodb/mongod -dbpath=/data/mongodbreplset/ --fork --port  --logpath=/usr/local/mongodb/log/mongodbreplset/m18.log --logappend --replSet rsdemo --smallfiles

/usr/local/mongodb/mongod -dbpath=/data/mongodbreplset/ --fork --port  --logpath=/usr/local/mongodb/log/mongodbreplset/m17.log --logappend --replSet rsdemo --smallfiles
  • 执行以下操作 初始化复制集
rsdemo:PRIMARY> var rsconf={
... _id:'rsdemo',
... members:[
... {_id:,host:'192.168.0.108:27017'},
... {_id:,host:'192.168.0.108:27018'},
... {_id:,host:'192.168.0.108:27019'}
... ]}
rsdemo:PRIMARY> rs.reconfig(rs)
rs( rsconf
rsdemo:PRIMARY> rs.reconfig(rsconf) //rs.initiate(rsconf)
{ "ok" : }
  • 查看复制集合的状态:rs.status()
rsdemo:PRIMARY> rs.status()
{
"set" : "rsdemo",
"date" : ISODate("2015-11-16T14:19:12Z"),
"myState" : ,
"members" : [
{
"_id" : ,
"name" : "192.168.0.108:27017",
"health" : ,
"state" : ,
"stateStr" : "SECONDARY",
"uptime" : ,
"optime" : Timestamp(, ),
"optimeDate" : ISODate("2015-11-16T14:19:06Z"),
"lastHeartbeat" : ISODate("2015-11-16T14:19:10Z"),
"lastHeartbeatRecv" : ISODate("2015-11-16T14:19:11Z"),
"pingMs" : ,
"syncingTo" : "192.168.0.108:27019"
},
{
"_id" : ,
"name" : "192.168.0.108:27018",
"health" : ,
"state" : ,
"stateStr" : "SECONDARY",
"uptime" : ,
"optime" : Timestamp(, ),
"optimeDate" : ISODate("2015-11-16T14:19:06Z"),
"lastHeartbeat" : ISODate("2015-11-16T14:19:11Z"),
"lastHeartbeatRecv" : ISODate("2015-11-16T14:19:11Z"),
"pingMs" : ,
"syncingTo" : "192.168.0.108:27019"
},
{
"_id" : ,
"name" : "192.168.0.108:27019",
"health" : ,
"state" : ,
"stateStr" : "PRIMARY",
"uptime" : ,
"optime" : Timestamp(, ),
"optimeDate" : ISODate("2015-11-16T14:19:06Z"),
"electionTime" : Timestamp(, ),
"electionDate" : ISODate("2015-11-16T14:04:03Z"),
"self" : true
}
],
"ok" :
}
  • 查看配置信息 rs.conf()
rsdemo:PRIMARY> rs.conf()
{
"_id" : "rsdemo",
"version" : ,
"members" : [
{
"_id" : ,
"host" : "192.168.0.108:27017"
},
{
"_id" : ,
"host" : "192.168.0.108:27018"
},
{
"_id" : ,
"host" : "192.168.0.108:27019"
}
]
}
rsdemo:PRIMARY>
  • 查看是不是主节点
rsdemo:PRIMARY> rs.isMaster(
... )
{
"setName" : "rsdemo",
"setVersion" : ,
"ismaster" : true,
"secondary" : false,
"hosts" : [
"192.168.0.108:27019",
"192.168.0.108:27018",
"192.168.0.108:27017"
],
"primary" : "192.168.0.108:27019",
"me" : "192.168.0.108:27019",
"maxBsonObjectSize" : ,
"maxMessageSizeBytes" : ,
"maxWriteBatchSize" : ,
"localTime" : ISODate("2015-11-16T14:51:16.795Z"),
"maxWireVersion" : ,
"minWireVersion" : ,
"ok" :
}
  • 测试复制集合
  1.  首先在主节点创建demo库
  2.  for 循环添加1000条数据
  3.  主库查看是不是存在
  4.  检查副本集成员是不是含有该记录
rsdemo:PRIMARY>  for(var i=;i<;i++){db.demo.insert({count:i})}
WriteResult({ "nInserted" : })
rsdemo:PRIMARY> show dbs
admin (empty)
demo .031GB
local .094GB
rsdemo:PRIMARY> use demo
switched to db demo
rsdemo:PRIMARY> db.demo.find()
{ "_id" : ObjectId("563e24b2a731ac9621c37650"), "age" : , "name" : "赵兴壮" }
{ "_id" : ObjectId("5649e70fff8e3af9408ff52f"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff530"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff531"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff532"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff533"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff534"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff535"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff536"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff537"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff538"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff539"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff53a"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff53b"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff53c"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff53d"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff53e"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff53f"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff540"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff541"), "count" : }
Type "it" for more
rsdemo:SECONDARY> rs.slaveOk()// 注意
rsdemo:SECONDARY> db.demo.find()
{ "_id" : ObjectId("563e24b2a731ac9621c37650"), "age" : , "name" : "赵兴壮" }
{ "_id" : ObjectId("5649e70fff8e3af9408ff52f"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff530"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff531"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff532"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff533"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff534"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff535"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff536"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff537"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff538"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff539"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff53a"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff53b"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff53c"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff53d"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff53e"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff53f"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff540"), "count" : }
{ "_id" : ObjectId("5649e70fff8e3af9408ff541"), "count" : }
Type "it" for more
rsdemo:SECONDARY>

MongoDB 复制集模式Replica Sets的更多相关文章

  1. MongoDB复制集成员及架构介绍(一)

    MongoDB复制集介绍 MongoDB支持在多个机器中通过异步复制达到提供了冗余,增加了数据的可用性.MongoDB有两种类型的复制,第一种是同于MySQL的主从复制模式(MongoDB已不再推荐此 ...

  2. MongoDb复制集实现故障转移,读写分离

    前言 数据库技术是信息系统的一个核心技术,发展很快,各种功能类型数据库层出不穷,之前工作中使用过关系型数据库(mysql.oracle等).面相对象数据库(db4o).key-value存储(Memc ...

  3. mongodb复制集Replica Set使用简介

    MongoDB高可用 对于MongoDB,可以支持使用单机模式提供服务,但是在实际的生产环境中,单机模式将面临很大的风险,一旦这个数据库服务出现问题,就会导致线上的服务出现错误甚至崩溃.因此,在实际生 ...

  4. 关于 MongoDB 复制集

    为什么要使用复制集 1.备份数据通过自带的 mongo_dump/mongo_restore 工具也可以实现备份,但是毕竟没有复制集的自动同步备份方便. 2.故障自动转移部署了复制集,当主节点挂了后, ...

  5. Raft与MongoDB复制集协议比较

    在一文搞懂raft算法一文中,从raft论文出发,详细介绍了raft的工作流程以及对特殊情况的处理.但算法.协议这种偏抽象的东西,仅仅看论文还是比较难以掌握的,需要看看在工业界的具体实现.本文关注Mo ...

  6. MongoDB 复制集 (一) 成员介绍

       一 MongoDB 复制集简介          MongoDB的复制机制主要分为两种:          Master-Slave    (主从复制)      这个已经不建议使用       ...

  7. MongoDB复制集的工作原理介绍(二)

    复制集工作原理 1)数据复制原理 开启复制集后,主节点会在 local 库下生成一个集合叫 oplog.rs,这是一个有限集合,也就是大小是固定的.其中记录的是整个mongod实例一段时间内数据库的所 ...

  8. MongoDB复制集成员及状态转换

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 复制集(Replica Set)是MongoDB核心组件,相比早期版本采用的主从(Master-Slave) ...

  9. MongoDB复制集原理

    版权声明:本文由孔德雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/136 来源:腾云阁 https://www.qclo ...

随机推荐

  1. linux下swftools 的配置

    1.安装所需的库和组件.机器之前安装过了,主要安装的是下面几个组件.如果不安装会提示machine `x86_64-unknown-linux' not recognized yum install ...

  2. Selenium+Java+TestNG环境配置

    1. JDK 2.eclipse+TestNG >TestNG安装.   Name:testng  Location:http://beust.com/eclipse.如图: 3.seleniu ...

  3. 【题解】A-B

    [问题描述]出题是一件痛苦的事情!题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!好吧,题目是这样的:给出一串数以及一个数字 C,要求计算出所有 A-B ...

  4. SQL string类型的数据按int类型排序 分类: SQL Server 2014-12-08 16:56 393人阅读 评论(0) 收藏

    说明: 我在做wms进销存软件时,发现一个问题:一张入库单(T_OutIn_BoxTop),入库扫描时要分成多箱,箱号(BoxTop_No)可以是数字也可以是字符串,所以箱号只能是字符串类型的,问题来 ...

  5. 为什么Android没有iOS那么顺滑

    虽然很多Android手机的配置都比iPhone要高,比如大多数Andorid手机的内存都有1GB,而iPhone 4S只有512MB内存,但用过iPhone的人都知道Android手机在使用的时候总 ...

  6. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(26)-权限管理系统-分配角色给用户

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(26)-权限管理系统-分配角色给用户 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x ...

  7. 看个人思路吧,清晰的话就简单 CodeForces 271A - Beautiful Year

    It seems like the year of 2013 came only yesterday. Do you know a curious fact? The year of 2013 is ...

  8. 支持MySql的数据库自动分表工具DBShardTools发布

    支持MySql的数据库自动分表工具DBShardTools发布 前段时间参与了公司的一个项目,这个项目的特点是数据量.访问量都比较大,考虑使用数据库水平分表策略,Google了大半天,竟然没有找到分表 ...

  9. [置顶] iptables 性能 测试

    一直研究iptables 性能,这几天刚好有硬件资源,于是发始下手测试iptables NAT 性…… 硬件环境  : 服务器: IBM x3650 ( 4G  E5645 6核 12线程) ESXi ...

  10. IOS-tableViewCell重用机制

    IOS-tableViewCell重用机制 首先介绍tableViewCell原生cell的使用和重用机制 使用dequeueReusableCellWithIdentifier方法,这个方法会从缓存 ...