版本: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. [BZOJ1022] [SHOI2008] 小约翰的游戏John (SJ定理)

    Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取 ...

  2. wpf研究之道-grid控件

    想要说些什么,却不知道从哪开始."形而上谓之道,形而下谓之器".与其坐而论道,不如脚踏实地,从最实用的地方开始. 我们先来看看wpf中的grid控件.grid控件是个网格的布局控件 ...

  3. 属性动画 ValueAnimator 运行原理全解析

    最近下班时间都用来健身还有看书了,博客被晾了一段时间了,原谅我~~~~ 提问环节 好,废话不多说,之前我们已经分析过 View 动画 Animation 运行原理解析,那么这次就来学习下属性动画的运行 ...

  4. ### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: An attempt by a client to chec

    数据库连接超时,是数据库连接时的相关配置写错,例如:数据库密码,驱动等问题

  5. Facebook兆级别图片存储及每秒百万级别图片查询原理

    前言 Facebook(后面简称fb)是世界最大的社交平台,需要存储的数据时刻都在不断剧增(占比最大为图片,每天存储约20亿张,大概是微信的三倍). 那么问题来了,fb是如何存储兆级别的图片?并且又是 ...

  6. canvas 绘制图形

    canvas 绘制图形: 注意: canvas 的宽高设置在行内,否则会使画布(canvas)产生扭曲,绘图变形: <!DOCTYPE html> <html lang=" ...

  7. Tensorflow小技巧整理:修改张量特定元素的值

    TensorFlow小技巧整理:修改张量特定元素的值 最近在做一个摘要生成的项目,过程中遇到了很多小问题,从网上查阅了许多别人解决不同问题的方法,自己也在旁边开了个jupyter notebook搞些 ...

  8. 5分钟学习spark streaming之 轻松在浏览器运行和修改Word Counts

    方案一:根据官方实例,下载预编译好的版本,执行以下步骤: nc -lk 9999 作为实时数据源 ./bin/run-example org.apache.spark.examples.sql.str ...

  9. MySQL数据库学习一 数据库概述

    1.1 数据库管理技术的发展阶段 人工管理阶段,文件系统阶段,数据库系统阶段. 1.2 数据库系统阶段涉及的概念 数据库(Database DB):是指长期保存在计算机的存储设备上,按照一定的规则组织 ...

  10. 详解Tomcat线程池原理及参数释义

    omcat线程池有如下参数: maxThreads, 最大线程数,tomcat能创建来处理请求的最大线程数 maxSpareTHreads, 最大空闲线程数,在最大空闲时间内活跃过,但现在处于空闲,若 ...