OPTIONS
翻译或纠错本页面

配置复制集标签设置

标签设定让我们可以为 replica set 定制 write concernread 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"
                     }
             }
     ]
}

重要

所有标签的值必须是字符串形式。

自定义多数据中心的安全写级别

假设我们的五个节点位于两个数据中心中:

  1. 数据中心 VA` 标签为 ``dc.va

  2. 数据中心 GTO` 标签为 ``dc.gto

通过在 mongo 窗口中使用如下命令可来自定义该两个数据中心的安全写级别:

  1. 将复制集配置赋予到参数 conf 中:

    conf = rs.conf()
    
  2. 根据节点的位置为其设置标签:

    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)
    
  3. 建立自定义的 getLastErrorModes 设置来确保写操作能至少在每个数据中心的一台节点上完成:

    conf.settings = { getLastErrorModes: { MultipleDC : { "dc.va": 1, "dc.gto": 1}}
    
  4. 通过 conf 变量来更新复制集配置:

    rs.reconfig(conf)
    

为了让写操作至少在每个数据中心的一个节点上易用了,我们使用 MultipleDC 安全写模式:

db.users.insert( { id: "xyz", status: "A" }, { writeConcern: { w: "MultipleDC" } } )

此外,如果我们希望每次写操作至少在数据中心的2各节点中应用,可以在 mongo 窗口中进行如下设置:

  1. 创建一个有用复制集配置的变量 conf

    conf = rs.conf()
    
  2. 定义 getLastErrorModes 的值,为需要 dc.vadc.gto 中匹配2个不同指:

    conf.settings = { getLastErrorModes: { MultipleDC : { "dc.va": 2, "dc.gto": 2}}
    
  3. 通过 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 配置。可以参考如下配置:

  1. 创建一个有用复制集配置的变量 conf

    conf = rs.conf()
    
  2. 配置如下的有2个模式的 getLastErrorModes

    conf.settings = {
                     "getLastErrorModes" : {
                             "ssd" : {
                                        "ssd" : 1
                             },
                             "MultipleDC" : {
                                     "dc.va" : 1,
                                    "dc.gto" : 1
                             }
                     }
                   }
    
  3. 通过 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.