副本集配置
您可以使用rs.conf()方法或replSetGetConfig命令访问副本集的配置。
要修改副本集的配置,请使用rs.reconfig()方法传递配置文档。更多信息请参见rs.reconfig()。
⚠️注意
避免重新配置包含不同MongoDB版本节点的副本集,因为不同MongoDB版本的验证规则可能不同。
副本集配置文档示例
下面的文档提供了副本集配置文档的样例。你的节点配置文档可能只包含样例文档的部分配置:
{
_id: <string>,
version: <int>,
term: <int>,
protocolVersion: <number>,
writeConcernMajorityJournalDefault: <boolean>,
configsvr: <boolean>,
members: [
{
_id: <int>,
host: <string>,
arbiterOnly: <boolean>,
buildIndexes: <boolean>,
hidden: <boolean>,
priority: <number>,
tags: <document>,
secondaryDelaySecs: <int>,
votes: <number>
},
...
],
settings: {
chainingAllowed : <boolean>,
heartbeatIntervalMillis : <int>,
heartbeatTimeoutSecs: <int>,
electionTimeoutMillis : <int>,
catchUpTimeoutMillis : <int>,
getLastErrorModes : <document>,
getLastErrorDefaults : <document>,
replicaSetId: <ObjectId>
}
}
副本集配置参数
_id
Type: string
复制集的名称。
_id必须与副本相同,或者在命令行用--replSet命令指定mongod的replSetName值
version
Type: int
用一个递增的数字来区分副本集配置文档的修订与配置的先前迭代。
相对版本4.4中的修改:副本集节点使用term和version在“最新”副本配置上达成共识。当节点比较副本配置文档时,具有较大术语的配置文档被认为是“最新的”。如果term相同或不存在,则较大版本的配置文档视为“最新”。
term
Type: int
4.4新版功能仅在featureCompatibilityVersion (fCV)中可用“4.4”或更高版本。
用一个递增的数字来区分副本集配置文档的修订与配置的先前迭代,配置文档的term与执行重新配置的复制集主的term匹配,初选获胜后,每任期一次,它的任期就会增加。如果在replSetReconfig操作中显式设置,主节点将忽略term字段。
强制重新配置将删除术语字段,不强制发出replSetReconfig时,它将该term设置为自己的term。
副本集节点使用term和version在“最新”副本配置上达成共识,当副本集节点比较副本配置文档时,具有较大term的配置文档被认为是“最新的”,如果term相同或不存在,则较大版本的配置文档视为“最新”。
configsvr
Type: boolean
Default: false
表明复制集是否用于分片集群的配置服务器,如果副本集用于分片集群的配置服务器,则设置为true。
💡TIP
protocolVersion
Type: number
Default: 1
从4.0开始,MongoDB只支持protocolVersion: 1,不再支持protocolVersion: 0。
💡提示
writeConcernMajorityJournalDefault
Type: boolean
Default: true
如果写关注点没有显式指定日志选项j,则确定{w: "majority"}写关注点的行为。
下表列出了writeConcernMajorityJournalDefault值和相关的{w: "majority"}行为:
| Value | { w: "majority" } Behavior |
|---|---|
| true | MongoDB在大多数投票节点写入磁盘上的日志后承认写入操作。当writeConcernMajorityJournalDefault为true时,复制集的所有投票节点必须运行日志记录。如果复制集的任何投票节点使用内存中存储引擎,则必须设置writeConcernMajorityJournalDefault为false。如果复制集的任何投票节点使用内存存储引擎和writeConcernMajorityJournalDefault为true,多数写操作可能失败。这些操作包括固有地使用“majority”写安全的操作,如replSetStepDown命令,或默认使用“majority”写关安全的各种mongosh方法,如用户管理方法和角色管理方法。从版本4.2(以及4.0.13和3.6.14)开始,如果一个副本集节点使用内存中存储引擎(有投票或无投票),但副本集有writeConcernMajorityJournalDefault设置为true时,副本集节点记录启动警告。 |
| false | MongoDB在大多数投票节点在内存中应用了写操作后才会认可写操作。如果复制集的任何投票成员使用内存中存储引擎,则必须设置writeConcernMajorityJournalDefault为false。从版本4.2(以及4.0.13和3.6.14)开始,如果一个副本集节点使用内存中存储引擎(有投票或无投票),但副本集有writeConcernMajorityJournalDefault设置为true时,副本集节点记录启动警告。 |
💡提示
参考:
members
Type: array
节点配置文档数组,副本集的每个节点对应一个。members数组是一个零索引数组。
每个特定于节点的配置文档可以包含以下字段:
members[n]._id
Type: integer
复制集中节点的整数标识符,在所有节点中惟一。从MongoDB 5.0开始,这个值可以是大于或等于0的任何整数值,之前这个值只能为0到255之间的整数。
每个副本集节点必须有唯一的_id。避免重复使用_id值,即使当前配置中没有节点[n]项使用该_id。
一旦设置,就不能更改节点的_id。
NOTE
对象中的副本集成员,使用数组索引创建数组成员。数组索引从0开始。不要将这个索引值与成员[n]的值混淆。成员数组中每个文档中的_id字段。
members[n].host
Type: string
集合节点的主机名和端口号(如果指定的话)。
复制集中的每个主机的主机名必须是可解析的。
⚠️WARNING
[n] .host节点不能保留解析到本地主机或本地接口的值,除非该集合的所有节点都位于解析到本地主机的主机上。
members[n].arbiterOnly
可选.
Type: boolean
Default: false
值为true表示该节点是仲裁节点
当使用rs.addArb()方法添加仲裁节点时,该方法会自动设置members[n].arbiterOnly的值为true。
以下MongoDB版本,对于带仲裁节点的副本集,pv1与pv0 (MongoDB 4.0+不再支持)相比,增加了w:1回滚的可能性:
- MongoDB 3.4.1
- MongoDB 3.4.0
- MongoDB 3.2.11 或者更早版本
See Replica Set Protocol Version.
members[n].buildIndexes
Optional.
Type: boolean
Default: true
一个布尔值,指示mongod 是否在该节点上构建 indexes ,你只能在向复制集添加节点时设置此值,而无法改变
members[n].buildIndexes字段中已添加的节点。要添加节点,请参见rs.add() 和 rs.reconfig()
对于从客户端接收查询的 mongod实例,不要设置为false。
如果以下所有条件都满足,将buildIndexes设置为false可能有用:
- 您只使用此实例执行使用的备份
mongodump - 此节点将不会接收任何查询
- 创建和维护索引会使主机系统负担过重
即使设置为false,二级服务器也会在_id字段上建立索引,以方便复制所需的操作。
⚠️WARNING
如果你设置
members[n].buildIndexes若为假,也必须设置members[n].priority为0。如果members[n].priority如果不是0,MongoDB在尝试添加节点时将返回错误
members[n].buildIndexes等于false。为确保节点不接收查询,应隐藏所有未构建索引的实例。
其他从节点无法从其中的成员进行复制
members[n].buildIndexes为false。
members[n].hidden
Optional.
Type: boolean
Default: false
当此值为true时,复制集将隐藏该实例,并且在 db.hello()或hello.的输出中不包括该节点,这可以防止读操作(即查询)通过次要读优先级到达这个主机。
隐藏节点可以确认由写安全的写操作。对于带有“多数”Write Concern的写操作,节点必须是有表决权的节点(即votes 大于0)。
Hidden members can acknowledge write operations issued with Write Concern. For write operations issued with "majority" write concern, the member must also be a voting member (i.e. votes is greater than 0).
💡TIP
参考:
members[n].priority
在3.6版更改:从MongoDB 3.6开始,仲裁器的优先级为0。如果一个仲裁器的优先级为1,MongoDB 3.6将仲裁器的优先级重新配置为0。
Optional.
Type: 0到1000之间的数字为主节点/从节点;0或1为仲裁者。
Default: 主节点/从节点1;0表示仲裁节点。
数字的值表示节点是否成为主节点.的判断条件。
指定节点的数值改变节点成为 主节点的相对资格,(数值越高资格等级越高,反之亦然),members[n].priority数值为0则不能成为 primary。
优先级大于0的节点不能拥有0票。
改变副本集中优先级的平衡将触发一个或多个选举。如果一个较低优先级的从节点比一个较高优先级的从节点当选,副本集节点将继续调用选举,直到最高优先级可用节点成为主节点。
priority为0的节点可以确认由写安全发出的写操作。对于带有""majority" Write Concern的写操作,节点必须是有表决权的成节点员(即votes 大于0)。
Members with priority of 0 can acknowledge write operations issued with Write Concern. For write operations issued with "majority" write concern, the member must also be a voting member (i.e. votes is greater than 0).
💡TIP
参考:
members[n].tags
Optional.
Type: document
Default: none
标记文档包含用于复制集节点的用户定义标记字段和值对。
{ "<tag1>": "<string1>", "<tag2>": "<string2>",... }
- 对于读操作,您可以在read preference中指定一个标记集,将操作引导到具有指定标记的复制集成员。
- 对于写操作,可以使用设置创建自定义write concern 。
settings.getLastErrorModes和settings.getLastErrorDefaults.
更多信息请参考 Configure Replica Set Tag Sets.
members[n].secondaryDelaySecs
Optional.
Type: integer
Default: 0
这个复制集成员“滞后”于主节点的秒数。
使用此选项可创建 delayed members。延迟节点维护数据的副本,该副本反映了数据在过去某个时间的状态。
延迟的节点可以帮助确认由写安全发出的 Write Concern.
延迟的节点可以帮助确认由写安全发出的写操作。但是,它们返回写确认不早于配置的延迟值。
对于带有 "majority" 写关系的写操作,节点必须是有表决权的节点(即:votes 大于0)。
💡TIP
members[n].votes
Optional.
Type: integer
Default: 1
服务器将在 replica set election中投出的票数。 每个节点拥有的票数要么是 1,要么是 0, arbiters 总是恰好有 1 票。
一个副本集最多可以有 50个节点,但只有 7 个有投票权的节点。 如果在一个副本集中需要超过 7 个成员,请设置members[n].votes对于额外的无投票节点为 0。
无投票权(即 votes为 0)的节点的priority必须为 0。从 MongoDB 5.0 开始,新添加的从节点不算作投票节点,并且在达到 SECONDARY 状态之前不能被选举。非投票节点不能确认以“多数”写安全发出的写操作。
💡提示
参考:
settings
settings
Optional.
Type: document
包含适用于整个副本集的配置选项的文档。
settings 文档包含以下字段:
settings.chainingAllowedOptional.
Type: boolean
Default: true
在 MongoDB 5.0.1、4.2.15、4.4.7 和更早版本中, 如果
settings.chainingAllowed是:从 MongoDB 5.0.2、4.2.16 和 4.4.8 开始:
- 副本集 从节点可以从其他从节点复制数据,即使
settings.chainingAllowed为false。 - 覆盖
settings.chainingAllowed, 设置enableOverrideClusterChainingSetting服务器参数为true. enableOverrideClusterChainingSetting默认值为false.
💡提示
参考:
- 副本集 从节点可以从其他从节点复制数据,即使
settings.getLastErrorDefaults
Optional.
Type: document
从 MongoDB 5.0 开始不可用。
🏁重点
从 MongoDB 5.0 开始,您不能指定默认的写安全
settings.getLastErrorDefaults除了默认值 { w: 1, wtimeout: 0 } 。 相反,使用setDefaultRWConcern命令为副本集或分片集群设置默认的读取或写安全配置。
settings.getLastErrorModes
Optional.
Type: document
用于通过使用定义自定义write concern 的文档 members[n].tags. 自定义写安全可以提供data-center awareness.。
{ getLastErrorModes: {
<name of write concern> : { <tag1>: <number>, .... },
...
} }
指<number>的是满足写入关注点所需的不同标签值的数量。例如,以下 settings.getLastErrorModes定义一个名为的写关安全datacenter,它要求写入传播到两个dc标签值不同的节点。
{ getLastErrorModes: { datacenter: { "dc": 2 } } }
要使用自定义写安全,请将写安全名称传递给wOption,例如
{ w: "datacenter" }
有关更多信息和示例,请参阅配置副本集标记集。
settings.heartbeatTimeoutSecs
可选。
类型:整数
默认值:10
副本集节点等待彼此成功心跳的秒数。如果一个节点没有及时响应,其他节点会将这个拖欠的节点标记为不可访问。
笔记
为了
pv1,settings.electionTimeoutMillis对从节点是否要求选举的影响大于settings.heartbeatTimeoutSecs.
settings.electionTimeoutMillis
可选。
类型:整数
默认值:10000(10 秒)
以毫秒为单位的时间限制,用于检测何时无法访问副本集的主节点:
- 较高的值会导致较慢的故障转移,但会降低对主节点或网络缓慢或不稳定的敏感度。
- 较低的值会导致更快的故障转移,但会增加对主节点或网络缓慢或不稳定的敏感度。
该设置仅在使用时适用protocolVersion: 1.
NOTE
在4.0.2版更改:如果参数为 true(默认),当主节点从 (或不带 的命令)
enableElectionHandoff下台时,已下台的主节点会提名一个符合条件的从节点立即进行选举。否则,副手可以等到直到 召集选举。降级的主节点不会等待切换的效果。有关详细信息,请参阅 。rs.stepDown()replSetStepDownforce: truesettings.electionTimeoutMillisenableElectionHandoff
settings.catchUpTimeoutMillis
可选。
类型:整数
在3.6版中更改:
默认值:-1,无限追赶时间。
新选出的主节点与可能具有更新的写入的其他副本集节点同步(赶上)的时间限制(以毫秒为单位)。无限或高时间限制可能会减少其他节点在选举后需要回滚的数据量,但可能会增加故障转移时间。
新当选的节点一旦完全赶上其他节点,就会提前结束选举期。. 在选举期间,新选出的主节点不可用于客户端的写入。用于replSetAbortPrimaryCatchUp 中止选举,然后完成向主节点的过渡。
该设置仅在使用时适用 protocolVersion: 1.
笔记
要将 3.6 版本启动的副本集降级到 3.4,请将
catchUpTimeoutMillisfrom更改-1为正数。未能将此值更改为正数会导致运行 3.4 版的节点既不重启也不加入副本集。
settings.catchUpTakeoverDelayMillis
可选。
类型:整数
默认值:30000(30 秒)
节点在确定它领先于当前 主节点后等待启动 追赶接管的时间(以毫秒为单位) 。在追赶接管期间,当前主节点之前的节点发起选举以成为副本集的新主节点。
发起接管的节点确定它领先于当前主节点后,它会等待指定的毫秒数,然后验证以下内容:
- 它仍然领先于当的主节点,
- 它是所有可用节点中最新的节点,
- 目前的主节点目前正在赶上它。
一旦确定所有这些条件都满足,发起接管的节点立即进行选举。
有关副本集选举的更多信息,请参阅副本集选举。
笔记
设置
catchUpTakeoverDelayMillis为-1禁用追赶接管。环境
catchUpTimeoutMillis禁用 主追赶0并因此也禁用追赶接管。
settings.heartbeatIntervalMillis仅限内部使用。心跳的频率(以毫秒为单位)。
settings.replicaSetId类型:ObjectId
rs.initiate()与副本集关联并在或 期间自动创建的 ObjectIdreplSetInitiate。你不能改变replicaSetId.
原文链接: https://docs.mongodb.com/manual/reference/replica-configuration/
译者:陆文龙