配置复制集标签设置¶
标签设定让我们可以为 replica set 定制 write concern 和 read preferences 。MongoDB将标签存储在复制集配置对象中,可以通过 rs.conf() 查看返回信息中的 members[n].tags 。
本文将介绍复制集标签的配置。有关标签的设定与其用法请参考 Replica Set Write Concern 和 标签设置 。
安全写级别和读优先级之间的差异。¶
自定义读优先级和安全写级别使用标签方式是不同的。
当选择一个节点进行读取的时候,读优先级考虑的是标签的值。
安全写级别不考虑标签的值,而是考虑标签值是否唯一。
举个栗子,一个读操作使用如下的条件:
{ "disk": "ssd", "use": "reporting" }
为了完成这样的读操作,该节点的标签必须包含这两个标签。下列任意标签组合都可以实现:
{ "disk": "ssd", "use": "reporting" }
{ "disk": "ssd", "use": "reporting", "rack": "a" }
{ "disk": "ssd", "use": "reporting", "rack": "d" }
{ "disk": "ssd", "use": "reporting", "mem": "r"}
这样的标签将*不*会满足之前的查询:
{ "disk": "ssd" }
{ "use": "reporting" }
{ "disk": "ssd", "use": "production" }
{ "disk": "ssd", "use": "production", "rack": "k" }
{ "disk": "spinning", "use": "reporting", "mem": "32" }
为复制集新增标签¶
现在的复制集配置如下:
{
"_id" : "rs0",
"version" : 1,
"members" : [
{
"_id" : 0,
"host" : "mongodb0.example.net:27017"
},
{
"_id" : 1,
"host" : "mongodb1.example.net:27017"
},
{
"_id" : 2,
"host" : "mongodb2.example.net:27017"
}
]
}
我们可以在 mongo 窗口中使用如下的命令来为复制集成员添加标签:
conf = rs.conf()
conf.members[0].tags = { "dc": "east", "use": "production" }
conf.members[1].tags = { "dc": "east", "use": "reporting" }
conf.members[2].tags = { "use": "production" }
rs.reconfig(conf)
在执行完设置命令后, rs.conf() 的输出如下:
{
"_id" : "rs0",
"version" : 2,
"members" : [
{
"_id" : 0,
"host" : "mongodb0.example.net:27017",
"tags" : {
"dc": "east",
"use": "production"
}
},
{
"_id" : 1,
"host" : "mongodb1.example.net:27017",
"tags" : {
"dc": "east",
"use": "reporting"
}
},
{
"_id" : 2,
"host" : "mongodb2.example.net:27017",
"tags" : {
"use": "production"
}
}
]
}
重要
所有标签的值必须是字符串形式。
自定义多数据中心的安全写级别¶
假设我们的五个节点位于两个数据中心中:
数据中心 VA` 标签为 ``dc.va
数据中心 GTO` 标签为 ``dc.gto
通过在 mongo 窗口中使用如下命令可来自定义该两个数据中心的安全写级别:
将复制集配置赋予到参数 conf 中:
conf = rs.conf()
根据节点的位置为其设置标签:
conf.members[0].tags = { "dc.va": "rack1"} conf.members[1].tags = { "dc.va": "rack2"} conf.members[2].tags = { "dc.gto": "rack1"} conf.members[3].tags = { "dc.gto": "rack2"} conf.members[4].tags = { "dc.va": "rack1"} rs.reconfig(conf)
建立自定义的 getLastErrorModes 设置来确保写操作能至少在每个数据中心的一台节点上完成:
conf.settings = { getLastErrorModes: { MultipleDC : { "dc.va": 1, "dc.gto": 1}}
通过 conf 变量来更新复制集配置:
rs.reconfig(conf)
为了让写操作至少在每个数据中心的一个节点上易用了,我们使用 MultipleDC 安全写模式:
db.users.insert( { id: "xyz", status: "A" }, { writeConcern: { w: "MultipleDC" } } )
此外,如果我们希望每次写操作至少在数据中心的2各节点中应用,可以在 mongo 窗口中进行如下设置:
创建一个有用复制集配置的变量 conf:
conf = rs.conf()
定义 getLastErrorModes 的值,为需要 dc.va 和 dc.gto 中匹配2个不同指:
conf.settings = { getLastErrorModes: { MultipleDC : { "dc.va": 2, "dc.gto": 2}}
通过 conf 变量来更新复制集配置:
rs.reconfig(conf)
现在,下面的写操作将会在2个数据中心中至少有2个节点都应用后才会返回写完成:
在 2.6 版更改: write operations 在写操作的应用是全新的。在之前版本中是需要使用 getLastError 命令来指定安全写级别。
db.users.insert( { id: "xyz", status: "A" }, { writeConcern: { w: "MultipleDC" } } )
通过标签来进行读写操作的功能性隔离¶
给复制集节点以如下的标签:
数据中心,
物理存储类型
存储(如硬盘)类型
每个复制集节点会是如下的标签设置:[1]
{"dc.va": "rack1", disk:"ssd", ssd: "installed" }
{"dc.va": "rack2", disk:"raid"}
{"dc.gto": "rack1", disk:"ssd", ssd: "installed" }
{"dc.gto": "rack2", disk:"raid"}
{"dc.va": "rack1", disk:"ssd", ssd: "installed" }
将读操作发送至拥有ssd硬盘的节点,可以用如下复制集标签设置:
{ disk: "ssd" }
为了创建可用的多个安全写模式,我们需要不同的 getLastErrorModes 配置。可以参考如下配置:
创建一个有用复制集配置的变量 conf:
conf = rs.conf()
配置如下的有2个模式的 getLastErrorModes :
conf.settings = { "getLastErrorModes" : { "ssd" : { "ssd" : 1 }, "MultipleDC" : { "dc.va" : 1, "dc.gto" : 1 } } }
通过 conf 变量来更新复制集配置:
rs.reconfig(conf)
我们可以通过指定 MultipleDC 模式,来保证写操作在每个数据中心中都应用了。
在 2.6 版更改: write operations 在写操作的应用是全新的。在之前版本中是需要使用 getLastError 命令来指定安全写级别。
db.users.insert( { id: "xyz", status: "A" }, { writeConcern: { w: "MultipleDC" } } )
又或者我们可以通过指定 ssd 模式来保证写操作至少写到了一个有SSD的实例上。
[1] | 由于读优先级和安全写级别使用标签的方式是不同的,larger deployments may have some redundancy. |