iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >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://www.lsjlt.com/news/50246.html(转载时请注明来源链接)

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MongoDB副本集的常用操作及原理
    下面的操作主要分为两个部分: 修改节点状态 主要包括: 将Primary节点降级为Secondary节点冻结Secondary节点强制Secondary节点进入维护模式2. 修改副本集的配置 添加节点删...
    99+
    2024-04-02
  • MongoDB 使用副本集备份添加新的辅助副本成员
    问题描述: 在生产环境中,当辅助副本成员的读压力很大时,可通过添加新的辅助副本成员来缓解压力。为了能实现主副本成员不停机,并减轻主副本成员的压力,可在辅助副本成员上mongodump备份数据;为了...
    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 命令清屏退出 shell小结MongoDB S...
    99+
    2022-12-05
    MongoDB Shell操作命令 MongoDB Shell
  • MongoDB Shell常用基本操作命令详解
    目录MongoDB Shell连接数据库库(database)的操作查看所有数据库test 库查看当前数据库删除数据库集合的基本操作创建集合查看集合删除集合其他 Shell 命令清屏...
    99+
    2022-12-08
    MongoDB Shell操作命令 MongoDB Shell
  • MongoDB 常用的crud操作语句
    目录创建数据(CREATE)更新数据(Update)删除(DELETE)读取数据(READ)对于后端大神(小白)来说,每天的工作就是 CRUD,再加上 Control + C 和 C...
    99+
    2024-04-02
  • Python 元组和集合的特点及常用操作
    一、元组的特点:1、有序的集合2、通过偏移来取数据3、属于不可变的对象,不能在原地修改内容,没有排序,修改等操作。tuple支持的方法很少>>> dir(tuple) ['__add__', '__class__', '_...
    99+
    2023-01-31
    常用 操作 Python
  • MongoDB常用的Query操作有哪些
    这篇文章主要介绍MongoDB常用的Query操作有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!           ...
    99+
    2024-04-02
  • 怎么在.NET中使用MongoDB以及基本的CRUD操作
    这篇文章主要介绍了怎么在.NET中使用MongoDB以及基本的CRUD操作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。MongoDBNoS...
    99+
    2024-04-02
  • 常用的Git便捷操作合集
    目录1.Fork出来的Git仓库同步代码2.合并多个提交3.代码回退4.使用worktree5.其它1.Fork出来的Git仓库同步代码 背景:有的时候从原仓库fork出了一个新仓库...
    99+
    2024-04-02
  • winxp 的常用操作及技巧
    <清除 WinXP Shared Folders--就是在“我的计算机“里那些碍眼的分享数据夹> --请从registry删掉以下code-- HKEY_LOCAL_MACHINE ...
    99+
    2023-05-23
    winxp 的常用 技巧 操作
  • Python集合常用的操作有哪些
    本篇文章为大家展示了Python集合常用的操作有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、什么是集合集合(set)和字典(dict)类似,它是一组 key 的集合,但不存储 value。...
    99+
    2023-06-15
  • java与scala数组及集合的基本操作对比
    目录java与scala数组及集合的操作scala数组基本操作对应java代码scala可变数组ArrayBufferjava 相应 ArrayList操作scala 的数组遍历ja...
    99+
    2024-04-02
  • MongoDB数据库常用的10条操作命令
    目录1. 显示全部可用数据库2. 切换数据库3. 显示数据集4. 插入数据5. 更新数据6. 替换文档7. 查询数据8. 统计条数9. 删除文档10. 查看帮助文档1. 显示全部可用...
    99+
    2024-04-02
  • Redis基本数据类型Zset有序集合常用操作
    目录Redis数据类型Zset有序集合一、zadd二、zrange三、zrevrange四、zrangebyscore五、 zrem六、zcard七、zcountRedis数据类型Z...
    99+
    2024-04-02
  • 队列的基本原理和操作方法
    这篇文章主要介绍“队列的基本原理和操作方法”,在日常操作中,相信很多人在队列的基本原理和操作方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”队列的基本原理和操作方法”的疑惑...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作