将分片独立版转换为分片副本集
从 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.initiate()
副本集现在可以使用了。要查看副本集配置,请使用rs.conf()。要检查副本集的状态,请使用rs.status()。
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()方法。有关将成员添加到副本集中的更多信息,请参见将成员添加到副本集中。
要将非分片独立版本转换为非分片副本集,请参阅将独立版本转换为副本集。