文档菜单
文档首页
/
MongoDB 手册
/ / /

将自管理的副本集转换为分片集群

本页内容

  • 关于此任务
  • 开始之前
  • 步骤
  • 了解更多

分片集群根据分片键在多个服务器上划分数据。分片键。对于大型数据集和高吞吐量操作,分片集群比副本集具有更好的扩展性。

本教程将单个三成员副本集转换为包含两个分片的分片集群。新集群中的每个分片都是一个独立的三个成员的副本集。

您可以在 UI中转换为分片集群MongoDB Atlas 上托管的部署。

本教程使用以下服务器

主机名
端口号
描述
mongodb0.example.net
27017
初始数据分片集群的成员,rs0
mongodb1.example.net
27017
初始数据分片集群的成员,rs0
mongodb2.example.net
27017
初始数据分片集群的成员,rs0
mongodb3.example.net
27018
第二个数据分片集群的成员,rs1
mongodb4.example.net
27018
第二个数据分片集群的成员,rs1
mongodb5.example.net
27018
第二个数据分片集群的成员,rs1
mongodb6.example.net
27017
用于连接到分区集群的mongos
mongodb7.example.net
27019
配置服务器副本集的成员。
mongodb8.example.net
27019
配置服务器副本集的成员。
mongodb9.example.net
27019
配置服务器副本集的成员。

本教程中使用的主机名是示例。请将示例命令中使用的主机名替换为您部署中使用的主机名。

重要

为了避免由于IP地址更改而导致的配置更新,请使用DNS主机名而不是IP地址。当配置副本集成员或分区集群成员时,特别重要的是使用DNS主机名而不是IP地址。

在跨越分裂网络视域的集群中配置时,请使用主机名而不是IP地址。从MongoDB 5.0开始,仅配置了IP地址的节点将失败启动验证,并且不会启动。

注意

从MongoDB 8.0开始,您只能在分片上运行 某些命令。如果您尝试直接连接到分片并运行不受支持的命令,MongoDB将返回错误

"You are connecting to a sharded cluster improperly by connecting directly
to a shard. Please connect to the cluster via a router (mongos)."

要直接针对分片运行不受支持的数据库命令,您必须连接到 mongos 或拥有维护仅有的 directShardOperations 角色。

1

要获取现有用户和角色,运行 mongodump

mongodump -d=admin --out=adminDump -u <adminUser> -p <password> --host <replicaSetURI> --dumpDbUsersAndRoles
2

为配置服务器部署一个三成员副本集。在此示例中,配置服务器使用以下主机

  • mongodb7.example.net

  • mongodb8.example.net

  • mongodb9.example.net

  1. 配置配置服务器

    在每个配置服务器主机上配置一个 mongod 实例。在每个 mongod 实例的配置文件中指定以下选项

    选项
    configReplSet
    configsvr
    localhost,然后是 mongod 应该监听客户端连接的任何其他主机名。
    replication:
    replSetName: configReplSet
    sharding:
    clusterRole: configsvr
    net:
    bindIp: localhost,<hostname(s)>

    根据您的部署需要包括其他附加选项。

  2. 启动配置服务器

    使用您的指定配置部署 mongod

    mongod --config <PATH_TO_CONFIG_FILE>

    配置服务器使用默认数据目录 /data/configdb 和默认端口 27019

  3. 连接到其中一个配置服务器。

    使用 mongosh 连接到其中一个配置服务器。例如

    mongosh "mongodb://mongodb7.example.net:27019"
  4. 初始化配置服务器副本集。

    要初始化副本集,运行 rs.initiate():

    rs.initiate( {
    _id: "configReplSet",
    configsvr: true,
    members: [
    { _id: 0, host: "mongodb7.example.net:27019" },
    { _id: 1, host: "mongodb8.example.net:27019" },
    { _id: 2, host: "mongodb9.example.net:27019" }
    ]
    } )

    前面的命令使用 localhost 异常 来执行无需认证的管理操作。

    重要

    在副本集的 一个 rs.initiate() 实例上运行。

3

恢复您运行 mongodump 时获取的现有用户和角色。

mongorestore ./adminDump --nsInclude "admin.*" --host <configPrimaryURI>

前面的命令使用 localhost 异常 来执行无需认证的管理操作。

运行此命令的输出可能类似于

0 document(s) restored successfully

此消息不表示问题。此输出表示除了用户和角色外,没有其他文档被恢复。

4

重新配置并重启配置服务器副本集。

  1. 重新配置配置服务器

    选择您的身份验证机制选项卡

    在每个主机上重启一个 mongod 实例

    • mongodb7.example.net

    • mongodb8.example.net

    • mongodb9.example.net

    配置文件 中指定这些选项,以每个 mongod 实例

    选项
    用于您初始副本集的密钥文件的路径。
    security:
    keyFile: <PATH_TO_KEYFILE>
    replication:
    replSetName: configReplSet
    sharding:
    clusterRole: configsvr
    net:
    bindIp: localhost,<hostname(s)>

    根据您的部署需要包括其他附加选项。

    在每个主机上重启一个 mongod 实例

    • mongodb7.example.net

    • mongodb8.example.net

    • mongodb9.example.net

    配置文件 中指定这些选项,以及您已经配置的选项,针对每个 mongod 实例

    选项
    x509
    requireTLS
    包含TLS证书和密钥的 .pem 文件的绝对路径。
    包含证书颁发机构根证书链的 .pem 文件的绝对路径。

    localhost,然后是 mongod 应该监听客户端连接的任何其他主机名。

    警告:在将您的实例绑定到公开可访问的IP地址之前,您必须保护您的集群免受未经授权的访问。有关安全建议的完整列表,请参阅自管理部署安全清单。至少,考虑启用身份验证强化网络基础设施

    sharding:
    clusterRole: configsvr
    replication:
    replSetName: configReplSet
    security:
    clusterAuthMode: x509
    net:
    tls:
    mode: requireTLS
    certificateKeyFile: <FILE_WITH_COMBINED_CERT_AND_KEY>
    CAFile: <CA_FILE>
    bindIp: localhost,<hostname(s)>

    根据您的部署情况,包括适当的附加选项,例如,如果您的TLS证书密钥文件使用密码加密,请包括net.tls.certificateKeyFilePassword

  2. 重启MongoDB

    使用您指定的配置重启 mongod

    mongod --config <PATH_TO_CONFIG_FILE> --shutdown
    mongod --config <PATH_TO_CONFIG_FILE>
5

mongos 提供客户端应用程序与分片集群之间的接口。

  1. 为 mongos 创建配置文件。

    在您的 mongos 配置文件中指定这些选项

    选项
    configReplSet,后跟一个斜杠 / 和至少一个配置服务器的主机名和端口号。
    用于您初始副本集的密钥文件的路径。
    localhost,后跟 mongos 应该监听客户端连接的其他主机名。
    sharding:
    configDB: configReplSet/mongodb7.example.net:27019,mongodb8.example.net:27019,mongodb9.example.net:27019
    security:
    keyFile: <PATH_TO_KEYFILE>
    net:
    bindIp: localhost,<hostname(s)>

    根据您的部署需要包括其他附加选项。

    在您的 mongos 配置文件中指定这些选项

    选项
    configReplSet,后跟一个斜杠 / 和至少一个配置服务器的主机名和端口号。
    x509
    requireTLS
    包含TLS证书和密钥的 .pem 文件的绝对路径。
    包含证书颁发机构根证书链的 .pem 文件的绝对路径。
    localhost,后跟 mongos 应该监听客户端连接的其他主机名。
    sharding:
    configDB: configReplSet/mongodb7.example.net:27019,mongodb8.example.net:27019,mongodb9.example.net:27019
    security:
    clusterAuthMode: x509
    net:
    tls:
    mode: requireTLS
    certificateKeyFile: <FILE_WITH_COMBINED_CERT_AND_KEY>
    CAFile: <CA_FILE>
    bindIp: localhost,<hostname(s)>

    包括适用于您的部署的任何附加选项。

  2. 部署 mongos。

    使用您指定的配置部署 mongos

    mongos --config <PATH_TO_CONFIG_FILE>
6

在此示例中,您的初始副本集是一个包含三个成员的副本集。此步骤更新初始副本集,以便将其添加为分片集群中的分片。

副本集在这些主机上运行

  • mongodb0.example.net:27017

  • mongodb1.example.net:27017

  • mongodb2.example.net:27017

对于分片集群,您必须将分片中的每个 mongod 实例的角色设置为 shardsvr。要指定服务器角色,请将 sharding.clusterRole 设置在 mongod 配置文件中。

注意

具有 shardsvr 角色的 mongod 实例的默认端口是 27018。要使用不同的端口,请指定 net.port 设置。

  1. 连接到初始副本集的一个成员。

    使用 mongosh 连接到初始副本集的一个成员。

    mongosh "mongodb://<username>@mongodb0.example.net:27017"

    如果您的部署使用 x.509 身份验证,请指定这些 mongosh 选项

    例如

    mongosh "mongodb://<username>@mongodb0.example.net:27017" --tls --tlsCAFile <CA_FILE> --tlsCertificateKeyFile <filename>
  2. 确定副本集的主节点和从节点。

    运行 rs.status() 以确定主节点和从节点

    rs.status()

    在命令输出中,replSetGetStatus.members[n].stateStr 字段指示哪个成员是主节点,哪些成员是从节点。

  3. 使用 --shardsvr 选项重启从节点。

    警告

    此步骤需要为连接到副本集从节点的应用程序提供一些停机时间。

    您重启一个从节点后,连接到该从节点的任何应用程序将返回一个 CannotVerifyAndSignLogicalTime 错误,直到您执行 将初始副本集作为分片添加 中的步骤。

    您还可以重启应用程序以停止它接收 CannotVerifyAndSignLogicalTime 错误。

    1. 连接到从节点。

      使用 mongosh 连接到一个从节点。

      mongosh "mongodb://<username>@<host>:<port>"
    2. 关闭从节点。

      运行以下命令

      use admin
      db.shutdownServer()
    3. 编辑从节点的配置文件。

      在从节点的配置文件中,将 sharding.clusterRole 设置为 shardsvr

      security:
      keyFile: <PATH_TO_KEYFILE>
      replication:
      replSetName: rs0
      sharding:
      clusterRole: shardsvr
      net:
      port: 27017
      bindIp: localhost,<hostname(s)>

      根据您的部署需要包括其他附加选项。

    4. 以分片服务器的方式重启次要节点。

      在包含次要节点的宿主机上运行以下命令:

      mongod --config <PATH_TO_CONFIG_FILE>
    5. 对其他次要节点重复关闭和重启步骤。

    1. 连接到从节点。

      使用 mongosh 连接到一个从节点。

      如果您的部署使用 x.509 身份验证,请指定这些 mongosh 选项

      mongosh "mongodb://<username>@<host>:<port>" --tls --tlsCAFile <CA_FILE> --tlsCertificateKeyFile <filename>
    2. 关闭从节点。

      运行以下命令

      use admin
      db.shutdownServer()
    3. 编辑从节点的配置文件。

      在从节点的配置文件中,将 sharding.clusterRole 设置为 shardsvr

      replication:
      replSetName: rs0
      sharding:
      clusterRole: shardsvr
      security:
      clusterAuthMode: x509
      net:
      port: 27017
      tls:
      mode: requireTLS
      certificateKeyFile: <FILE_WITH_COMBINED_CERT_AND_KEY>
      CAFile: <CA_FILE>
      bindIp: localhost,<hostname(s)>

      根据您的部署情况,包括适当的附加选项,例如,如果您的TLS证书密钥文件使用密码加密,请包括net.tls.certificateKeyFilePassword

    4. 以分片服务器的方式重启次要节点。

      在包含次要节点的宿主机上运行以下命令:

      mongod --config <PATH_TO_CONFIG_FILE>
    5. 对其他次要节点重复关闭和重启步骤。

7

警告

此步骤需要停机时间,以便连接到副本集主节点的应用程序。

重启主节点后,任何连接到主节点的应用程序都会返回 CannotVerifyAndSignLogicalTime 错误,直到您执行 将初始副本集添加为分片。 中的步骤。

您还可以重启应用程序以停止它接收 CannotVerifyAndSignLogicalTime 错误。

  1. 连接到主节点。

    使用 mongosh 连接到主节点

    mongosh "mongodb://<username>@<host>:<port>"
  2. 降低主节点的地位。

    运行以下命令

    rs.stepDown()
  3. 验证降低地位是否完成。

    运行 rs.status() 以确认您连接到的成员已降低地位并现在是次要节点

    rs.status()
  4. 关闭以前的primary。

    运行以下命令

    use admin
    db.shutdownServer()

    等待关闭完成。

  5. 编辑主节点的配置文件。

    在主节点的配置文件中,将 sharding.clusterRole 设置为 shardsvr

    security:
    keyFile: <PATH_TO_KEYFILE>
    replication:
    replSetName: rs0
    sharding:
    clusterRole: shardsvr
    net:
    port: 27017
    bindIp: localhost,<hostname(s)>

    根据您的部署需要包括其他附加选项。

  6. 以分片服务器的方式重启主节点。

    在包含主节点的宿主机上运行以下命令

    mongod --config <PATH_TO_CONFIG_FILE>
  1. 连接到主节点。

    使用 mongosh 连接到一个从节点。

    如果您的部署使用 x.509 身份验证,请指定这些 mongosh 选项

    如果您的部署使用 x.509 身份验证,请指定这些 mongosh 选项

    mongosh "mongodb://<username>@<host>:<port>" --tls --tlsCAFile <CA_FILE> --tlsCertificateKeyFile <filename>
  2. 降低主节点的地位。

    运行以下命令

    rs.stepDown()
  3. 验证降低地位是否完成。

    运行 rs.status() 以确认您连接到的成员已降低地位并现在是次要节点

    rs.status()
  4. 关闭以前的primary。

    运行以下命令

    use admin
    db.shutdownServer()

    等待关闭完成。

  5. 编辑主节点的配置文件。

    在主节点的配置文件中,将 sharding.clusterRole 设置为 shardsvr

    replication:
    replSetName: rs0
    sharding:
    clusterRole: shardsvr
    security:
    clusterAuthMode: x509
    net:
    port: 27017
    tls:
    mode: requireTLS
    certificateKeyFile: <FILE_WITH_COMBINED_CERT_AND_KEY>
    CAFile: <CA_FILE>
    bindIp: localhost,<hostname(s)>

    根据您的部署情况,包括适当的附加选项,例如,如果您的TLS证书密钥文件使用密码加密,请包括net.tls.certificateKeyFilePassword

  6. 以分片服务器的方式重启主节点。

    在包含主节点的宿主机上运行以下命令

    mongod --config <PATH_TO_CONFIG_FILE>
8

将初始副本集(rs0)转换为分片后,将其添加到分片集群中。

  1. 以您的集群管理员用户身份连接到 mongos

    mongos 实例正在主机 mongodb6.example.net 上运行。

    要将 mongosh 连接到 mongos,请运行以下命令

    mongosh "mongodb://admin01@mongodb6.example.net:27017"

    如果您的部署使用 x.509 身份验证,请指定这些 mongosh 选项

    如果您的部署使用 x.509 身份验证,请指定这些 mongosh 选项

    mongosh "mongodb://admin01@mongodb6.example.net:27017" --tls --tlsCAFile <CA_FILE> --tlsCertificateKeyFile <filename>

    该命令以您在分片集群上创建的 admin01 用户身份进行身份验证。输入命令后,输入您的用户密码。

  2. 添加分片。

    要向集群添加分片,请运行 sh.addShard() 方法

    sh.addShard( "rs0/mongodb0.example.net:27017,mongodb1.example.net:27017,mongodb2.example.net:27017" )

    警告

    一旦新的分片激活,mongosh 和其他客户端必须始终连接到 mongos 实例。不要直接连接到 mongod 实例。如果您的客户端直接连接到分片,可能会创建数据或元数据不一致。

9

在您向集群添加第一个分片后,更新您应用程序使用的连接字符串为您的分片集群的连接字符串。然后,重新启动您的应用程序。

10

部署一个名为 rs1 的新副本集。副本集 rs1 的成员位于以下主机上

  • mongodb3.example.net

  • mongodb4.example.net

  • mongodb5.example.net

  1. 启动副本集的每个成员。

    对于副本集中的每个 mongod 实例,创建具有以下选项的配置文件

    选项
    用于您初始副本集的密钥文件的路径。
    rs1
    shardsvr
    localhost,然后是 mongod 应该监听客户端连接的任何其他主机名。
    security:
    keyFile: <PATH_TO_KEYFILE>
    replication:
    replSetName: rs1
    sharding:
    clusterRole: shardsvr
    net:
    bindIp: localhost,<hostname(s)>

    根据您的部署需要包括其他附加选项。

    对于每个成员,使用以下选项启动一个 mongod

    选项
    rs1
    shardsvr
    x509
    requireTLS
    包含TLS证书和密钥的 .pem 文件的绝对路径。
    包含证书颁发机构根证书链的 .pem 文件的绝对路径。
    localhost,然后是 mongod 应该监听客户端连接的任何其他主机名。
    replication:
    replSetName: rs1
    sharding:
    clusterRole: shardsvr
    security:
    clusterAuthMode: x509
    net:
    tls:
    mode: requireTLS
    certificateKeyFile: <FILE_WITH_COMBINED_CERT_AND_KEY>
    CAFile: <CA_FILE>
    bindIp: localhost,<hostname(s)>

    使用您的指定配置部署 mongod

    mongod --config <PATH_TO_CONFIG_FILE>

    注意

    当您为 mongod 实例指定 --shardsvr 选项时,该实例默认在端口 27018 上运行。

  2. 启动副本集的每个成员。

  3. 连接到副本集成员。

    使用 mongosh 连接到副本集的一个成员。例如

    mongosh "mongodb://mongodb3.example.net:27018"
    mongosh "mongodb://mongodb3.example.net:27018" --tls --tlsCAFile <CA_FILE> --tlsCertificateKeyFile <filename>
  4. 初始化副本集。

    mongosh 中,运行 rs.initiate() 方法以初始化包含当前成员的副本集

    rs.initiate( {
    _id : "rs1",
    members: [
    { _id: 0, host: "mongodb3.example.net:27018" },
    { _id: 1, host: "mongodb4.example.net:27018" },
    { _id: 2, host: "mongodb5.example.net:27018" }
    ]
    } )

    前面的命令需要本地主机异常才能在不进行身份验证的情况下执行管理操作。

    重要

    在副本集的 一个 rs.initiate() 实例上运行。

  5. 为副本集添加管理员用户。

    在部署副本集后,使用本地主机异常创建副本集的第一个用户。

    1. 确定副本集的主节点。

      要确定主节点,运行 rs.status()

      rs.status()

      在命令输出中,replSetGetStatus.members[n].stateStr 字段指示哪个成员是主节点。

    2. 连接到副本集的主节点。

      使用 mongosh 连接到副本集的主节点。例如,如果主节点是 mongodb4.example.net,则运行此命令

      mongosh "mongodb://mongodb4.example.net:27018"
    3. 创建管理员用户。

      运行以下 db.createUser() 方法以创建名为 rs1Admin 的用户,并具有 userAdmin 角色

      use admin
      db.createUser(
      {
      user: "rs1Admin",
      pwd: passwordPrompt(),
      roles: [
      { role: "userAdmin", db: "admin" }
      ]
      }
      )

      运行命令后,数据库会提示您为 rs1Admin 用户输入密码。

11

将新的副本集 rs1 添加到分片集群。

  1. mongosh 连接到 mongos

    在命令行中运行以下命令以连接到运行在主机 mongodb6.example.net 上的 mongos 实例

    mongosh "mongodb://admin01@mongodb6.example.net:27017/admin"
    mongosh "mongodb://admin01@mongodb6.example.net:27017/admin" --tls --tlsCAFile <CA_FILE> --tlsCertificateKeyFile <filename>

    该命令以您在分片集群上创建的 admin01 用户身份进行身份验证。输入命令后,输入您的用户密码。

  2. 添加第二个分片。

    连接到 mongos 后,使用 sh.addShard() 方法将副本集 rs1 添加到集群中作为分片。

    sh.addShard( "rs1/mongodb3.example.net:27018,mongodb4.example.net:27018,mongodb5.example.net:27018" )
12

此过程的最后一步是在分片集群中分片一个集合。

  1. 确定分片键。

    确定集合的 分片键。分片键表示 MongoDB 如何在分片之间分配文档。好的分片键

    • 在所有文档中均匀分布值。

    • 将同时访问的文档分组到连续的块中。

    • 允许在分片中有效地分配活动。

    有关更多信息,请参阅 选择分片键。

    此过程使用 number 字段作为 test_collection 集合的分片键。

  2. 在分片键上创建索引。

    在分片非空集合之前,在分片键上创建索引

    use test
    db.test_collection.createIndex( { "number" : 1 } )
  3. 分片集合。

    test 数据库中,使用 number 作为分片键分片 test_collection

    sh.shardCollection( "test.test_collection", { "number" : 1 } )

    下次运行平衡器时,它将在分片之间重新分配文档块。当客户端向此集合插入更多文档时,mongos 将将文档路由到适当的分片。

    当平衡器重新分配块时,可能会对应用程序的性能产生负面影响。为了最小化性能影响,您可以指定平衡器运行的时间,以便在高峰时段不运行。有关更多信息,请参阅 安排平衡窗口。

有关更多分片教程和流程,请参阅以下页面

返回

将分片集群转换为副本集