mongodb维护replicaset

悦光阴 悦光阴     2022-08-04     500

关键词:

在每个MongoDB Instance中,都有一个本地数据库(local),用于存储 Replication 进程的信息和本地数据。local 数据库的特性是:位于local数据库中的数据和集合不会被 Replication 进程复制到其他MongoDB instance上。如果实例上有些collection 和 data不计划被复制到其他MongoDB Instance,可以将这些collection 和 data 存储在local 数据库中。

MongoDB shell提供一个全局变量rs,是数据库命令的包装器(wrapper),用于维护Replica Set。

一,Replica Set的配置

1,查看Replica Set的配置信息

MongoDB 将Replica Set的配置信息存储在local.system.replset 集合中,不能直接修改该集合,必须通过rs.initiate()来初始化,通过 rs.reconfig()来重新配置,对Replica Set 增加或删除成员都会相应的修改Replica Set的配置信息。

rs.config()

use local
db.system.replset.find()

配置信息重要信息主要有两部分:Replica Set的 id 值 和 member 数组。

{
_id: "replica set name",
members: [
    {
      _id: <int>,
      host: "host:port",
      arbiterOnly: <boolean>,
      buildIndexes: <boolean>,
      hidden: <boolean>,
      priority: <number>,
      slaveDelay: <int>,
      votes: <number>
    },
    ...
  ],
...
}

成员的配置文档:

priority:表示一个成员被选举为Primary节点的优先级,默认值是1,取值范围是从0到100,将priority设置为0有特殊含义:Priority为0的成员永远不能成为Primary 节点。Replica Set中,Priority最高的成员,会优先被选举为Primary 节点,只要其满足条件。

hidden:将成员配置为隐藏成员,要求Priority 为0。Client不会向隐藏成员发送请求,因此隐藏成员不会收到Client的Request。

slaveDelay:单位是秒,将Secondary 成员配置为延迟备份节点,要求Priority 为0,表示该成员比Primary 成员滞后指定的时间,才能将Primary上进行的写操作同步到本地。为了数据读取的一致性,应将延迟备份节点的hidden设置为true,避免用户读取到明显滞后的数据。Delayed members maintain a copy of the data that reflects the state of the data at some time in the past.

votes:有效值是0或1,默认值是1,如果votes是1,表示该成员(voting member)有权限选举Primary 成员。在一个Replica Set中,最多有7个成员,其votes 属性的值是1。

arbiterOnly:表示该成员是仲裁者,arbiter的唯一作用是就是参与选举,其votes属性是1,arbiter不保存数据,也不会为client提供服务。

buildIndexes:表示实在在成员上创建Index,该属性不能修改,只能在增加成员时设置该属性。如果一个成员仅仅作为备份,不接收Client的请求,将该成员设置为不创建index,能够提高数据同步的效率。

2,重新配置Replica Set

对Replica Set重新配置,必须连接到Primary 节点;如果Replica Set中没有一个节点被选举为Primary,那么,可以使用force option(rs.reconfig(config,{force:true})),在Secondary 节点上强制对Replica Set进行重新配置。

The force parameter allows a reconfiguration command to be issued to a non-primary node. If set as { force: true }, this forces the replica set to accept the new configuration even if a majority of the members are not accessible. Use with caution, as this can lead to rollback situations.

示例,在primary 节点中,重新配置成员的优先级属性(priority)。

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

3,增加成员

3.1,该使用默认的配置增加成员

--增加一个成员,用于存储数据
rs.add("host:port")

--增加一个arbiter,用于选举
rs.add("host:port",true)

3.2,使用配置文档增加成员

示例,为Replica Set增加一个延迟备份的隐藏节点,滞后Primary节点1hour,该节点不参与投票,也不创建index,仅仅作为数据备份。

rs.add( { _id:4, host: "host:port", priority: 0, hidden:true, slaveDelay:3600, votes:0, buildIndexes:true, arbiterOnly:false } )

4,删除成员

rs.remove("host")

5,对replica set重新配置,能够增加成员,删除成员,并能同时修改成员的属性

二,对Replica Set的成员进行操作

1,冻结当前成员,使当前成员在指定的时间内没有资格成为Primary。

Makes the current replica set member ineligible to become primary for the period specified.

rs.freeze(seconds)

2,谋划Primary 节点退位

rs.stepDown()触发选举Primary的事件,使当前的Primary 节点在指定的时间内,不能成为Primary 节点。如果有Secondary 节点满足条件,那么Primary 节点下课,其他节点被选举为Primary 节点;如果没有Secondary 节点满足条件,那么该节点继续作为Primary 节点。

Forces the primary of the replica set to become a secondary, triggering an election for primary. The method steps down the primary for a specified number of seconds; during this period, the stepdown member is ineligible from becoming primary.

rs.stepDown(stepDownSecs, secondaryCatchUpPeriodSecs)

3,强制当前成员从指定成员同步数据

rs.syncFrom("host:port");

4,使当前的Secondary 节点能够读取数据

默认情况下,Secondary 节点是不能读取数据的

rs.slaveOk()

三,查看Replica Set的状态

set字段:Replica Set的name

stateStr:成员状态的描述信息

name:该成员的host 和 端口

syncTo:该成员从哪个成员同步数据,可以使用rs.syncFrom()强制同步的Path,从指定的 Target 成员同步数据。

{
    "set" : "rs0",
    "myState" : 1,
    "heartbeatIntervalMillis" : NumberLong(2000),
    "members" : [ 
        {
            "_id" : 0,
            "name" : "cia-sh-05:40004",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 240973,
            "optime" : {
                "ts" : Timestamp(1473336939, 1),
                "t" : NumberLong(5)
            },
            "optimeDate" : ISODate("2016-09-08T12:15:39.000Z"),
            "lastHeartbeat" : ISODate("2016-09-10T04:39:55.041Z"),
            "lastHeartbeatRecv" : ISODate("2016-09-10T04:39:56.356Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "cia-sh-06:40001"
        }, .....
    ]
}

三,Replica Set的操作日志

MongoDB的Replication实际上是基于操作日志的复制,Primary节点将执行的写操作记录到oplog中,Replication将Primary 的oplog同步到其他成员中,其他成员重做(redo)oplog中记录的写操作,最终,Replica Set中的各个成员达到数据的一致性。

在local数据库中,集合 local.oplog.rs 是一个固定大小的集合,存储Primary的操作日志(oplog)。
local.oplog.rs is the capped collection that holds the oplog. You set its size at creation using the oplogSizeMB setting. To resize the oplog after replica set initiation, use the Change the Size of the Oplog procedure.

 

三,查看mongod 的开机日志

在local.startup_log 集合中,存储mongod 每次启动时的开机日志

 

参考文档:

The local Database

Replica Set Configuration

mongodb——mongodb副本集(replicasets)(代码片段)

MongoDB复制集(ReplicaSets)MongoDB复制集概述复制集的三个角色MongoDB复制集部署增加或删除节点配置优先级以及仲裁节点故障切换测试手动主从切换MongoDB复制集概述MongoDB中的副本集(ReplicaSet)是一组维护相同数据集的mongod服... 查看详情

mongodb安全集群搭建

...ongo集群搭建mongodb的集群搭建方式主要有3种,主从模式,Replicaset模式,sharding模式,三种模式各有优劣,适用于不同的场景,属Replicaset应用最为广泛,主从模式现在用的较少,sharding最为完备,但配置维护较为复杂mongodb的ReplicaS... 查看详情

mongodb如何创建mongodb的replicaset

Replicasets在主从复制上做的扩展,增加了故障自动切换和自动修复成员节点。下面从技术上介绍如何搭建mongodb的replicaset(个人觉得,搭建mongodb本身没有多少干货,重要是如何灾难规划)1建立复制集群节点的数据存放目录mkdir-p/opt/m... 查看详情

mongodb的replicaset实验(代码片段)

Mongodb的ReplicaSet实验标签(空格分隔):MongoDB本文验证了:要保证mongodbRS集群在宕机情况下的可用性,至少需要三台机器。目的本实验的ReplicaSet集群为1*Primary,1*Secondary,n*Arbiter。目的是为了验证:三机环境下,Primary宕机后,是... 查看详情

如何重命名mongodb中的replicaset

虚拟机里的MongoDB集群全部停掉之后,使用--replSetrs2参数重新启动。mongoshell连进去之后查看状况,rs1:OTHER>rs.status()"operationTime":Timestamp(1559293558,1),"ok":0,"errmsg":"Ourreplicasetconfigisinvalidorwearenotamemberofit","code 查看详情

mongodb的replicasets+shardingarchitect

...B的副本集却可以很轻松的处理单点故障,所以就有了ReplicaSets+Sharding的高可用,高安全的架构。 架构如下:     1&# 查看详情

mongodb副本集(replicaset)搭建

mongodb副本集是有故障恢复功能的主从集群,由一个primary节点和一个或多个secondary节点组成。同步过程:Primary节点写入数据,Secondary通过读取Primary的oplog得到复制信息,开始复制数据并且将复制信息写入到自己的oplog。如果某个... 查看详情

mongodb副本集(replicaset)搭建(代码片段)

mongodb副本集是有故障恢复功能的主从集群,由一个primary节点和一个或多个secondary节点组成。同步过程:Primary节点写入数据,Secondary通过读取Primary的oplog得到复制信息,开始复制数据并且将复制信息写入到自己的o... 查看详情

mongodb复制集/副本集(replicaset)搭建

参考技术Amongo副本集/复制集是mongo高可用性特征之一,是有自动故障恢复功能的主要集群。由一个Primary节点和一个或多个Secondary节点组成。复制是在多台服务器之间同步数据的过程,由一组Mongod实例(进程)组成,包含一个Prima... 查看详情

从 Kubernetes 集群中的另一个服务连接到 MongoDB Ops Manager 上的 ReplicaSet,给出 MongooseServerSelectionError

】从Kubernetes集群中的另一个服务连接到MongoDBOpsManager上的ReplicaSet,给出MongooseServerSelectionError【英文标题】:ConnectingtoReplicaSetonMongoDBOpsManagerfromanotherserviceintheKubernetesclustergivingMongooseServerSelectionError【发布时间】:2020-11 查看详情

mongodb主从

参考技术Amongodb的集群搭建方式主要有三种,主从模式,Replicaset模式,sharding模式,三种模式各有优劣,适用于不同的场合,属Replicaset应用最为广泛,主从模式现在用的较少,sharding模式最为完备,但配置维护较为复杂。本文为Rep... 查看详情

springboot连接mongodb集群

主要问题是:MongoDB集群分为复制集(replicaSet)与分片集(shardingSet),那么如何去连接这两种集群;参考官方文档,我使用了最通用的方法:通过构造connectionstring来通用连接两种集群;两种集群connectionstring的构造方法:replicaSe... 查看详情

MongoDB Atlas 副本集名称

】MongoDBAtlas副本集名称【英文标题】:MongoDBAtlasreplicaSetname【发布时间】:2018-12-1317:20:32【问题描述】:我在哪里可以找到MongoDBatlas中的副本集名称,因为我一直得到这个:MongoError:种子列表不包含mongos代理,replicaset连接需要在U... 查看详情

『mongodb』mongodb部署架构——复制集篇(replicaset)(代码片段)

目录一、复制集机制及原理1复制集的作用2典型复制集结构3数据是如何复制的?4通过选举完成故障恢复5影响选举的因素6复制集节点常见选项7复制集注意事项二、搭建MongoDB复制集1搭建准备2复制集节点创建2.1在Linux原生环境... 查看详情

MongoDB 在副本集模式下插入速度变慢

...式下插入速度变慢【英文标题】:MongoDBinsertsslowdownwheninReplicaSetmode【发布时间】:2015-08-0218:07:27【问题描述】:我正在运行MongoDB2.4.5,最近我开始深入研究ReplicaSet以获得某种冗余。我用--replSet参数启动了同一个mongo实例,还添加... 查看详情

MongoDB 在副本集模式下插入速度变慢

...式下插入速度变慢【英文标题】:MongoDBinsertsslowdownwheninReplicaSetmode【发布时间】:2015-08-0218:07:27【问题描述】:我正在运行MongoDB2.4.5,最近我开始深入研究ReplicaSet以获得某种冗余。我用--replSet参数启动了同一个mongo实例,还添加... 查看详情

MongoClientURI 连接字符串中是不是需要 ReplicaSet 名称?

】MongoClientURI连接字符串中是不是需要ReplicaSet名称?【英文标题】:IstheReplicaSetnamenecessaryinMongoClientURIConnectionString?MongoClientURI连接字符串中是否需要ReplicaSet名称?【发布时间】:2016-07-3006:48:02【问题描述】:在指定用于从Java应... 查看详情

mongodb的secondary可以支持写操作吗?

参考技术Amongodb的读写分离使用ReplicaSets来实现对于replicaset中的secondary节点默认是不可读的。在写多读少的应用中,使用ReplicaSets来实现读写分离。通过在连接时指定或者在主库指定slaveOk,由Secondary来分担读的压力,Primary只承担... 查看详情