MongoDB 副本集管理(不定时更新)
简介:
前面介绍完了副本集的搭建、用户的管理、参数和日常操作的说明,那副本集搭建好该如何管理呢?现在来说明下副本集的日常查看和管理。
说明:
1)查看命令行参数:db.serverCmdLineOpts()
zjy:PRIMARY> db.serverCmdLineOpts()
{
"argv" : [
"mongod",
"-f",
"/etc/mongodb/mongodb_27017.conf"
],
"parsed" : {
"config" : "/etc/mongodb/mongodb_27017.conf",
"diaglog" : 3,
"net" : {
"maxIncomingConnections" : 50,
"port" : 27017,
"unixDomainSocket" : {
"pathPrefix" : "/tmp"
}
},
"processManagement" : {
"fork" : true,
"pidFilePath" : "/var/run/mongo_27017.pid"
},
"replication" : {
"replSet" : "zjy/127.0.0.1:27018"
},
"storage" : {
"dbPath" : "/usr/local/mongo1/",
"mmapv1" : {
"nsSize" : 16
}
},
"systemLog" : {
"destination" : "file",
"logAppend" : true,
"path" : "/var/log/mongodb/mongodb1.log"
}
},
"ok" : 1
}
2)查看副本集状态:rs.status()
zjy:PRIMARY> rs.status()
{
"set" : "zjy", #副本集名称
"date" : ISODate("2015-06-30T04:07:29.380Z"), #执行时间
"myState" : ,
"members" : [ #成员
{
"_id" : ,
"name" : "127.0.0.1:27017", #成员名称
"health" : ,
"state" : , #成员状态,1:Primary
"stateStr" : "PRIMARY", #状态描述
"uptime" : , #副本集运行时间,Primary为MongoDB运行时间,单位秒
"optime" : Timestamp(1435301307, 10), #最近一次更改数据库的时间:1435301307;每秒执行操作数据库的次数:10
"optimeDate" : ISODate("2015-06-26T06:48:27Z"),#最后一个操作发生的时间
"electionTime" : Timestamp(, ),
"electionDate" : ISODate("2015-06-29T20:35:50Z"),#最后选举时间
"configVersion" : ,
"self" : true #执行该命令函数的成员
},
{
"_id" : ,
"name" : "127.0.0.1:27018",
"health" : ,
"state" : , #成员状态,2:Secondary
"stateStr" : "SECONDARY",
"uptime" : ,
"optime" : Timestamp(, ),
"optimeDate" : ISODate("2015-06-26T06:48:27Z"),
"lastHeartbeat" : ISODate("2015-06-30T04:07:28.589Z"), #最后一次收到其他成员心跳时间
"lastHeartbeatRecv" : ISODate("2015-06-30T04:07:27.784Z"),
"pingMs" : , #心跳发送到达时间,根据其选择从哪个成员进行同步
"syncingTo" : "127.0.0.1:27017", #同步成员地址
"configVersion" :
},
{
"_id" : ,
"name" : "127.0.0.1:27019",
"health" : ,
"state" : ,
"stateStr" : "SECONDARY",
"uptime" : ,
"optime" : Timestamp(, ),
"optimeDate" : ISODate("2015-06-26T06:48:27Z"),
"lastHeartbeat" : ISODate("2015-06-30T04:07:28.521Z"),
"lastHeartbeatRecv" : ISODate("2015-06-30T04:07:28.521Z"),
"pingMs" : ,
"syncingTo" : "127.0.0.1:27017",
"configVersion" :
}
],
"ok" :
}
mongod实例每隔两秒就会向其他成员发送一个心跳包,并且通过rs.status()中返回的成员的health来判断成员的状态。如果primary节点不可用了,那么复制集中的所有secondary节点都会触发一次选举操作。选出新的primary节点。如果secondary节点有多个,则会选举拥有最新oplog时间戳记录的或者有较高权限的节点成为primary(注意:如果secondary停止时间过长,导致primary节点的oplog内容被循环写覆盖掉,则需要手动同步secondary节点)。
3)添加、删除副本集成员:rs.add,rs.addArb(),rs.remove(),rs.reconfig()
,添加成员
rs.add('127.0.0.1:27020')
在添加成员之前,需要在目标成员里加上repset参数。 ,添加复杂的成员:
rs.add({"_id":,"host":"192.168.200.252:27017","priority":,"hidden":true,"slaveDelay":60})
不会成为主节点(被动节点),隐藏节点、延迟60s同步数据。适用于当作备份;
rs.add({"_id":,"host":"192.168.200.252:27017","votes":})
没有选举权限的节点,即使只剩下单个服务器的副本集,也不会成为Secondary
rs.add({"_id":,"host":"192.168.200.252:27017","buildIndexes":false})
不会同步索引的创建
rs.add({"_id":,"host":"192.168.200.252:27017","arbiterOnly":true}) rs.addArb()
只选举,不会同步数据 以上都可以通过rs.reconfig()来实现。
,删除成员
rs.remove('127.0.0.1:27020')
4)查看副本集的配置:rs.config()
zjy:PRIMARY> rs.config()
{
"_id" : "zjy", #副本集名称
"version" : ,
"members" : [ #各成员的配置选项
{
"_id" : ,
"host" : "127.0.0.1:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : ,
"tags" : { },
"slaveDelay" : ,
"votes" :
},
...
...
...
],
"settings" : {
"chainingAllowed" : false,
"heartbeatTimeoutSecs" : ,
"getLastErrorModes" : { },
"getLastErrorDefaults" : {
"w" : ,
"wtimeout" :
}
}
}
5)修改任一Secondary的同步源:replSetSyncFrom(rs.syncFrom()),需要在Secondary上执行。
查看其中的一个Secondary的同步源
zjy:SECONDARY> db.adminCommand({"replSetGetStatus":}).syncingTo
127.0.0.1:
# 本机是27019实例,暂时需要把这个实例从27018上同步:
zjy:SECONDARY> db.adminCommand({"replSetSyncFrom":"127.0.0.1:27018"}) <==>rs.syncFrom("127.0.0.1:27018")
{
"syncFromRequested" : "127.0.0.1:27018",
"prevSyncTarget" : "127.0.0.1:27017",
"ok" :
}
zjy:SECONDARY> db.adminCommand({"replSetGetStatus":}).syncingTo
127.0.0.1:27018
也可以通过rs.status()来查看其同步源
zjy:SECONDARY> rs.status().syncingTo
127.0.0.1:
6)让任一Secondary进入维护模式:replSetMaintenance,必须在Secondary里的admin下运行,之后会进入RECOVERING状态。
在副本集上执行某个耗时的操作,会让成员进入recovering模式,不会有读请求发送给他,如何一个成员远落后主,可以强制让其进入维护模式。
zjy:SECONDARY> rs.status().members
[
...
...
{
"_id" : ,
"name" : "127.0.0.1:27019",
"health" : ,
"state" : ,
"stateStr" : "SECONDARY",
"uptime" : ,
"optime" : Timestamp(, ),
"optimeDate" : ISODate("2015-06-26T06:48:27Z"),
"syncingTo" : "127.0.0.1:27018",
"configVersion" : ,
"self" : true
}
]
zjy:SECONDARY> db.adminCommand({"replSetMaintenance":true})
{ "ok" : }
zjy:RECOVERING> rs.status().members
[
...
...
{
"_id" : ,
"name" : "127.0.0.1:27019",
"health" : ,
"state" : ,
"stateStr" : "RECOVERING",
"uptime" : ,
"optime" : Timestamp(, ),
"optimeDate" : ISODate("2015-06-26T06:48:27Z"),
"syncingTo" : "127.0.0.1:27018",
"maintenanceMode" : ,
"configVersion" : ,
"self" : true
}
] 看到127.0.0.: 进入了RECOVERING
当进入维护模式之后,该节点的数据就不能读取了:
zjy:RECOVERING> db.aoe.find()
Error: error: {
"$err" : "not master or secondary; cannot currently read from this replSet member",
"code" :
}
退出维护模式:
zjy:RECOVERING> db.adminCommand({"replSetMaintenance":false})
{ "ok" : }
zjy:SECONDARY> rs.status().members
[
...
...
{
"_id" : ,
"name" : "127.0.0.1:27019",
"health" : ,
"state" : ,
"stateStr" : "SECONDARY",
"uptime" : ,
"optime" : Timestamp(, ),
"optimeDate" : ISODate("2015-06-26T06:48:27Z"),
"syncingTo" : "127.0.0.1:27017",
"configVersion" : ,
"self" : true
}
]
7)限制副本集自动寻找数据源的功能:chainingAllowed
由于配置好的副本集都是自动的对同步源进行分配,根据pingMS来寻找最新的数据源,可能某个Secondary是另一个Secondary的同步源。下面就可以关闭自动分配,同步源指到Primary上:
zjy:PRIMARY> rs.config().settings
{
"chainingAllowed" : true,
"heartbeatTimeoutSecs" : ,
"getLastErrorModes" : { },
"getLastErrorDefaults" : {
"w" : ,
"wtimeout" :
}
}
zjy:PRIMARY> var cfg=rs.config()
zjy:PRIMARY> cfg.settings.chainingAllowed
true
zjy:PRIMARY> cfg.settings.chainingAllowed=false
false
zjy:PRIMARY> cfg.settings.chainingAllowed
false
zjy:PRIMARY> rs.reconfig(cfg)
{ "ok" : }
zjy:PRIMARY> rs.config().settings
{
"chainingAllowed" : false,
"heartbeatTimeoutSecs" : ,
"getLastErrorModes" : { },
"getLastErrorDefaults" : {
"w" : ,
"wtimeout" :
}
}
取消自动数据源分配的功能,可以有效的防止复制链的出现。但在一定的程度上会加大对Primary的压力。
8)主节点变成备份节点:rs.stepDown(time),rs.freeze(time)
rs.stepDown(time) 可以让主节点退成备份节点,timie单位是秒,默认60s。60s内主被副本集的其他成员获得,时间到后,会重新进行选举,一般都会重新成为主(优先级)。
rs.freeze(time):阻止选举,始终出于备份节点状态。比如主节点需要做一些维护,不希望其他成员选举为主节点,可以在每个备份节点上执行。强制他们出于备份节点状态。
zjy:PRIMARY> rs.stepDown() #退位60秒,60秒内成为备份节点。
...
...
--30T12::01.670- I NETWORK trying reconnect to 127.0.0.1: (127.0.0.1) failed
--30T12::01.671- I NETWORK reconnect 127.0.0.1: (127.0.0.1) ok
zjy:SECONDARY> zjy:SECONDARY> rs.freeze() #10秒内保持备份节点状态。
{ "ok" : }
9)复制延迟状态查看
zjy:PRIMARY> db.printReplicationInfo() #主上执行,
configured oplog size: .249984741211MB #oplog大小
log length start to end: 4086845secs (.23hrs) #oplog使用的时间长度
oplog first event time: Thu May :: GMT- (EDT) #最先一次操作时间
oplog last event time: Tue Jun :: GMT- (EDT) #最后一次操作时间
now: Tue Jun :: GMT- (EDT) #当前时间 zjy:SECONDARY> db.printSlaveReplicationInfo() #从上执行,各个从的落后时间
source: 127.0.0.1:
syncedTo: Tue Jun :: GMT- (EDT)
secs ( hrs) behind the primary #落后时间
source: 127.0.0.1:
syncedTo: Tue Jun :: GMT- (EDT)
secs ( hrs) behind the primary
10)
MongoDB 副本集管理(不定时更新)的更多相关文章
- MongoDB 副本集管理
一.以单机模式启动成员节点 有时候出于维护的需要,需要以单机模式启动某个节点而不是一个副本集成员身份. 1).首先查询服务器命令行参数 db.serverCmdLineOpts() 2).关闭当前副本 ...
- 四十三.MongoDB副本集 MongoDB文档管理
一.部署MongoDB副本集 1.1 启用副本集配置并指定集群名称 rs1 1.2 定义集群成员列表 部署好机器51,52,53:51上配置 bind_ip=192.168.4.51(要改) port ...
- MongoDB 副本集的原理、搭建、应用
概念: 在了解了这篇文章之后,可以进行该篇文章的说明和测试.MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组 ...
- mongodb副本集用户权限设置
mongodb副本集用户权限设置 用户权限参考文章 一:先看看MongoDB中用户的角色说明 read : 数据库的只读权限,包括: aggregate,checkShardingIndex, ...
- MongoDB副本集的工作原理
在MongoDB副本集中,主节点负责处理客户端的读写请求,备份节点则负责映射主节点的数据. 备份节点的工作原理过程可以大致描述为,备份节点定期轮询主节点上的数据操作,然后对自己的数据副本进行这些操作, ...
- 006.MongoDB副本集
一 MongoDB 复制(副本集) 1.1 复制概述 MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的 ...
- mongodb 副本集之入门篇
作者: 凹凸曼-军军 前言:mongodb 因为高性能.高可用性.支持分片等特性,作为非关系型数据库被大家广泛使用.其高可用性主要是体现在 mongodb 的副本集上面(可以简单理解为一主多从的集群) ...
- MongoDB副本集学习(三):性能和优化相关
Read Preferences/读写分离 有时候为了考虑应用程序的性能或响应性,为了提高读取操作的吞吐率,一个常见的措施就是进行读写分离,MongoDB副本集对读写分离的支持是通过Read Pref ...
- MongoDB副本集的常用操作及原理
本文是对MongoDB副本集常用操作的一个汇总,同时也穿插着介绍了操作背后的原理及注意点. 结合之前的文章:MongoDB副本集的搭建,大家可以在较短的时间内熟悉MongoDB的搭建和管理. 下面的操 ...
随机推荐
- Extjs3 + swfUpload实现多文件上传控件
要在ExrtJS框架实现选择多文件上传,FileUploadField已经无法满足需求,所以采用了 swfUpload上传控件,上传窗口如下: 多选文件进行上传(其实是每个文件异步上传),可以中途停止 ...
- Linux运维初级教程(三)文件及目录权限
文件类型 -代表普通文件,d代表目录,l代表链接文件,b或c代表设备. 第二至九个字符代表权限,分别为所有者权限.所属组权限.其他账户权限 修改权限用chmod u用户 g组 o其他用户 a所有人 c ...
- Apache CXF初级介绍(一)
Web Service做项目必不可少 一.CXF安装 二.用Ant来创建项目 三.用Maven来创建项目 四.用Eclipse来创建项目 五
- NHibernate概念
SessionFactory (NHibernate.ISessionFactory) 对属于单一数据库的编译过的映射文件的一个线程安全的,不可变的缓存快照.它是Session的工厂,是Connect ...
- java实现文件单词频率统计 topN top K
java 实现单词计数.top N 思路 先统计每个单词出现的个数 利用 TreeSet 的自动排序的功能 上代码 wordcount public void wordCount() { String ...
- 【C语言入门教程】2.3 整型数据
没有小数位或指数的数据类型被称为整型数据,根据使用方法的分类,整型数据可分为整型常量和整型变量.根据定义或显示的数制分类,可分为十进制.八进制和十六进制. 2.3.1 整型常量 整型常量是在运算中不可 ...
- 【python网络编程】使用rsa加密算法模块模拟登录新浪微博
一.基础知识 http://blog.csdn.net/pi9nc/article/details/9734437 二.模拟登录 因为上学期参加了一个大数据比赛,需要抓取数据,所以就想着写个爬虫抓取新 ...
- httpd服务访问控制
客户机地址限制 通过配置Order.Deny from.Allow from 来限制客户机 allow.deny :先"允许"后"拒绝" ,默认拒绝所有为明确的 ...
- phpcms二次开发学习
1.新建模块就是phpcms/modules/目录下面新建文件夹,文件夹名即为模块名. 2.模块内 一般新建三个文件夹:classes(模块要使用的类放置在这个文件夹,通过pc_base::load_ ...
- ACdream1063——平衡树
1.题目大意:让你设计一种数据结构,支持插入一个数,和在这个结构里查询结构中的哪个数和给定的数的异或值最小 2.分析:这个怎么做呢,就是trie树,我们建立一个trie树,把树按01进制存进去,然后在 ...