将分片独立版转换为分片副本集

从 MongoDB 3.6 开始,所有分片都必须是副本集。在将 3.4 分片群集升级到版本 3.6 之前,必须将作为独立mongod实例运行的所有分片转换为副本集分片。

本教程介绍了将独立的分片转换为分片replica set的过程。该过程特定于独立的分片。要将仅独立版本转换为副本集(即不属于任何分片群集的一部分),请参阅将独立版本转换为副本集

Procedure

Important

以下过程将独立分片转换为单成员副本集分片。该过程假定单个成员与以前在同一主机和端口上运行。

  • 关闭分片standalone mongod实例。

  • 使用--replSet选项重新启动碎片实例,以指定新副本集的名称。确保名称是唯一的(例如,您可以使用shard name作为副本集名称);特别是,分片副本集不得使用与配置服务器副本集相同的名称。

其他选项可以保持不变。

例如,以下命令启动独立实例作为名为shardA的新副本集的成员。其他选项与以前相同。例如--dbpath使用独立服务器的现有数据库路径/srv/mongodb/db0,而--port与以前相同:

mongod --port 27018 --dbpath /srv/mongodb/db0 --shardsvr --replSet shardA --bind_ip localhost,<ip address of the mongod host>

有关配置选项的更多信息,请参见配置文件选项mongod手册页。

rs.initiate()

副本集现在可以使用了。要查看副本集配置,请使用rs.conf()。要检查副本集的状态,请使用rs.status()

  • 与实例断开连接。

  • mongo shell 连接到分片群集的mongos实例之一,并检索分片信息:

var myShard = db.getSiblingDB("config").shards.findOne( { _id: "<name>"} )

<name>替换为分片的名称。分片的<name>与分片副本集名称分开(除非您使用分片名称作为副本集名称)。要检索分片的名称,请参阅sh.status()方法的结果中的shards部分。例如,如果sh.status()的结果包括以下分片部分,则两个分片的名称分别为"shard0000""shard0001"

shards:
      {  "_id" : "shard0000",  "host" : "mongodb1.example.net:27018",  "state" : 1 }
      {  "_id" : "shard0001",  "host" : "mongodb2.example.net:27018",  "state" : 1 }
  • 使用副本集信息更新host信息:
myShard.host = "<replica-set>/<member>"

<replica-set>替换为副本集的名称。将<member>替换为副本集成员。例如shardA/mongodb1.example.net:27018

  • 保存信息。
db.getSiblingDB("config").shards.save(myShard, { writeConcern: { w: "majority" } } )
  • 对分片群集中的下一个独立分片重复上述步骤。确保为每个分片副本集使用一个唯一的名称。

  • 将分片独立实例转换为分片副本集后,通过重新启动分片群集的所有成员,强制分片群集的成员更新对其他分片连接字符串的了解:

  • 配置服务器副本集

  • mongos instances

  • 分片副本集

Additional Information

要将成员添加到此副本集中,请使用rs.add()方法。有关将成员添加到副本集中的更多信息,请参见将成员添加到副本集中

要将非分片独立版本转换为非分片副本集,请参阅将独立版本转换为副本集