版本:3.6

一、以单机模式启动成员节点

有时候出于维护的需要,需要以单机模式启动某个节点而不是一个副本集成员身份。

1).首先查询服务器命令行参数

db.serverCmdLineOpts()

2).关闭当前副本

3).以单机模式启动副本

这里需要指定副本原先的db路径,为了避免可能的其它连接这里可以指定一个新的port启动;也可以直接使用原先的配置文件启动只需要注释掉“replSet”参数即可。

mongod --port  --bind_ip 192.168.137.10,127.0.0.1 --dbpath /mongos27012/data/db4

4).维护完之后再以副本成员身份启动当前服务器。

二、检查写入是否成功

getLastError命令检查写入是否成功

db.runCommand({"getLastError":,"w":,"wtimeout":});

getLastErrorDefaults默认配置值

conf = rs.config();

conf.settings = {"getLastErrorDefaults" : {

                            "w" : ,

                            "wtimeout" : 

                            }

                            };

rs.reconfig(conf);

wtimeout:等待超时时长,如果超过这个时间MongoDB无法在指定时间内将写入操作复制到“w”个成员,返回超时。

w的多个值:

majority:一直等待保证大多数成员都执行完了写入操作

number(数字):w值包含主节点,如果设置1那么只保证主节点写入成功,如果希望被复制到N个节点,那么应该将“w”设置为N+1

三、自定义复制保证规则,设置成员标签

1.设置成员标签

conf = rs.config();

conf.members[].tags={"dc" : "dc01"};

conf.members[].tags={"dc" : "dc01"};

conf.members[].tags={"dc" : "dc02"};

rs.reconfig(conf);

上面操作设置了两个组,分别是dc01和dc02;

注意:

1.tags用来给每一个节点成员设置标签,它是一个集合所以可以像集合一样包含多个值,比如

{"dc": "rack1", disk:"ssd", ssd: "installed"}

2.如果要初始化tags必须先初始化settings.getLastErrorModes

2.配置规则,应用于settings选项

通过配置getLastErrorMode字段实现,每条规则的形式为:"name":{"key":number}.其中name是规则的名字,自己定,key就是上面tags的标识,number表示复制操作至少复制到多少个分组上,每个分组内至少一台机器上.

conf = rs.config();

conf.settings.getLastErrorModes={"eachDC":{"dc":}                                                }

rs.reconfig(conf);

初始化getLastErrorModes

conf = rs.config();

conf.settings.getLastErrorModes={}

rs.reconfig(conf);

3.插入记录并应用规则

db.users.insert( { id: "xyz", status: "A" }, { writeConcern: { w:"eachDC" } } );

注意:如果不想数据复制到某个节点,可以不给这个节点配置标签,这样该成员就是隐藏成员。

conf = rs.config();

conf.members[].tags={};

rs.reconfig(conf);

4.注意事项

conf = rs.conf()

conf.members[].tags = { "dc": "east", "production": "node-1" }

conf.members[].tags = { "dc": "east", "production": "node-2" }

conf.members[].tags = { "dc": "east", "production": "node-3" }

rs.reconfig(conf)

下面的规则可以创建成功,因为标签production拥有三个不同的组

conf.settings = {

    getLastErrorModes: {

        productionWriteConcern : { "production":  }

    }

}

下面的规则不能创建成功,因为标签dc只有一个唯一的组

conf.settings = {

    getLastErrorModes: {

        dcWriteConcern : { "dc":  }

    }

}

四、副本集配置

副本集的配置在local.system.replSet集合中。副本集中所有成员的的该文档记录都是相同的。

rs.:副本命令,是replSet是缩写,代表副本集。

db.:数据库命令,比如db.printReplicationInfo(),db.printSlaveReplicationInfo()

rs.status:查看成员的复制状态,可以在任意节点执行。

rs.config():可以得到当前副本的配置,修改配置文件,然后将修改后的配置文件传递给                      reconfig、initiate命令。

rs.reconfig()(replSetReconfig):修改副本集的配置。rs.reconfig(conf,{"force":true})

rs.initiate():会初始化配置,只需要对副本集中的一个成员调用rs.initiate就可以(一般主节点),收到initiate命令的成员会自动将配置文件传递给副本集中的其他成员

1.创建副本集

1).登入

mongo --port 

2).切换admin数据库

use admin

3).验证权限

db.auth("dba","dba")

4).初始化复制集,默认会创建当前节点为主节点的副本集

rs.initiate()

5).重启当前节点

db.shutdownServer()

2.修改副本集成员

1).添加新成员,在主节点执行:

rs.add("192.168.137.10:27011")
可以在添加成员的时设定成员配置,也就是rs.conf中member的参数:
rs.add("_id":,"host":"192.168.137.10:27011", "priority" : , "hidden" : true)

2)删除成员

rs.remove("192.168.137.10:27012");

修改副本集成员配置时的限制:

1、不能修改_id;

2、不能将当前执行rs.reconfig命令的成员的优先级设置为 0;

3、不能将仲裁者成员变为非仲裁者成员,反正亦然;

4、不能将buildIndexes由false改为 true;

3.保证主节点不切换

将所有的备份节点的priority和votes都设置为0;这样只有主节点有投票权所以无论备份节点是否存在都不会导致主节点的状态由primary变成other。

conf=rs.config()

conf.members[].priority=

conf.members[].votes=

rs.reconfig(conf)

4.强制重新配置

如果副本集无法选出新的主节点,这时需要重新配置副本集。可以在备份节点上调用rs.reconfig(conf,{"force":ture})强制重新配置副本集。注意conf必须是正确、有效的配置。而且只允许在备份节点执行强制重新配置。

备份节点收到新的配置文件之后,就会修改自身的配置,并且将新的配置发送给副本集中的其他成员。副本集的其他成员收到新的配置文件之后,会判断配置文件的发送者是否是它们当前配置中的一个成员,如果是,才会用心的配置文件对自己进行重新配置。所以,如果新的配置修改了某些成员的主机名,则应该关闭被修改主机名的节点,并以单机模式启动,手动修改locak.system.replset文档,然后以副本集的方式重新启动。

5.修改成员状态

1).把主节点变为备份节点,在主节点执行

rs.stepDown()

rs.stepDown(60):让主节点退化为备份节点,并维持60秒。如果这段时间内没有新的主节点被选举出来,那么当前节点可以要求重新参与进行选举。

2).阻止选举

如果需要对主节点进行维护操作,但是不希望这段时间内其它成员选举为主节点,可以在每个备份节点上执行freeze命令,以强制它们始终处于备份节点的状态。命令以秒为单位。

rs.freeze():保持1个小时处于备份节点状态。

rs.freeze():再次在备份节点执行且将时间指定为0就是“释放”备份节点。

注意:如果在退位的备份节点上执行rs.freeze(0),可以让退位的备份节点重新变为主节点。

6.禁用复制链

1).查看复制源

查询节点从哪个节点处复制。在备份节点上运行。

db.adminCommand({"replSetGetStatus":})['syncingTo'];

也可以运行rs.status(),查看"syncingTo"字段信息。

2.)复制链

MongoDB根据ping时间选择同步源,一个成员向另一个成员发送心跳请求,就知道心跳请求所耗费的时间(rs.status()中的"pingMs"记录了成员到达相关成员的所花费的平均时间)。MongosDB维护着不同成员间请求的平均花费时间。选择同步源时,会选择一个离自己比较近而且数据比自己新的成员。但是同一数据中心的成员可能会从同一数据中心的其他成员处复制,而不是从位于另一个数据中心的主节点处复制(这样可以减少网络流量),所以会出现复制链的情况,复制链越长会导致主节点的操作复制到所有的服务器所花费的时间越长。这对于需要从副本中读取数据的需求这种情况是不希望看到的。

3).修改复制源

db.adminCommand({"replSetSyncFrom":"192.168.137.10:27011"});

4).禁用复制链

conf = rs.conf()
conf.settings.chainingAllowed = false
rs.reconfig(conf)

在主副本中执行

7.计算延迟

1).查看当前副本集oplog状态

rs.printReplicationInfo()

configured oplog size:oplog配置的大小

log length start to end:oplog包含的操作时长。

oplog first event time:oplog第一条操作的时间。

oplog last event time:oplog最后一条操作的时间。

now:当前时间。

注意:oplog中第一条操作与最后一条操作的时间差就是操作日志的长度。

2).查看复制延迟

rs.printSlaveReplicationInfo()

会显示当前所有的备份节点同步时间,和落后主节点的时长。

8.调整oplog大小

1)  如果是主节点,将主节点变成备份节点。

2)  将oplog中的最后一条insert操作保存到其它集合中。

use local

db.tempLastOp20180330.save( db.oplog.rs.find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next() )

3)   关闭当前服务器

4)   以单机模式启动,可以指定一个新的端口,或者将replSet注释掉已配置文件启动

mongod --port  --bind_ip 192.168.137.10,127.0.0.1 --dbpath /mongos27012/data/db

5)   删除当前oplog

db.oplog.rs.drop();

6)   创建新的oplog

db.createCollection("oplog.rs",{"capped":true,"size":})
db.createCollection("oplog.rs",{"capped":true,"size":(2*1024*1024*1024)})

7)  将最后一条insert记录写回oplog

var tempLastOp=db.tempLastOp20180330.find().next()
db.oplog.rs.insert(tempLastOp)
db.oplog.rs.find()

8)  以副本成员身份启动当前服务器

五、复制集监控

1.复制集状态查询:rs.status()

2.查看当前副本集oplog状态:rs.printReplicationInfo()

3.查看复制延迟:rs.printSlaveReplicationInfo()

4.查看服务状态详情:db.serverStatus()

5.查询副本集配置:rs.conf()

6.主副本查询:db.isMaster()

副本配置:https://docs.mongodb.com/manual/reference/replica-configuration/#rsconf.settings.getLastErrorDefaults

备注:

作者:pursuer.chen

博客:http://www.cnblogs.com/chenmh

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接,否则保留追究责任的权利。

《欢迎交流讨论》

MongoDB 副本集管理的更多相关文章

  1. MongoDB 副本集管理(不定时更新)

    简介: 前面介绍完了副本集的搭建.用户的管理.参数和日常操作的说明,那副本集搭建好该如何管理呢?现在来说明下副本集的日常查看和管理. 说明: 1)查看命令行参数:db.serverCmdLineOpt ...

  2. 四十三.MongoDB副本集 MongoDB文档管理

    一.部署MongoDB副本集 1.1 启用副本集配置并指定集群名称 rs1 1.2 定义集群成员列表 部署好机器51,52,53:51上配置 bind_ip=192.168.4.51(要改) port ...

  3. MongoDB副本集的常用操作及原理

    本文是对MongoDB副本集常用操作的一个汇总,同时也穿插着介绍了操作背后的原理及注意点. 结合之前的文章:MongoDB副本集的搭建,大家可以在较短的时间内熟悉MongoDB的搭建和管理. 下面的操 ...

  4. MongoDB副本集功能及节点属性梳理

    副本集的主要功能 副本集是MongoDB高可用的基础,其主要作用 归纳为以下几点: (1)高可用,防止设备(服务器.网络)故障.提供自动FailOver功能. (2)无需配置高可用性虚拟节点:无论是S ...

  5. NoSQL数据库Mongodb副本集架构(Replica Set)高可用部署

    NoSQL数据库Mongodb副本集架构(Replica Set)高可用部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. MongoDB 是一个基于分布式文件存储的数据库.由 C ...

  6. MongoDB副本集(一主一备+仲裁)环境部署-运维操作记录

    MongoDB复制集是一个带有故障转移的主从集群.是从现有的主从模式演变而来,增加了自动故障转移和节点成员自动恢复.MongoDB复制集模式中没有固定的主结点,在启动后,多个服务节点间将自动选举产生一 ...

  7. mongodb副本集用户权限设置

     mongodb副本集用户权限设置  用户权限参考文章 一:先看看MongoDB中用户的角色说明 read :   数据库的只读权限,包括: aggregate,checkShardingIndex, ...

  8. MongoDB副本集的工作原理

    在MongoDB副本集中,主节点负责处理客户端的读写请求,备份节点则负责映射主节点的数据. 备份节点的工作原理过程可以大致描述为,备份节点定期轮询主节点上的数据操作,然后对自己的数据副本进行这些操作, ...

  9. 006.MongoDB副本集

    一 MongoDB 复制(副本集) 1.1 复制概述 MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的 ...

随机推荐

  1. [SDOI2013]费用流

    然而这是一道网络流... 如果满足Bob,使总费用最大: 设最大流的每条边流量(不是容量)为w[i],分配到每条边的费用为p[i],最大流量为wmax,p[i]的和为P 那么显然w[i] * p[i] ...

  2. Spark ML源码分析之一 设计框架解读

    本博客为作者原创,如需转载请注明参考           在深入理解Spark ML中的各类算法之前,先理一下整个库的设计框架,是非常有必要的,优秀的框架是对复杂问题的抽象和解剖,对这种抽象的学习本身 ...

  3. react ( 二 )

    ref属性 当我们在 react组件中要访问真实的DOM元素时,你可能需要用到ref属性,ref接收一个函数作为属性值,函数接收一个参数,这个参数就是真实的DOM元素.真实的DOM元素渲染到页面上之后 ...

  4. 数据分析之Pandas和Numpy学习笔记(持续更新)<1>

    pandas and numpy notebook        最近工作交接,整理电脑资料时看到了之前的基于Jupyter学习数据分析相关模块学习笔记.想着拿出来分享一下,可是Jupyter导出来h ...

  5. Docker(二):Dockerfile 使用介绍

    上一篇文章Docker(一):Docker入门教程介绍了 Docker 基本概念,其中镜像.容器和 Dockerfile .我们使用 Dockerfile 定义镜像,依赖镜像来运行容器,因此 Dock ...

  6. oracle sql model从句demo

    model从句作用 sql model可以完成像EXCEL工作表的数据内容扩展.计算填充的功能 关键词解释 partition 分区关键词,白话就是分组 dimension 度量关键词,白话就是要取出 ...

  7. Angular开发实践(二):HRM运行机制

    引言 在angular-start项目中启用了模块热替换(HMR - Hot Module Replacement)功能,关于如何在angular-cli启用HRM,请查看HRM配置 那HMR是个什么 ...

  8. python全栈开发-Day7 字符编码总结

    python全栈开发-Day7 字符编码总结 一.字符编码总结 1.什么是字符编码 人类的字符--------->翻译--------->数字 翻译的过程遵循的标准即字符编码(就是一个字符 ...

  9. Ubuntu下sudo命令出现无法解析主机名

    替换hosts文件后sudo命令提示 无法解析主机名 把hosts文件中127.0.0.1后的名字改为主机名,即 /etc/hostname 中的名字

  10. Sql Server 索引以及页和区

    索引(Index),相信大家都知道就是给表中的数据添加了一个目录,使我们可以快速检索到我们想要的数据,但这个目录是什么?SqlServer又是如何管理的?要搞明白这些,我们就要先了解sqlserver ...