返回顶部
首页 > 资讯 > 数据库 >MongoDB副本集的常用操作及原理
  • 106
分享到

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

2024-04-02 19:04:59 106人浏览 泡泡鱼
摘要

下面的操作主要分为两个部分: 修改节点状态 主要包括: 将Primary节点降级为Secondary节点冻结Secondary节点强制Secondary节点进入维护模式2. 修改副本集的配置 添加节点删

下面的操作主要分为两个部分:

  1. 修改节点状态

主要包括:

将Primary节点降级为Secondary节点
冻结Secondary节点
强制Secondary节点进入维护模式
2. 修改副本集的配置

添加节点
删除节点
将Secondary节点设置为延迟备份节点
将Secondary节点设置为隐藏节点
替换当前的副本集成员
设置副本集节点的优先级
阻止Secondary节点升级为Primary节点
如何设置没有投票权的Secondary节点
禁用chainingAllowed
为Secondary节点显式指定复制源
禁止Secondary节点创建索引

首先查看mongoDB副本集支持的所有操作

rs.help()
rs.status() { replSetGetStatus : 1 } checks repl set status
rs.initiate() { replSetInitiate : null } initiates set with default settings
rs.initiate(cfg) { replSetInitiate : cfg } initiates set with configuration cfg
rs.conf() get the current configuration object from local.system.replset
rs.reconfig(cfg) updates the configuration of a running replica set with cfg (disconnects)
rs.add(hostportstr) add a new member to the set with default attributes (disconnects)
rs.add(membercfGobj) add a new member to the set with extra attributes (disconnects)
rs.addArb(hostportstr) add a new member which is arbiterOnly:true (disconnects)
rs.stepDown([stepdownSecs, catchUpSecs]) step down as primary (disconnects)
rs.syncFrom(hostportstr) make a secondary sync from the given member
rs.freeze(secs) make a node ineligible to become primary for the time specified
rs.remove(hostportstr) remove a host from the replica set (disconnects)
rs.slaveOk() allow queries on secondary nodes

rs.printReplicationInfo() check oplog size and time range
rs.printSlaveReplicationInfo() check replica set members and replication lag
db.isMaster() check who is primary

reconfiguration helpers disconnect from the database so the shell will display
an error, even if the command succeeds.
修改节点状态

将Primary节点降级为Secondary节点

share:PRIMARY> rs.stepDown()
这个命令会让primary降级为Secondary节点,并维持60s,如果这段时间内没有新的primary被选举出来,这个节点可以要求重新进行选举。

也可手动指定时间

share:PRIMARY> rs.stepDown(30)
在执行完该命令后,原Secondary node3:27017升级为Primary。

原Primary node3:27018降低为Secondary

冻结Secondary节点

如果需要对Primary做一下维护,但是不希望在维护的这段时间内将其它Secondary节点选举为Primary节点,可以在每次Secondary节点上执行freeze命令,强制使它们始终处于Secondary节点状态。

share:SECONDARY> rs.freeze(100)
注:只能在Secondary节点上执行

share:PRIMARY> rs.freeze(100)
{
"ok" : 0,
"errmsg" : "cannot freeze node when primary or running for election. state: Primary",
"code" : 95,
"codeName" : "NotSecondary"
}

如果要解冻Secondary节点,只需执行

share:SECONDARY> rs.freeze()

强制Secondary节点进入维护模式

当Secondary节点进入到维护模式后,它的状态即转化为“RECOVERING”,在这个状态的节点,客户端不会发送读请求给它,同时它也不能作为复制源。

进入维护模式有两种触发方式:

  1. 自动触发

譬如Secondary上执行压缩

  1. 手动触发

share:SECONDARY> db.adminCommand({"replSetMaintenance":true})

修改副本集的配置

添加节点

share:PRIMARY> rs.add("node3:27017")
share:PRIMARY> rs.add({_id: 3, host: "node3:27017", priority: 0, hidden: true})
也可通过配置文件的方式

cfg={
"_id" : 3,
"host" : "node3:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : true,
"priority" : 0,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
}

rs.add(cfg)

删除节点

第一种方式

share:PRIMARY> rs.remove("node3:27017")
第二种方式

share:PRIMARY> cfg = rs.conf()
share:PRIMARY> cfg.members.splice(2,1)
share:PRIMARY> rs.reconfig(cfg)
注:执行rs.reconfig并不必然带来副本集的重新选举,加force参数同样如此。

The rs.reconfig() shell method can trigger the current primary to step down in some situations.

修改节点的配置

将Secondary节点设置为延迟备份节点

cfg = rs.conf()
cfg.members[1].priority = 0
cfg.members[1].hidden = true
cfg.members[1].slaveDelay = 3600
rs.reconfig(cfg)

将Secondary节点设置为隐藏节点

cfg = rs.conf()
cfg.members[0].priority = 0
cfg.members[0].hidden = true
rs.reconfig(cfg)

替换当前的副本集成员

cfg = rs.conf()
cfg.members[0].host = "mongo2.example.net"
rs.reconfig(cfg)

设置副本集节点的优先级

cfg = rs.conf()
cfg.members[0].priority = 0.5
cfg.members[1].priority = 2
cfg.members[2].priority = 2
rs.reconfig(cfg)
优先级的有效取值是0~1000,可为小数,默认为1

从MongoDB 3.2开始

Non-voting members must have priority of 0.
Members with priority greater than 0 cannot have 0 votes.
注:如果将当前Secondary节点的优先级设置的大于Primary节点的优先级,会导致当前Primary节点的退位。

阻止Secondary节点升级为Primary节点

只需将priority设置为0

fg = rs.conf()
cfg.members[2].priority = 0
rs.reconfig(cfg)

如何设置没有投票权的Secondary节点

MongoDB限制一个副本集最多只能拥有50个成员节点,其中,最多只有7个成员节点拥有投票权。

之所以作此限制,主要是考虑到心跳请求导致的网络流量,毕竟每个成员都要向其它所有成员发送心跳请求,和选举花费的时间。

从MongoDB 3.2开始,任何priority大于0的节点都不可将votes设置为0

所以,对于没有投票权的Secondary节点,votes和priority必须同时设置为0

cfg = rs.conf()
cfg.members[3].votes = 0
cfg.members[3].priority = 0
cfg.members[4].votes = 0
cfg.members[4].priority = 0
rs.reconfig(cfg)

禁用chainingAllowed

默认情况下,允许级联复制。

即备份集中如果新添加了一个节点,这个节点很可能是从其中一个Secondary节点处进行复制,而不是从Primary节点处复制。

MongoDB根据ping时间选择同步源,一个节点向另一个节点发送心跳请求,就可以得知心跳请求所耗费的时间。MongoDB维护着不同节点间心跳请求的平均花费时间,选择同步源时,会选择一个离自己比较近而且数据比自己新的节点。

如何判断节点是从哪个节点处进行复制的呢?

share:PRIMARY> rs.status().members[1].syncingTo
node3:27018
当然,级联复制也有显而易见的缺点:复制链越长,将写操作复制到所有Secondary节点所花费的时间就越长。

可通过如下方式禁用

cfg=rs.conf()
cfg.settings.chainingAllowed=false
rs.reconfig(cfg)
将chainingAllowed设置为false后,所有Secondary节点都会从Primary节点复制数据。

为Secondary节点显式指定复制源

rs.syncFrom("node3:27019")

禁止Secondary节点创建索引

有时,并不需要Secondary节点拥有和Primary节点相同的索引,譬如这个节点只是用来处理数据备份或者离线的批量任务。这个时候,就可以阻止Secondary节点创建索引。

在MongoDB 3.4版本中,不允许直接修改,只能在添加节点时显式指定

share:PRIMARY> cfg=rs.conf()
share:PRIMARY> cfg.members[2].buildIndexes=false
false
share:PRIMARY> rs.reconfig(cfg)
{
"ok" : 0,
"errmsg" : "priority must be 0 when buildIndexes=false",
"code" : 103,
"codeName" : "NewReplicaSetConfigurationIncompatible"
}
share:PRIMARY> cfg.members[2].buildIndexes=false
false
share:PRIMARY> cfg.members[2].priority=0
0
share:PRIMARY> rs.reconfig(cfg)
{
"ok" : 0,
"errmsg" : "New and old configurations differ in the setting of the buildIndexes field for member node3:27017; to make this c
hange, remove then re-add the member", "code" : 103,
"codeName" : "NewReplicaSetConfigurationIncompatible"
}
share:PRIMARY> rs.remove("node3:27017")
{ "ok" : 1 }
share:PRIMARY> rs.add({_id: 2, host: "node3:27017", priority: 0, buildIndexes:false})
{ "ok" : 1 }

从上述测试中可以看出,如果要将节点的buildIndexes设置为false,必须同时将priority设置为0。

参考

1.《MongoDB权威指南》

  1. MongoDB官方文档

  2. 云计算 大数据 mongodb(https://www.yunchihair.com/?p=115)
您可能感兴趣的文档:

--结束END--

本文标题: MongoDB副本集的常用操作及原理

本文链接: https://lsjlt.com/news/50246.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MongoDB副本集的常用操作及原理
    下面的操作主要分为两个部分: 修改节点状态 主要包括: 将Primary节点降级为Secondary节点冻结Secondary节点强制Secondary节点进入维护模式2. 修改副本集的配置 添加节点删...
    99+
    2024-04-02
  • MongoDB 副本集原理及管理
    MongoDB副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主节点(primary)和多个备节点(Secondary)组成。通过Repication,将数据的更新由primary...
    99+
    2024-04-02
  • mongodb主从复制及副本集的部署
    一.mongodb配置参数介绍:[root@host11 tmp]# cat  /etc/mongod.conf #以守护进程的方式运行fork=true#设置db的路径dbpath=/...
    99+
    2024-04-02
  • MongoDB基本操作、备份还原及用户管理
    今日趁周末得空,将近日在学习的MongoDB数据库常用命令作以下整理,方便工作中查看 MongoDB的逻辑结构主要由文档、集合和数据库三部分组成。其中文档是MongoDB的核心概念,它是MongoDB逻辑...
    99+
    2024-04-02
  • MongoDB安装及常用操作
    一、MongoDB简介1、介绍1)MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统,也属于NoSQL。2)在高负载的情况下,可以添加更多的节点,可以保证服务器性能。3)Mongo...
    99+
    2024-04-02
  • MongoDB 使用副本集备份添加新的辅助副本成员
    问题描述: 在生产环境中,当辅助副本成员的读压力很大时,可通过添加新的辅助副本成员来缓解压力。为了能实现主副本成员不停机,并减轻主副本成员的压力,可在辅助副本成员上mongodump备份数据;为了...
    99+
    2024-04-02
  • mongodb之副本集的实现及故障自动转移
    Mongodb之副本集的实现----repliSet准备三个节点:RS1:192.168.1.155:27017RS2:192.168.1.11:27017node1:192.168.1.112:27017...
    99+
    2024-04-02
  • MongoDB常用的基本操作命令
    这篇文章主要讲解了“MongoDB常用的基本操作命令”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MongoDB常用的基本操作命令”吧! ...
    99+
    2024-04-02
  • MongoDB的安装及常用操作命令
    这篇文章主要讲解了“MongoDB的安装及常用操作命令”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MongoDB的安装及常用操作命令”吧!环境:cento...
    99+
    2024-04-02
  • 第 3 部分 MongoDB常用基本操作
    help KEYWORDS.help() KEYWORDS.[TAB] db. rs. sh. show use db.help() db.a.help() rs.help() sh.help() 查看当前db版本 test>...
    99+
    2023-01-31
    常用 操作 MongoDB
  • MongoDB常用的操作(服务器、数据库、集合)
    MongoDB常用的操作 前面两篇已经介绍了MongoDB系统架构及其BSON数据类型。本文将讲解基本的MongoDB操作。 一、MongoDB启动命令 启动MongoDB systemctl st...
    99+
    2023-09-08
    mongodb 数据库 sql
  • MongoDB 常用的数据类型和基本操作
    目录NO.1 MongoDB的常用数据类型1、null2、bool3、整数4、字符串5、对象id6、日期类型7、数组8、内嵌文档9、代码NO.2 集合文档的基本操作集合相关操作1、查...
    99+
    2024-04-02
  • MongoDB Shell常用基本操作命令详解
    目录MongoDB Shell连接数据库库(database)的操作查看所有数据库test 库查看当前数据库删除数据库集合的基本操作创建集合查看集合删除集合其他 Shell 命令清屏...
    99+
    2022-12-08
    MongoDB Shell操作命令 MongoDB Shell
  • MongoDB Shell常用基本操作命令详解
    目录MongoDB Shell连接数据库库(database)的操作查看所有数据库test 库查看当前数据库删除数据库集合的基本操作创建集合查看集合删除集合其他 Shell 命令清屏退出 shell小结MongoDB S...
    99+
    2022-12-05
    MongoDB Shell操作命令 MongoDB Shell
  • MongoDB 常用的crud操作语句
    目录创建数据(CREATE)更新数据(Update)删除(DELETE)读取数据(READ)对于后端大神(小白)来说,每天的工作就是 CRUD,再加上 Control + C 和 C...
    99+
    2024-04-02
  • pymongo操作MongoDB的基本用法
    import pymongo # 连接MongoDB client = pymongo.MongoClient(host=‘localhost‘, port=27017) # client = MongoClient(‘mongodb://...
    99+
    2021-06-10
    pymongo操作MongoDB的基本用法 数据库入门 数据库基础教程
  • Python 元组和集合的特点及常用操作
    一、元组的特点:1、有序的集合2、通过偏移来取数据3、属于不可变的对象,不能在原地修改内容,没有排序,修改等操作。tuple支持的方法很少>>> dir(tuple) ['__add__', '__class__', '_...
    99+
    2023-01-31
    常用 操作 Python
  • MongoDB常用的Query操作有哪些
    这篇文章主要介绍MongoDB常用的Query操作有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!           ...
    99+
    2024-04-02
  • MongoDB复制选举原理以及复制集的管理
    MongoDB复制集的节点是通过选举产生主节点的。复制的原理:复制是基于操作日志oplog,相当于MySQL的二进制日志,只记录发生改变的记录。复制将主节点的oplog日志同步并应用到其他从节点的过程选举的...
    99+
    2024-04-02
  • 怎么在.NET中使用MongoDB以及基本的CRUD操作
    这篇文章主要介绍了怎么在.NET中使用MongoDB以及基本的CRUD操作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。MongoDBNoS...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作