版本: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. JVM学习笔记一:Java运行时数据区域

    1. 程序计数器 当前线程所执行的字节码的行号指示器. 2. Java虚拟机栈 线程私有,与线程具有相同生命周期.用于存储局部变量表.操作数栈.动态链表.方法出口等信息. 局部变量表存放内容: 基本数 ...

  2. Web前端有价值的博客文章汇总

    一.HTML 二.CSS 1.深入理解position和z-index属性 :https://www.cnblogs.com/zhuzhenwei918/p/6112034.html 2.BFC(清除 ...

  3. 移动端造json假数据时的坑(转义符问题)

    最近在 Json 数据的解析上碰到了一些坑,特此记录一下. 正文 迭代开发中,经常出现服务端接口还没开发完成的情况,所以经常需要移动端自己在本地造一些假数据. emmm,虽然说好像造假数据也不是什么很 ...

  4. linux下线程的两种封装方式

    在网络编程的时候往往需要对Linux下原生的pthread库中的函数进行封装,使其使用起来更加方便,封装方法一般有两种:面向对象和基于对象,下面将分别介绍这两种方式,最后统一分析这两种方式的优缺点: ...

  5. 洛谷 P1017 进制转换

    推荐洛谷 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1*10^2+2*10^1+ ...

  6. 记一次线上Curator使用过程JVM栈溢出解决

       为了同学们看起来一目了,特按如下思路进行讲解. 1.出现的场景    2.分析及解决的过程    3.总结 最近公司要使用zookeeper做配置管理(后面简称ZK),然后自己就提前用虚拟机进行 ...

  7. eclipse热部署web项目

    一.选中JavaEE视图 因为在普通的Java视图下,窗口下方没有server选项卡 二.双击Tomcat 注意:可能很多人当然包括我一开始的时候,都是喜欢右键Tomcat然后Add and remo ...

  8. 【Unity3D与23种设计模式】工厂方法模式(Factory Method)

    GoF中定义: "定义一个可以产生对象的接口,但是让子类决定要产生哪一个类的对象.工厂方法模式让类的实例化程序延迟到子类中实施" 当类的对象产生时,若出现下列情况: 1.需要复杂的 ...

  9. 【前端单元测试入门04】Karma

    Karma 官方介绍 A simple tool that allows you to execute JavaScript code in multiple real browsers. 即一个允许 ...

  10. 特殊权限chattr的用法

    1,只能对文件进行追加操作: [root@localhost tmp]# cat yum.log 22222222222222[root@localhost tmp]# chattr +a yum.l ...