setDefaultRWConcern
定义
setDefaultRWConcern
setDefaultRWConcern
管理命令为副本集或分片集群设置全局默认读关注或写关注配置。setDefaultRWConcern
必须针对admin
数据库运行。对于副本集,请在 主节点
mongod
上发出setDefaultRWConcern
命令。对于分片集群,在
mongos
上发出setDefaultRWConcern
命令。
兼容性
此命令可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
注意
所有 MongoDB Atlas 集群都支持此命令。有关 Atlas 对所有命令的支持的信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
该命令具有以下语法:
db.adminCommand( { setDefaultRWConcern : 1, defaultReadConcern: { <read concern> }, defaultWriteConcern: { <write concern> }, writeConcern: { <write concern> }, comment: <any> } )
命令字段
该命令接受以下字段:
字段 | 类型 | 说明 |
---|---|---|
| 设置为 | |
| 包含全局读关注配置的文档。指定一个有效的读关注对象。
省略此文档可保持当前的全局读关注(read concern)不变。如果省略,则 | |
| 包含全局默认写关注配置的文档。
省略此文档可保持当前的全局写关注(write concern)不变。如果省略,则 | |
对象 | 可选。指定由 命令本身使用的写关注(write 如果省略, | |
| any | 可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:
注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。 |
setDefaultRWConcern
返回一个包含当前配置的全局默认读关注和写关注的对象。有关返回字段的更完整文档,请参阅 getDefaultRWConcern
。
行为
注意
需要 featureCompatibilityVersion 4.4+
副本集或分片集群中的每个 mongod
都必须将 featureCompatibilityVersion 至少设置为 4.4
才能使用 setDefaultRWConcern
。
从 MongoDB 5.0 开始,只要通过 setDefaultRWConcern
命令设置了集群范围的写关注 (CWWC),就无法取消设置写关注。
MongoDB 仅将全局默认读关注或写关注应用于未显式指定读关注或写关注的操作。
如果 MongoDB 将全局默认的读关注或写关注应用于某个操作,则该操作的行为就像该读关注或写关注是由发出客户端显式指定的一样。
副本集
向副本集主成员发出 setDefaultRWConcern
。主成员将新的全局默认设置复制到副本集的其余成员。尚未复制已更新全局默认设置的从成员继续使用默认设置的本地“过时”副本。
发出带有写关注 w : "majority"
的 setDefaultRWConcern
命令,以确保命令仅在更改已传播到多数副本集节点后再返回。
分片集群
向集群中的 mongos
发出 setDefaultRWConcern
。mongos
将更新后的设置保留在配置服务器副本集 (CSRS) 中。每个 mongos
都会定期向 CSRS 发出 getDefaultRWConcern
命令来刷新其全局设置的本地副本。mongos
在两次刷新之间的时间段内使用全局默认值的本地“过时”副本。
发出 setDefaultRWConcern
命令时指定 writeConcern 为 w : "majority"
,确保该命令仅在更改已传播到多数 CSRS 节点后才返回。
当应用程序在未明确指定读关注或写关注设置的情况下针对 mongos
执行操作时,mongos
将应用相应的全局默认设置。
全局默认设置不会传播到单个分片。不能对分片运行 setDefaultRWConcern
。
重要
setDefaultRWConcern
需要 featureCompatibilityVersion 4.4+
。如果您将部署的 featureCompatibilityVersion 从 4.4
降级到 4.2
,则所有集群范围的读关注和写关注默认设置都将丢失,但是 mongos
实例可能会继续应用默认设置达 30 秒。
分片管理命令覆盖写关注设置
在配置服务器上执行写入操作的分片管理命令,例如 enableSharding
或 addShard
命令,使用全局默认写关注设置时具有特定行为:
无论配置何种全局默认写关注,这些命令都使用
"majority"
。这些命令使用的最小 wtimeout 为
60000
。仅当全局默认写关注大于60000
时,这些命令才使用全局默认写关注wtimeout
。
访问控制
对于在自管理部署上实施身份验证的副本集或分片的集群, setDefaultRWConcern
要求经过身份验证的用户具有setDefaultRWConcern
权限动作。
clusterManager
内置角色提供运行 setDefaultRWConcern
所需的权限。
例子
设置全局默认写关注
以下操作将全局写关注设置为:
db.adminCommand({ "setDefaultRWConcern" : 1, "defaultWriteConcern" : { "w" : 2 } })
该操作返回类似于以下内容的文档:
{ "defaultWriteConcern" : { "w" : 2 }, "updateOpTime" : Timestamp(1586290895, 1), "updateWallClockTime" : ISODate("2020-04-07T20:21:41.849Z"), "localUpdateWallClockTime" : ISODate("2020-04-07T20:21:41.862Z"), "ok" : 1, "$clusterTime" : { ... } "operationTime" : Timestamp(1586290925, 1) }
设置全局默认读关注
以下操作将全局读关注设置为 "majority"
:
db.adminCommand({ "setDefaultRWConcern" : 1, "defaultReadConcern" : { "level" : "majority" } })
该操作返回类似于以下内容的文档:
{ "defaultReadConcern" : { "level" : "majority" }, "updateOpTime" : Timestamp(1586290895, 1), "updateWallClockTime" : ISODate("2020-04-07T20:21:41.849Z"), "localUpdateWallClockTime" : ISODate("2020-04-07T20:21:41.862Z"), "ok" : 1, "$clusterTime" : { ... } "operationTime" : Timestamp(1586290925, 1) }
取消设置全局默认读关注和写关注
以下操作将全局默认读关注和写关注设置为:
w: 2
写入安全机制level: "majority"
读关注。
db.adminCommand({ "setDefaultRWConcern" : 1, "defaultWriteConcern" : { "w" : 2 }, "defaultReadConcern" : { "level" : "majority" } })
该操作返回类似于以下内容的文档:
"defaultWriteConcern" : { "w" : 2 }, "defaultReadConcern" : { "level" : "majority" }
设置全局默认读关注和写关注
您可以:
取消设置全局默认读关注。
仅当尚未设置全局默认写关注时,才能取消设置。
例如,假设全局默认读关注设置为 level: "majority"
。要取消设置全局默认读关注,请使用空文档 {}
:
db.adminCommand( { "setDefaultRWConcern" : 1, "defaultReadConcern" : {} } )
该操作返回一个文档,指明操作成功:
{ defaultReadConcern: { level: 'local' }, defaultWriteConcern: { w: 2, wtimeout: 0 }, updateOpTime: Timestamp({ t: 1656696934, i: 1 }), updateWallClockTime: ISODate("2022-07-01T17:35:40.578Z"), defaultWriteConcernSource: 'global', defaultReadConcernSource: 'implicit', localUpdateWallClockTime: ISODate("2022-07-01T17:35:40.578Z"), ok: 1, '$clusterTime': { ... }, operationTime: Timestamp({ t: 1656632593, i: 1 }) }
仅当尚未设置全局默认写关注时才能取消设置。
要取消设置全局默认写关注,请使用空文档 {}
:
db.adminCommand( { "setDefaultRWConcern" : 1, "defaultWriteConcern" : {} } )
如果全局默认写关注为:
取消设置,操作成功。
已设置,操作将返回以下错误。
MongoServerError: The global default write concern cannot be unset once it is set.