前面一张介绍了主从模式,现在mongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模式。副本集不能在一台电脑上操作。需要准备3台电脑进行搭建。副本集就是mongoDB副本所组成的一个集群。

同步原理是,写操作发生在主库,从库同步主库的OpLog日志。

集群中没有特定的主库,主库是选举产生,如果主库down了,会再选举出一台主库。

下面来看具体的搭建。使用三台电脑进行搭建,分别是

192.168.0.12:27017   zhf-maple

192.168.0.11:27017   zhf-linux

192.168.0.4:27017    ubuntu

root@zhf-maple:/home/zhf/桌面# cat /etc/hosts

127.0.0.1 localhost

192.168.0.12 zhf-maple

192.168.0.11    zhf-linux

192.168.0.4     ubuntu

在其他两台电脑的/etc/hosts文件也分别添加对应的域名进去

在三台电脑上分别创建node0,node1,node2文件夹然后分别运行命令

mongod --dbpath /home/zhf/node0 --replSet rs0

mongod --dbpath /home/zhf/node1 --replSet rs0

mongod --dbpath /home/zhf/node2 --replSet rs0

此时进入任意一个mongod服务器。使用admin集合。然后运行rs.initiate()

> use admin
switched to db admin
> rs.initiate()
{
    "info2" : "no configuration explicitly specified -- making one",
    "me" : "zhf-linux:27017",
    "info" : "Config now saved locally.  Should come online in about a minute.",
    "ok" : 1
}

确认配置
> rs.conf()
{
    "_id" : "rs0",
    "version" : 1,
    "members" : [
        {
            "_id" : 0,
            "host" : "zhf-linux:27017"
        }
    ]
}

测试在primary上添加从库
rs0:PRIMARY> rs.add('ubuntu:27017')
{ "ok" : 1 }

查看状态。health:1代表正常启动,stateStr可以看到哪个是主的,哪个是从的
rs0:PRIMARY> rs.status()
{
    "set" : "rs0",
    "date" : ISODate("2018-01-16T09:38:21Z"),
    "myState" : 1,
    "members" : [
        {
            "_id" : 0,
            "name" : "zhf-linux:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 587,
            "optime" : Timestamp(1516095474, 1),
            "optimeDate" : ISODate("2018-01-16T09:37:54Z"),
            "electionTime" : Timestamp(1516095459, 1),
            "electionDate" : ISODate("2018-01-16T09:37:39Z"),
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "ubuntu:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 27,
            "optime" : Timestamp(1516095474, 1),
            "optimeDate" : ISODate("2018-01-16T09:37:54Z"),
            "lastHeartbeat" : ISODate("2018-01-16T09:38:20Z"),
            "lastHeartbeatRecv" : ISODate("2018-01-16T09:38:19Z"),
            "pingMs" : 54,
            "syncingTo" : "zhf-linux:27017"
        }
    ],
    "ok" : 1
}

再次添加从库。此时2个secondary,一个primary就已经启动起来了
rs0:PRIMARY> rs.add('zhf-maple:27017')
{ "down" : [ "zhf-maple:27017" ], "ok" : 1 }
rs0:PRIMARY> rs.status()
{
    "set" : "rs0",
    "date" : ISODate("2018-01-16T09:38:42Z"),
    "myState" : 1,
    "members" : [
        {
            "_id" : 0,
            "name" : "zhf-linux:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 608,
            "optime" : Timestamp(1516095516, 1),
            "optimeDate" : ISODate("2018-01-16T09:38:36Z"),
            "electionTime" : Timestamp(1516095459, 1),
            "electionDate" : ISODate("2018-01-16T09:37:39Z"),
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "ubuntu:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 48,
            "optime" : Timestamp(1516095516, 1),
            "optimeDate" : ISODate("2018-01-16T09:38:36Z"),
            "lastHeartbeat" : ISODate("2018-01-16T09:38:41Z"),
            "lastHeartbeatRecv" : ISODate("2018-01-16T09:38:42Z"),
            "pingMs" : 7,
            "syncingTo" : "zhf-linux:27017"
        },
        {
            "_id" : 2,
            "name" : "zhf-maple:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 0,
            "optime" : Timestamp(0, 0),
            "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
            "lastHeartbeat" : ISODate("2018-01-16T09:38:42Z"),
            "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
            "pingMs" : 0,
            "lastHeartbeatMessage" : "Received heartbeat from member with the same member ID as ourself: 0"
        }
    ],

接下来在primary上进行数据更新:

s0:PRIMARY> use maple
switched to db maple
rs0:PRIMARY> db.insert({'name':'zhanghongfeng'})
2018-01-16T17:56:06.625+0800 TypeError: Property 'insert' of object maple is not a function
rs0:PRIMARY> db.maple.insert({'name':'zhanghongfeng'})
WriteResult({ "nInserted" : 1 })

此时在secondary上查看数据库

rs0:SECONDARY> use maple
switched to db maple
rs0:SECONDARY> db.maple.find()
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }

查找的时候提示not master and slaveOk=false。原因在于mongodb默认是从主节点读写数据的,副本节点上不允许读(更不能写入),需要设置副本节点可以读。通过db.getMongo().setSlaveOk()进行设置
rs0:SECONDARY> db.getMongo().setSlaveOk()
rs0:SECONDARY> db.maple.find()
{ "_id" : ObjectId("5a5dcc538c0f7da3bc2f819f"), "name" : "zhanghongfeng" }

这样就能查询到对应的数据了,表明在副本节点上进行了同步

mongodb学习之:副本集的更多相关文章

  1. MongoDB 复制(副本集)学习

    MongoDB 复制(副本集)学习 replication set复制集,复制集,多台服务器维护相同的数据副本,提高服务器的可用性.MongoDB复制是将数据同步在多个服务器的过程.复制提供了数据的冗 ...

  2. 【六】MongoDB管理之副本集

    一.复制介绍 所谓的复制就是在多个主机之间同步数据的过程. 1.数据冗余及可用性 复制技术提供数据冗余及可用性,在不同的数据库服务器上使用多个数据副本,复制技术防止单个数据库服务器出现数据故障而出现数 ...

  3. MongoDB学习笔记~Mongo集群和副本集

    回到目录 一些概念 对于Mongo在数据容灾上,推荐的模式是使用副本集模式,它有一个对外的主服务器Primary,还有N个副本服务器Secondary(N>=1,当N=1时,需要有一台仲裁服务器 ...

  4. mongodb中的副本集搭建实践

    准备运行1个主节点,2个从节点,从节点中其中是一个是仲裁节点(Arb). --oplogSize --oplogSize --oplogSize 其中application是副本集的名称,节点必须相同 ...

  5. Mongodb 笔记06 副本集的组成、从应用程序连接副本集、管理

    副本集的组成 1. 同步:MongoDB的复制功能是使用操作日志oplog实现的,操作日志包含了主节点的每一次写操作.oplog是主节点的local数据库中的一个固定集合.备份节点通过查询整个集合就可 ...

  6. mongodb replica set(副本集)设置步骤

    网上已经有一大堆的设置步骤的了,根据我遇到的问题,整理一下,如下: 首先先去下载一个mongodb最新版,目前最新版应该是2.6 cd /usr/local/bin wget http://fastd ...

  7. mongodb生产环境(副本集模式)集群搭建配置

    mongodb副本集模式由如下几部分组成: 1.路由实例mongos 2.配置实例configsvr 3.副本集集群replset(一主多从) tips: 1.以上实例都是mongod守护进程 2.以 ...

  8. mongodb系列之---副本集配置与说明

    在配置副本集之前,我们先来了解一些关于副本集的知识. 1,副本集的原理 副本集的原理与主从很相似,唯一不同的是,在主节点出现故障的时候,主从配置的从服务器不会自动的变为主服务器,而是要通过手动修改配置 ...

  9. MongoDB主从复制和副本集

    MongoDB有主从复制和副本集两种主从复制模式,主从复制最大的问题就是无法自动故障转移,MongoDB副本集解决了主从模式无法自动故障转义的特点,因此是复制的首选.对于简单的主从复制无法自动故障转移 ...

  10. Mongodb主从复制 及 副本集+分片集群梳理

    转载努力哥原文,原文连接https://www.cnblogs.com/nulige/p/7613721.html 介绍了Mongodb的安装使用,在 MongoDB 中,有两种数据冗余方式,一种 是 ...

随机推荐

  1. ATT汇编与Intel汇编的区别,摘自《深入分析linux内核源码》一书

    2.6.1 AT&T与Intel汇编语言的比较 我们知道,Linux是Unix家族的一员,尽管Linux的历史不长,但与其相关的很多事情都发源于Unix.就Linux所使用的386汇编语言而言 ...

  2. Chtml的一些例子

    <!-- 如果是修改的话,调用已关联的单元 --> <?php foreach ($unionZones as $unit) { echo CHtml::openTag('div', ...

  3. Yii框架Yiiapp()的理解

    Yii::app() 是一个实例化的对象,是我们在当前框架里边可以直接操作的对象,        我们可以把这个对象理解成请求应用的第一个对象. Yii框架是纯OOP面向对象框架,也就是利用对象调用类 ...

  4. 在线扩展根分区 red hat 4.8.3-9

    跑程序的时候发现报错,提示空间不足,仔细查看后发现是根分区已满 27G的空间只有20k剩余 考虑从/data分区压缩一点空间到/分区 切换到root用户 执行下面的命令 1. umount /data ...

  5. HDU 6188最小费用流

    题目链接:http://hdu.hustoj.com/showproblem.php?pid=6118 掉坑里了,图很好建,Wa了一发,看了Disscuss里面有人提供了一组样例,画图发现:最小流模板 ...

  6. LA 2995 Image Is Everything

    题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  7. BZOJ2243 [SDOI2011]染色(树链剖分+线段树合并)

    题目链接 BZOJ2243 树链剖分 $+$ 线段树 线段树每个节点维护$lc$, $rc$, $s$ $lc$代表该区间的最左端的颜色,$rc$代表该区间的最右端的颜色 $s$代表该区间的所有连续颜 ...

  8. 透明代理Transparent Proxy

    透明代理Transparent Proxy   透明代理Transparent Proxy类似于普通代理,它可以使得处于局域网的主机直接访问外网.但不同之处,它不需要客户端进行任何设置.这样,客户端误 ...

  9. Excel文件处理Demo

    1.BLL业务逻辑代码 /// <summary> /// 处理“店铺竞品销售数据”导入文件 /// </summary> /// <param name="f ...

  10. 邁向IT專家成功之路的三十則鐵律 鐵律十八:IT人求職之道-文化

    IT人所從事的工作是一個求新求變速度最快的行業,因此您所待的企業IT部門或資訊公司,其組織文化將關係到您在這間公司服務期間,是否能夠快速成長的決定因素.遇到不良的組織文化建議您三個就可以走人了,千萬別 ...