将自管理的副本集转换为分片集群
分片集群根据分片键在多个服务器上划分数据。分片键。对于大型数据集和高吞吐量操作,分片集群比副本集具有更好的扩展性。
本教程将单个三成员副本集转换为包含两个分片的分片集群。新集群中的每个分片都是一个独立的三个成员的副本集。
您可以在 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地址的节点将失败启动验证,并且不会启动。
开始之前
为了完成本教程,您必须拥有使用密钥文件或x.509证书身份验证的副本集。要部署使用这些身份验证方法之一的安全副本集,请参阅以下内容:
本教程使用默认数据目录
/data/db
和/data/configdb
。要使用不同的路径,请在配置文件中将storage.dbPath
设置。MongoDB支持通过允许直接针对分片运行命令,在线从副本集过渡到1分片集群。然而,一旦集群拥有多个分片,只能直接针对分片运行 列出的命令,而不需要维护仅有的
directShardOperations
角色。
步骤
注意
从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
角色。
部署配置服务器副本集
为配置服务器部署一个三成员副本集。在此示例中,配置服务器使用以下主机
mongodb7.example.net
mongodb8.example.net
mongodb9.example.net
配置配置服务器
在每个配置服务器主机上配置一个
mongod
实例。在每个mongod
实例的配置文件中指定以下选项选项值configReplSet
configsvr
localhost
,然后是mongod
应该监听客户端连接的任何其他主机名。replication: replSetName: configReplSet sharding: clusterRole: configsvr net: bindIp: localhost,<hostname(s)> 根据您的部署需要包括其他附加选项。
启动配置服务器
使用您的指定配置部署
mongod
mongod --config <PATH_TO_CONFIG_FILE> 配置服务器使用默认数据目录
/data/configdb
和默认端口27019
。连接到其中一个配置服务器。
使用
mongosh
连接到其中一个配置服务器。例如mongosh "mongodb://mongodb7.example.net:27019" 初始化配置服务器副本集。
要初始化副本集,运行
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()
实例上运行。
将现有用户和角色恢复到新配置
恢复您运行 mongodump
时获取的现有用户和角色。
mongorestore ./adminDump --nsInclude "admin.*" --host <configPrimaryURI>
前面的命令使用 localhost 异常 来执行无需认证的管理操作。
运行此命令的输出可能类似于
0 document(s) restored successfully
此消息不表示问题。此输出表示除了用户和角色外,没有其他文档被恢复。
安全配置服务器副本集
重新配置并重启配置服务器副本集。
重新配置配置服务器
选择您的身份验证机制选项卡
在每个主机上重启一个
mongod
实例mongodb7.example.net
mongodb8.example.net
mongodb9.example.net
选项值用于您初始副本集的密钥文件的路径。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
文件的绝对路径。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
。重启MongoDB
使用您指定的配置重启
mongod
mongod --config <PATH_TO_CONFIG_FILE> --shutdown mongod --config <PATH_TO_CONFIG_FILE>
部署 mongos
mongos
提供客户端应用程序与分片集群之间的接口。
为 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)> 包括适用于您的部署的任何附加选项。
部署 mongos。
使用您指定的配置部署
mongos
mongos --config <PATH_TO_CONFIG_FILE>
将初始副本集作为分片重启
在此示例中,您的初始副本集是一个包含三个成员的副本集。此步骤更新初始副本集,以便将其添加为分片集群中的分片。
副本集在这些主机上运行
mongodb0.example.net:27017
mongodb1.example.net:27017
mongodb2.example.net:27017
对于分片集群,您必须将分片中的每个 mongod
实例的角色设置为 shardsvr
。要指定服务器角色,请将 sharding.clusterRole
设置在 mongod
配置文件中。
连接到初始副本集的一个成员。
使用
mongosh
连接到初始副本集的一个成员。mongosh "mongodb://<username>@mongodb0.example.net:27017" 如果您的部署使用 x.509 身份验证,请指定这些
mongosh
选项例如
mongosh "mongodb://<username>@mongodb0.example.net:27017" --tls --tlsCAFile <CA_FILE> --tlsCertificateKeyFile <filename> 确定副本集的主节点和从节点。
运行
rs.status()
以确定主节点和从节点rs.status() 在命令输出中,
replSetGetStatus.members[n].stateStr
字段指示哪个成员是主节点,哪些成员是从节点。使用
--shardsvr
选项重启从节点。警告
此步骤需要为连接到副本集从节点的应用程序提供一些停机时间。
您重启一个从节点后,连接到该从节点的任何应用程序将返回一个
CannotVerifyAndSignLogicalTime
错误,直到您执行 将初始副本集作为分片添加 中的步骤。您还可以重启应用程序以停止它接收
CannotVerifyAndSignLogicalTime
错误。连接到从节点。
使用
mongosh
连接到一个从节点。mongosh "mongodb://<username>@<host>:<port>" 关闭从节点。
运行以下命令
use admin db.shutdownServer() 编辑从节点的配置文件。
在从节点的配置文件中,将
sharding.clusterRole
设置为shardsvr
security: keyFile: <PATH_TO_KEYFILE> replication: replSetName: rs0 sharding: clusterRole: shardsvr net: port: 27017 bindIp: localhost,<hostname(s)> 根据您的部署需要包括其他附加选项。
以分片服务器的方式重启次要节点。
在包含次要节点的宿主机上运行以下命令:
mongod --config <PATH_TO_CONFIG_FILE> 对其他次要节点重复关闭和重启步骤。
连接到从节点。
使用
mongosh
连接到一个从节点。如果您的部署使用 x.509 身份验证,请指定这些
mongosh
选项mongosh "mongodb://<username>@<host>:<port>" --tls --tlsCAFile <CA_FILE> --tlsCertificateKeyFile <filename> 关闭从节点。
运行以下命令
use admin db.shutdownServer() 编辑从节点的配置文件。
在从节点的配置文件中,将
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
。以分片服务器的方式重启次要节点。
在包含次要节点的宿主机上运行以下命令:
mongod --config <PATH_TO_CONFIG_FILE> 对其他次要节点重复关闭和重启步骤。
使用 --shardsvr
选项重启主节点。
警告
此步骤需要停机时间,以便连接到副本集主节点的应用程序。
重启主节点后,任何连接到主节点的应用程序都会返回 CannotVerifyAndSignLogicalTime
错误,直到您执行 将初始副本集添加为分片。 中的步骤。
您还可以重启应用程序以停止它接收 CannotVerifyAndSignLogicalTime
错误。
连接到主节点。
使用
mongosh
连接到主节点mongosh "mongodb://<username>@<host>:<port>" 降低主节点的地位。
运行以下命令
rs.stepDown() 验证降低地位是否完成。
运行
rs.status()
以确认您连接到的成员已降低地位并现在是次要节点rs.status() 关闭以前的primary。
运行以下命令
use admin db.shutdownServer() 等待关闭完成。
编辑主节点的配置文件。
在主节点的配置文件中,将
sharding.clusterRole
设置为shardsvr
security: keyFile: <PATH_TO_KEYFILE> replication: replSetName: rs0 sharding: clusterRole: shardsvr net: port: 27017 bindIp: localhost,<hostname(s)> 根据您的部署需要包括其他附加选项。
以分片服务器的方式重启主节点。
在包含主节点的宿主机上运行以下命令
mongod --config <PATH_TO_CONFIG_FILE>
连接到主节点。
使用
mongosh
连接到一个从节点。如果您的部署使用 x.509 身份验证,请指定这些
mongosh
选项如果您的部署使用 x.509 身份验证,请指定这些
mongosh
选项mongosh "mongodb://<username>@<host>:<port>" --tls --tlsCAFile <CA_FILE> --tlsCertificateKeyFile <filename> 降低主节点的地位。
运行以下命令
rs.stepDown() 验证降低地位是否完成。
运行
rs.status()
以确认您连接到的成员已降低地位并现在是次要节点rs.status() 关闭以前的primary。
运行以下命令
use admin db.shutdownServer() 等待关闭完成。
编辑主节点的配置文件。
在主节点的配置文件中,将
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
。以分片服务器的方式重启主节点。
在包含主节点的宿主机上运行以下命令
mongod --config <PATH_TO_CONFIG_FILE>
将初始副本集添加为分片
将初始副本集(rs0
)转换为分片后,将其添加到分片集群中。
以您的集群管理员用户身份连接到
mongos
。mongos
实例正在主机mongodb6.example.net
上运行。该命令以您在分片集群上创建的
admin01
用户身份进行身份验证。输入命令后,输入您的用户密码。添加分片。
要向集群添加分片,请运行
sh.addShard()
方法sh.addShard( "rs0/mongodb0.example.net:27017,mongodb1.example.net:27017,mongodb2.example.net:27017" ) 警告
一旦新的分片激活,
mongosh
和其他客户端必须始终连接到mongos
实例。不要直接连接到mongod
实例。如果您的客户端直接连接到分片,可能会创建数据或元数据不一致。
部署第二个副本集
部署一个名为 rs1
的新副本集。副本集 rs1
的成员位于以下主机上
mongodb3.example.net
mongodb4.example.net
mongodb5.example.net
启动副本集的每个成员。
对于每个成员,使用以下选项启动一个
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
上运行。启动副本集的每个成员。
连接到副本集成员。
使用
mongosh
连接到副本集的一个成员。例如mongosh "mongodb://mongodb3.example.net:27018" mongosh "mongodb://mongodb3.example.net:27018" --tls --tlsCAFile <CA_FILE> --tlsCertificateKeyFile <filename> 初始化副本集。
在
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()
实例上运行。为副本集添加管理员用户。
在部署副本集后,使用本地主机异常创建副本集的第一个用户。
确定副本集的主节点。
要确定主节点,运行
rs.status()
:rs.status() 在命令输出中,
replSetGetStatus.members[n].stateStr
字段指示哪个成员是主节点。连接到副本集的主节点。
使用
mongosh
连接到副本集的主节点。例如,如果主节点是mongodb4.example.net
,则运行此命令mongosh "mongodb://mongodb4.example.net:27018" 创建管理员用户。
运行以下
db.createUser()
方法以创建名为rs1Admin
的用户,并具有userAdmin
角色use admin db.createUser( { user: "rs1Admin", pwd: passwordPrompt(), roles: [ { role: "userAdmin", db: "admin" } ] } ) 运行命令后,数据库会提示您为
rs1Admin
用户输入密码。
将第二个副本集作为分片添加到集群中
将新的副本集 rs1
添加到分片集群。
将
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
用户身份进行身份验证。输入命令后,输入您的用户密码。添加第二个分片。
连接到
mongos
后,使用sh.addShard()
方法将副本集rs1
添加到集群中作为分片。sh.addShard( "rs1/mongodb3.example.net:27018,mongodb4.example.net:27018,mongodb5.example.net:27018" )
对集合进行分片
此过程的最后一步是在分片集群中分片一个集合。
确定分片键。
确定集合的 分片键。分片键表示 MongoDB 如何在分片之间分配文档。好的分片键
在所有文档中均匀分布值。
将同时访问的文档分组到连续的块中。
允许在分片中有效地分配活动。
有关更多信息,请参阅 选择分片键。
此过程使用
number
字段作为test_collection
集合的分片键。在分片键上创建索引。
在分片非空集合之前,在分片键上创建索引
use test db.test_collection.createIndex( { "number" : 1 } ) 分片集合。
在
test
数据库中,使用number
作为分片键分片test_collection
。sh.shardCollection( "test.test_collection", { "number" : 1 } ) 下次运行平衡器时,它将在分片之间重新分配文档块。当客户端向此集合插入更多文档时,
mongos
将将文档路由到适当的分片。当平衡器重新分配块时,可能会对应用程序的性能产生负面影响。为了最小化性能影响,您可以指定平衡器运行的时间,以便在高峰时段不运行。有关更多信息,请参阅 安排平衡窗口。
了解更多
有关更多分片教程和流程,请参阅以下页面