是否可以对集合进行复制集和分片?

Is it possible to replicaset and shard a collection?

我已经看到,为了进行数据分发,我可以在 ReplicaSet 或 Sharding 之间进行选择。 使用带有这些参数的 mongodb 代码 --shardsvr --replSet.

mongod --shardsvr --port 27021 --replSet rs1 --dbpath C:\data\data5 --bind_ip localhost

我正在做的是制作一个分片服务器,它也是一个副本集,或者我只是在做一个分片? 如果我两者都不做,我应该写什么?

编辑

mongod --shardsvr --port 27020 --replSet rs1 --dbpath C:\data\data4 --bind_ip localhost
mongod --shardsvr --port 27021 --replSet rs1 --dbpath C:\data\data5 --bind_ip localhost
mongod --shardsvr --port 27022 --replSet rs1 --dbpath C:\data\data6 --bind_ip localhost
mongos --port 40000 --configdb rs0/localhost:27017
mongo --port 40000
rs.initiate( { _id : "rs1",  members: [   { _id: 0, host: "localhost:27020" },   { _id: 1, host: "localhost:27021" },   { _id: 2, host: "localhost:27022" }    ] })
sh.addShard( "rs1/localhost:27020,localhost:27021,localhost:27022")
sh.enableSharding("db")
sh.shardCollection("db.collection", { "_id" : 1 } )

当我执行这种代码时,我得到的是由 3 个正在分片和 repliceSet 的“服务器”分片的集合? 在 40'000 端口上使用 mongos,我可以进行接口和查询吗?

您创建了一个分片,它是一个三成员副本集和一个配置服务器作为一个单成员副本集。每个分片和每个配置服务器都必须是一个副本集。

如果您想获得多个分片,则必须为 --replSet 使用不同的名称,例如rs1, rs2, rs3.

在生产中,除非您不关心可用性,否则不应创建单成员副本集。通常你会创建另外 3 个分片节点,然后每个分片也被复制。

也许可以按照本教程进行操作 Deploy a Sharded Cluster

副本集和分片有不同的用途:

  • 副本集提供冗余(如果一个节点发生故障,数据也在其他节点上)
  • 分片提供可扩展性(如果一台服务器的数据太多,可以将其分散到多台服务器上)

设置分片集群时,每个分片(理论上)可以由单个节点或副本集支持。 MongoDB 目前要求分片由副本集支持,在旧版本中也允许单节点。

因此:

  • 单节点分片集群 = 无冗余。每个文档都存储一次,如果任何单个节点发生故障,您将丢失数据。但是您可以根据部署的分片数量获得可扩展性。
  • 具有支持副本集的分片集群 = 可扩展性和冗余性。