前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【mongo】MongoDB副本集

【mongo】MongoDB副本集

作者头像
用户5522200
发布2019-06-02 15:23:31
1K0
发布2019-06-02 15:23:31
举报
文章被收录于专栏:lindalinda

.............................................................................................. 环境:centos7 Ip: 主节点:192.168.225.128 从节点192.168.225.129 从节点&仲裁节点:192.168.225.130 Mongo版本:3.4. ..............................................................................................

一、原理

MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成。类似于MySQL的MMM架构。 副本集中数据同步过程:Primary节点写入数据,Secondary通过读取Primary的oplog得到复制信息,开始复制数据并且将复制信息写入到自己的oplog。如果某个操作失败,则备份节点停止从当前数据源复制数据。如果某个备份节点由于某些原因挂掉了,当重新启动后,就会自动从oplog的最后一个操作开始同步,同步完成后,将信息写入自己的oplog,由于复制操作是先复制数据,复制完成后再写入oplog,有可能相同的操作会同步两份,不过MongoDB在设计之初就考虑到这个问题,将oplog的同一个操作执行多次,与执行一次的效果是一样的。

简单的说就是:当Primary节点完成数据操作后,Secondary会做出一系列的动作保证数据的同步:

  1. 检查自己local库的oplog.rs集合找出最近的时间戳。
  2. 检查Primary节点local库oplog.rs集合,找出大于此时间戳的记录。
  3. 将找到的记录插入到自己的oplog.rs集合中,并执行这些操作。

副本集的同步和主从同步一样,都是异步同步的过程,不同的是副本集有个自动故障转移的功能。其原理是:slave端从primary端获取日志,然后在自己身上完全顺序的执行日志所记录的各种操作(该日志是不记录查询操作的),这个日志就是local数据 库中的oplog.rs表,默认在64位机器上这个表是比较大的,占磁盘大小的5%,oplog.rs的大小可以在启动参数中设 定:--oplogSize 1000,单位是M。 注意:在副本集的环境中,要是所有的Secondary都宕机了,只剩下Primary。最后Primary会变成Secondary,不能提供服务。

二、环境搭建

1.安装mongodb(128/129/130)

端口为37017

2.启动3台mongo

代码语言:javascript
复制
$ mongod -f /etc/mongo37017.conf --replSet replicaset 
$ mongod -f /etc/mongo37017.conf --replSet replicaset
$ mongod -f /etc/mongo37017.conf --replSet replicaset
说明:
$ mongod --replSet replicaset --dbpath /mongo/data/ --port 37017 --oplogSize 1024
--replSet 设置副本集名称,其中application是副本集的名称,节点必须相同,
--dbpath指定数据库储存路径,
--port指定侦听端口,
--oplogSize指定数据同步之前的缓存的空间大小,暂时指定1G。
路径、端口。我已设置在配置文件中

3.进入mongo shell(128/129/130)

代码语言:javascript
复制
# mongo --host 192.168.225.128 --port 37017
# mongo --host 192.168.225.129 --port 37017
# mongo --host 192.168.225.130 --port 37017

4.配置replica set,增加成员(128)

代码语言:javascript
复制
> conf=
{
    "_id" : "replicaset",
    "members" : [
        { "_id" : 0,  "host" : "192.168.225.128:37017"  },
        { "_id" : 1,  "host" : "192.168.225.129:37017"  },
        { "_id" : 2,  "host" : "192.168.225.130:37017"  }
    ]
}
初始化副本集
> rs.initiate(conf)
{ "ok" : 1 }
replicaset:OTHER>
说明:
设置1主1从1仲裁
> conf=
{
    "_id" : "replicaset",
    "members" : [
        { "_id" : 0,  "host" : "192.168.225.128:37017"  },
        { "_id" : 1,  "host" : "192.168.225.129:37017"  },
        { "_id" : 2,  "host" : "192.168.225.130:37017",  "arbiterOnly": true  }
    ]
}

等到所有成员配置完成之后,Replica Set 会自动选举出一个Primary 节点,两个Secondary 节点。在Primary 节点上进行更新操作,就能同步到Secondary 节点了。 也可执行rs.isMaster(),确认为主 执行完后,会看到shell的提示符已经改变为 replicaset:PRIMARY>

5.查看集群状态

replicaset:PRIMARY> rs.status();

6.到此整个副本集已经搭建完成

7.查看当前副本集的配置表

代码语言:javascript
复制
 replicaset:PRIMARY> rs.conf()

8.写操作测试

代码语言:javascript
复制
128:
replicaset:PRIMARY> use szy
replicaset:PRIMARY> db.createCollection("mycoll")
replicaset:PRIMARY> db.mycoll.insert({name:'lcl',datetime:'2017-10-23'})
replicaset:PRIMARY> db.mycoll.find()
129:
replicaset:SECONDARY> db.mycoll.find()
Error: error: {"ok" : 0,"errmsg" : "not master and slaveOk=false","code" : 13435,"codeName" : "NotMasterNoSlaveOk" }
replicaset:SECONDARY> db.getMongo().setSlaveOk();
{ "_id" : ObjectId("59edb815a7d3f969241d0fa9"), "name" : "lcl", "datetime" : "2017-10-23" }

9.故障转移

1) 关闭128的mongo, 2) 129上rs.status()查看集群状态,发现128的stateStr变为(not reachable/healthy);129变为primary;130变为secondary 3)重启启动128的mongo:

mongod -f /etc/mongo37017.conf --replSet replicaset

将自动变为secondary

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、原理
  • 二、环境搭建
    • 1.安装mongodb(128/129/130)
      • 2.启动3台mongo
        • 3.进入mongo shell(128/129/130)
          • 4.配置replica set,增加成员(128)
            • 5.查看集群状态
              • 6.到此整个副本集已经搭建完成
                • 7.查看当前副本集的配置表
                  • 8.写操作测试
                    • 9.故障转移
                    • mongod -f /etc/mongo37017.conf --replSet replicaset
                    相关产品与服务
                    云数据库 MongoDB
                    腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档