MongoDB学习日记(2):复制集(Replica Set)初始化参数详解
复制集(Replica Set)初始化参数详解
官方文档地址:https://docs.mongodb.com/manual/reference/replica-configuration/
写此文仅为了本人方便记忆,主要内容是官方文档的中文翻译,再加上一些本人的理解,如有错误,欢迎一起探讨。
1.复制集配置文档示例
{ _id: <string>, version: <int>, protocolVersion: <number>, writeConcernMajorityJournalDefault: <boolean>, configsvr: <boolean>, members: [ { _id: <int>, host: <string>, arbiterOnly: <boolean>, buildIndexes: <boolean>, hidden: <boolean>, priority: <number>, tags: <document>, slaveDelay: <int>, votes: <number> }, ... ], settings: { chainingAllowed : <boolean>, heartbeatIntervalMillis : <int>, heartbeatTimeoutSecs: <int>, electionTimeoutMillis : <int>, catchUpTimeoutMillis : <int>, getLastErrorModes : <document>, getLastErrorDefaults : <document>, replicaSetId: <ObjectId> } }
这个文档可以作为 rs.initiate(),rs.config(),rs.conf(),rs.reconfig()的参数。(rs.config() == rs.conf())
下面就每一个字段进行详细解释。
2. _id
_id 表示了这个复制集的名字,一旦设定,就不允许改变,这个字段应该和Mongod启动时通过配置文件(--config)指定的replication.replSetName或者通过命令行参数--replSet指定的名字保持一致
3.version
这个字段是一个不断增长的正整数,表明了复制集配置的版本号,和下面的protocolVersion是有区别的,可以理解为是你自己定义的配置版本号。
4.protocolVersion
这个字段表示了复制集选举协议的版本号,就目前(3.4)来说,这个字段的默认值是1。之前有版本0。
5.writeConcernMajorityJournalDefault
这个字段在上面protocolVersion为1的时候默认为true,protocolVersion为0时默认为false。这个字段影响了writeConcern命令不显示的指定 j 参数时的表现。
我们以 writeConcern参数为 {w:"majority"}时为例子:
writeConcernMajorityJournalDefault 为 true时,意味着,一个写操作需要复制集中大多数可投票节点写入磁盘日志才能的到确认。
writeConcernMajorityJournalDefault 为 fasle时,意味着,一个写操作需要复制集中大多数可投票节点写入内存就可以得到确认,但是由于没有写入内存,可能会回滚导致实际上并没有成功写入,而你的系统却认为已经写入了。
6.configsvr
这个字段是3.4版本mongo新增的字段,默认为false。这个字段表明了这个复制集是否是用作分片集群的配置服务器。
7.members
这里面配置的你复制集中所有的节点。下面解释members每一个数组成员的字段进行解释。
-
_id : 一个唯一的数字标识一个节点,例如 0 1 2 3等等,不确定能否用负数。
-
host : 这是节点的主机名+可选的端口号(默认应该是27017),你需要确保这个主机名对于复制集中所有节点都是可以访问的。如果你在本机上搭建复制集你可以看我上一篇文章怎么配置host。
WARNING members[n].host cannot hold a value that resolves to localhost or the local interface unless all members of the set are on hosts that resolve to localhost.
-
arbiterOnly:这个字段表明了这个节点是否是一个仲裁节点,默认为false。
-
buildIndexes:这个字段表明了这个节点上是否能创建节点,默认为true。这个字段的值一旦被设置,就不允许再修改。如果你要将这个字段设置为false,那么同时也需要将proprity也设置为0。其他所有节点都无法从此字段为false的节点同步数据。仅在下列情形都满足的情况下你才应该把这个字段设置为false:
- 仅仅将这个节点作为备份使用,用来执行mongodump命令
- 这个节点不会接收任何的查询请求
- 创建和维护索引已经超过了宿主机的负载
-
hidden:默认为false。如果设置为true,那么这个节点就无法接受任何的读请求,通常来说hidden设置为0的节点,他的priority也需要设置为0。如果某个节点hidden设置为false,db.isMaster()命令的输出中不会包含该节点
-
priority:这个字段表明了一个节点成为主节点的优先级,可接受0-1000的数字,默认为1。如果一个节点的priority为0,那么这个节点永远都无法成为主节点。如果一个节点的priority大于0,那么他的votes就不能为0。mongo的选举算法会尽量让priority最高节点成为主节点,但是不意味着priority节点永远会成为主节点,大伙可以查询一下mongo选举的相关知识。
-
tags:一个标签字段,可以设置为任意的文档,可以利用这个参数来控制readPreference的行为。
-
slaveDeley:这个字段表明了一个节点的文档需要相对于主节点延迟多少时间,默认为0。slaveDeley大于0的节点,表明了该节点始终会保存最新节点过去某一个时间点的文档,而不是最新的节点。使用这个参数来创建deley memebers。如果该字段大于0,那么通常来说也需要将hidden设置为true。
-
votes :这个字段表明了一个节点拥有多少张选票,用于在主节点选举的时候投票使用,可选的参数是1和0,默认是1,仲裁节点总是有1张选票。通常来说,如果一个节点的votes=0,那么priority也应该设置为0。在当前版本(3.4),mongo复制集中最多有50个从节点,其中最多有7个可以投票的节点,也就是说另外43个votes都应该为0
8.settings
该字段可选,进行一些针对复制集的额外配置。
-
settings.chainingAllowed:这个字段表明了复制集中节点之间是否可以相互同步,默认为true。如果设置为false,那么所有节点都只能从主节点同步数据
-
settings.getLastErrorDefaluts:这个节点在写操作和getLastError命令没有显示的指定writeConcern是充当默认的writeConcern的。writeConcern的一个例子:{w:"majority"},表明了需要赋值集中大多数节点成功写入(内存或磁盘日志)时命令得到成功确认。如果这个字段没有设置,那么所有写操作仅仅需要得到主节点的确认即可,不需要从节点同步成功。
-
settings.getLastErrorModes:
-
setttings.heartbeatTimeoutSecs:可选的字段,默认为10。这个字段表明了节点之间心跳的超时时间,如果超过了这个时间,那么节点就会将该节点标记为不可达的。
-
settings.electionTimeoutMillis : 注意单位是ms,默认是10000,就是10秒钟,这个字段表明了如果主节点多久没有响应,那么就可以举行一次选举。这个值设置的越高,那么故障恢复越快,但是也会对网络缓慢等原因更敏感。
-
settings.catchUpTimeoutMillis:默认是2000,也就是2秒钟。这个字段表明了一个新选举的主节点做多花费多少时间从数据最新的节点同步数据(由此可知,主节点的数据可能并不永远是最新的),如果时间超过了,那么剩余没有同步的数据就会进行回滚。在新选举的主节点同步数据期间,主节点无法对外提供写服务。这个值设置的越高,那么越少的数据会需要回滚,但是同时也会增加故障恢复的时间。
-
settings.replicaSetId:在调用rs.initiate()调用中自动创建的一个ObjectId,标识了这个复制集,无法进行修改。