mongodb shard在后台收集

时间:2016-02-12 09:13:05

标签: mongodb sharding

我收藏了大约8800万条记录。 该系列的大小约为9440 Mb。 此集合现在放在1个分片上(使用复制) 现在由于磁盘短缺,我必须在3个可用分片上进行分发(使用复制)。

这是我的数据库:

 Database_name = SensorData
 Collection_name = Values
 Index : 
  [
    {"v":1,"key":{"_id":1},"name":"_id_","ns":"SensorData.Values"},
    {"v":1,"key":{"i":1},"name":"i_1","ns":"SensorData.Values"},
    {"v":1,"key":{"i":1,"date":1},"name":"i_1_date_1","ns":"SensorData.Values"}
  ]
 Shard collections =
    {  "_id" : "set1",  "host" : "set1/***.***.***.35:27018,***.***.***.30:27018" }
    {  "_id" : "set2",  "host" : "set2/***.***.***.162:27018,***.***.***.33:27018" }
    {  "_id" : "set3",  "host" : "set3/***.***.***.174:27018,***.***.***.27:27018" }

我尝试了以下命令,但我的数据库将冻结。

sh.status()
     {  "_id" : "SensorData",  "partitioned" : true,  "primary" : "set1" }
sh.enableSharding("SensorData")
     { "ok" : 0, "errmsg" : "already enabled" }
sh.shardCollection("SensorData.Values", {i: 1} )

使用最后一个命令,数据库将在一段时间后冻结。

我的问题是:这是正确的方法吗?我可以在背景上对此集合进行分片,以便放置在此集合中的数据不会受到影响。 (或略有影响)

1 个答案:

答案 0 :(得分:1)

我的建议是让您的应用程序在操作期间进行维护,并执行以下操作:

  • 不要将任何内容更改为当前集合。
  • 使用您想要的分片键创建一个新的分片集合,并添加您想要的所有其他索引。
  • 运行脚本将数据从初始集合复制到在集群中正确分片的新数据。
  • 删除旧系列。
  • 将新集合重命名为初始名称。

最后,您可以通过预热新集合来强制在整个集群中创建块来提高复制步骤的速度,以确保您不仅依靠平衡器来完成所有工作,因为最初只有存储在其中一个分片上的一个块,它将暂时占用所有写入,直到平衡器可以重新平衡整个群集中的块。

希望它有所帮助。