1.修改oplog的大小 

需要在每个机器上都配置。先在secondary上操作,最后在primary上操作。
1)以单机的方式重启复制集的实例
  1. db.shutdownServer()
在新的端口中启动实例
  1. mongod --port 37017 --dbpath /usr/local/mongodb-linux-x86_64-3.2.0/data
2)备份原来的oplog
  1. [root@node1 mongodb-linux-x86_64-3.2.0]# mongodump --db local --collection 'oplog.rs' --port 37017 2015-12-27T02:27:40.577+0800 writing local.oplog.rs to dump/local/oplog.rs.bson 2015-12-27T02:27:40.579+0800 done dumping local.oplog.rs (4 documents)
3)复制最新的oplog条目到tmp表
  1. [root@node1 mongodb-linux-x86_64-3.2.0]# mongo --port 37017
  2. MongoDB shell version: 3.2.0
  3. connecting to: 127.0.0.1:37017/test
  4. > db.temp.save(db.oplog.rs.find({},{ts:1,h:1}).sort({$natural:-1}).limit(1).next());
  5. WriteResult({ "nInserted" : 1 })
  6. > db.temp.find();
  7. { "_id" : ObjectId("567edd9e48b1a3ebcf06049c"), "ts" : Timestamp(1451203909, 1), "h" : NumberLong("4300737341732033822") }
4)删除原来的oplog
  1. db.oplog.rs.drop()
5)重建oplog
    1. db.runCommand( { create: "oplog.rs", capped: true, size: (2 * 1024 * 1024 * 1024) } )
    2. (单位是字节)
    3. db.oplog.rs.save( db.temp.findOne() ) 把temp中oplog保存到新建的oplog中
    4. db.oplog.rs.find()

6)关闭实例,启动实例为replications sets的成员
  1. db.shutdownServer()
  2. mongod --replSet rs0 --dbpath /usr/local/mongodb-linux-x86_64-3.2.0/data
7)在primary中执行
切换primary为secondary:
  1. rs.stepDown()
然后重复以上操作。

2.执行维护任务的步骤
上面介绍了如何修改oplog。对于Recplication sets来说,执行维护任务的最常用流程如下:
1)关闭secondary节点
use admin
db.shutdownServer()
2)以单实例的方式在不同端口启动该结点
mongod --dbpath /usr/mongodb/data/db --port 37017
3)执行维护任务,比如升级数据库
4)关闭单实例节点
use admin
db.shutdownServer()
5)以replication sets的方式启动节点
mongod --replSet "rs01" --dbpath /usr/local/data/db --port 27017
按上面的方式把所有secondary节点处理完。

在主节点上:
1)执行db.stepDown()切换为secondary节点
2)按照上面的1-5执行

3.强制某个节点变成主节点
原理就是修改节点的优先级。
1)方法一:
有m1,m2,m3三个节点,原来m1是主节点,优先级都是1.执行以下操作:
  1. cfg = rs.conf()
  2. cfg.members[0].priority = 0.5
  3. cfg.members[1].priority = 0.5
  4. cfg.members[2].priority = 1
  5. rs.reconfig(cfg)
此时 m3的优先级最高。如果m3和m1之间的同步进度小于10秒,m1就切换为scondary节点m3就切换为primary节点;如果m3和m1之间的同步进度大于10秒,就先不切换,直接到m3追上m1(进度差小于10秒)

即使m3和m1之间的进度差大于10秒,想让m1变成secondary节点可以执行:
  1. db.adminCommand({replSetStepDown: 86400, force: 1})  24小时内让其成为主节点
此时全部节点为secondary,没有primary节点!
等到m3赶上m1的进度,m3就成了primary节点。

2)方法二
使用命令设置primary
m1,m2,m3,m1为主节点.
在m2上进入mongo:
  1. mongo
  2. >rs.freeze(120);120秒内不能成为主节点
在m1上执行:
  1. mongo
  2. >rs.stepDown(120);120秒内不能成为主节点
这时打开m3发现已经成为主节点。

4.节点执行resync
有两种方式实现resync:
a.清空--dbpath目录,自动实现resync
b.复制其它节点的--dbpath目录内容,然后启动实例,自动使用oplog同步

1)自动resync
a.关闭节点 db.shutdownServer()
b.清空--dbpath目录里的所有内容
c.以replication sets方式启动实例

2)手动复制数据
a.在源节点上做--dbpath的磁盘快照;复制磁盘快照或者直接复制--dbpath目录。
b.替换本节点上的--dbpath目录。
c.启动实例
问题:由于源节点上的--dbpath目录一直在改变,可能无法复制--dbpath目录。所以要做数据快照。

5.强制重新配置replication sets
某些情况下(primary宕机又不能选出primary、配置错误导致大部分的节点宕机),可以使用强制措施重新配置replication sets.正常情况下不要使用。
1)连接到没有宕机的节点上
2)执行
cfg = rs.conf() 

cfg.members = [cfg.members[0] , cfg.members[4] , cfg.members[7]]  去掉宕机的节点
rs.reconfig(cfg, {force : true})  
然后这个设置自动传播到其它节点,之后节点会选出一个primary.

6.Trouble shooting
1)检查replications set状态
rs.status();
2)检查复制间隙
  1. rs0:SECONDARY> rs.printSlaveReplicationInfo();
  2. source: 192.168.75.10:27017
  3. syncedTo: Sun Dec 27 2015 16:11:49 GMT+0800 (CST)
  4. 0 secs (0 hrs) behind the primary
  5. source: 192.168.75.11:27017
  6. syncedTo: Sun Dec 27 2015 16:11:49 GMT+0800 (CST)
  7. 0 secs (0 hrs) behind the primary
有延迟的secondary节点也可能显示落后primary节点0秒。原因:主节点的空闲时间大于从节点上的SlaveDelay值。
复制间隙产生的原因:
  • 网络原因
  • 磁盘原因
  • 大量并发
  • 大量写数据
  • oplog
3)测试连接性
用mongo --host --port  测试各个节点

4)检查oplog日志
rs.printReplicationInfo() 
oplog的日志的大小应该满足至少24个小时的操作,一般48小时或者72小时最好

5) 日志入口时间错误
错误信息:
replSet error fatal couldn't query the local local.oplog.rs collection. Terminating mongod after 30 <timestamp> [rsStart] bad replSet oplog entry?  
原因:一般是由oplog最新一条的ts字段的格式错误造成的。该字段的格式是timestamp。
检查字段:
  1. db = db.getSiblingDB("local")
  2. db.oplog.rs.find().sort({$natural:-1}).limit(1)
  3. db.oplog.rs.find({ts:{$type:17}}).sort({$natural:-1}).limit(1)
如果两个查询没有返回相同的结果,说明日志有错误:
  1. 第一个查询结果
  2. { "ts" : {t: 1347982456000, i: 1},
  3. "h" : NumberLong("8191276672478122996"),
  4. "op" : "n",
  5. "ns" : "",
  6. "o" : { "msg" : "Reconfig set", "version" : 4 } }
  7. 第二个查询结果
  8. { "ts" : Timestamp(1347982454000, 1),
  9. "h" : NumberLong("6188469075153256465"),
  10. "op" : "n",
  11. "ns" : "",
  12. "o" : { "msg" : "Reconfig set", "version" : 3 } }
更新错误的条目:
  1. db.oplog.rs.update( { ts: { t:1347982456000, i:1 } },{ $set: { ts: new Timestamp(1347982456000, 1)}})

7.复制集相关的函数


8.复制输命令




















MongoDB复制二:复制集的管理的更多相关文章

  1. MongoDB高可用架构集群管理(一)

    MongoDB数据库核心的两个特点:第一个特点是副本集的自动切换,保证数据的高可靠.服务的高可用:第二个特点是自动分片.服务的横向扩展能力. (一)副本集架构 MongoDB的副本集是一组保持相同数据 ...

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

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

  3. mongodb 3.4复制集配置

    1:启动三个实例 /bin/mongod --config /home/mongodb/db27017/mongodb27017.conf /bin/mongod --config /home/mon ...

  4. mongodb 3.4复制集详解

    1关闭数据库,打开三个mongodb数据库数据库实例 rs.printReplicationInfo() 2:原理 主库能够进行读写操作,一个复制集群只能有一个活跃的主库 一般情况下复制可以分为好几种 ...

  5. mongodb 复制(副本集)

    复制(副本集) 什么是复制 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,并可以保证数据的安全性 复制还允许从硬件故障和服务中断中恢复数据 为什么要复制 数据备份 数据灾 ...

  6. 学习mongo系列(九)索引,聚合,复制(副本集),分片

    一.索引 二.聚合 三.复制(副本集) 四.分片 尚未实践操作. 详见http://www.runoob.com/mongodb/mongodb-indexing.html

  7. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之自签TLS证书及Etcd集群部署(二)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.服务器设置 1.把每一 ...

  8. MySQL复制(二)--基于二进制日志文件(binlog)配置复制

    基础环境:   主库 从库 服务器IP地址 192.168.10.11 192.168.10.12 版本 5.7.24 5.7.24 已存在的数据库 mysql> show databases; ...

  9. MongoDB 事务,复制和分片的关系

    摘要:本文尝试对Mongo的复制和分布式事务的原理进行描述,在必要的地方,对实现的正确性进行论证,希望能为MongoDB内核爱好者提供一些参考. 1.前言 MongoDB基于wiredTiger提供的 ...

  10. MySQL全同步复制基于GR集群架构实现(Centos7)

    目录 一. 理论概述 概述 二. 部署 向组加入新节点 测试 三.总结 一. 理论概述 概述 本案例操作的是针对于MySQL的复制类型中的全同步复制,对几种复制类型简单总结下: 异步复制:MySQL默 ...

随机推荐

  1. JavaScript:改变 HTML 内容

    使用Javascript来处理HTML元素的内容是非常强大的功能. <!DOCTYPE html><html><head><meta http-equiv=& ...

  2. 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)(Finchley版本)

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f5-zuul/ 本文出自方志朋的博客 在微服务架构中,需要几 ...

  3. Knowledge Point 20180305 机器数转换与进制转换

    机器数(这里的机器数说的就是数值在计算机中的存储形式,相关可以了解数据在计算机中的表示)之间的转换往往是通过原码来实现的,下面我们结合进制来来一下: 进制也就是进位制,是人们规定的一种进位方法. 对于 ...

  4. Python实现爬虫从网络上下载文档

    最近在学习Python,自然接触到了爬虫,写了一个小型爬虫软件,从初始Url解析网页,使用正则获取待爬取链接,使用beautifulsoup解析获取文本,使用自己写的输出器可以将文本输出保存,具体代码 ...

  5. mysqldump备份与基于bin-log实现完全恢复

    MySQL数据库备份是一项非常重要的工作,mysql的备份主要分为逻辑备份和物理备份,同时,不同的生产环境要备份的策略也不会不同.下面先说一说备份时要考虑到的一些因素,然后再实际操作进行不同方式的数据 ...

  6. kali下添加用户和权限分配

    1.添加用户 useradd -m test #-m的意思是创建用户的主目录 2.为用户test设置密码. passwd test 3.为添加的用户赋予权限(-a 添加 :-G 群组) 如果没有这一步 ...

  7. js 节点

    var chils= s.childNodes; //得到s的全部子节点 var par=s.parentNode;  //得到s的父节点 var ns=s.nextSbiling;  //获得s的下 ...

  8. FROM_UNIXTIME

    FROM_UNIXTIME 格式化MYSQL时间戳函数   函数:FROM_UNIXTIME作用:将MYSQL中以INT(11)存储的时间以"YYYY-MM-DD"格式来显示.语法 ...

  9. IT类职位常用缩写 SA SD RD PG PM DBA MIS QA Sales

    身为IT民工的基本常识,IT类职位常用缩写 SA (System Analyst) 系统分析师 在软体开发团队中,属于中高阶的基层管理者与领导者.除了须具备优秀的文字.语言沟通能力之外,还要有良好的分 ...

  10. SQL语句笔记/好记性不如烂笔头/持续更新

    常用的增删改查操作,针对库,表,字段,记录分类有助于记忆,当然熟能生巧,还是需要多多实操 库操作 删除库 drop database dbx; 列出所有库 show databases; 切换库 us ...