2012-09-18 123 views
1

我一直在蒙戈工作了几个星期,并在开发建设我的环境。我从一个节点开始,然后移动到一个分片集群,现在想要移动到一个复制的分片集群。从我读一个复制碎片集群是最好的最好的,可扩展性,耐用性,性能提升等转换一个碎片集群的复制碎片集群

我读过最在他们的帮助下(非常好)教程。看起来他们的课程建议从单个节点到复制集,再到分片复制集,不幸的是我做到了。我似乎无法找到将分片群集升级到复制分片群集的任何内容。

这里有5台主机,我有:

  • APPSERVER
  • CONFIGSERVER
  • SHARD1
  • SHARD2
  • SHARD3

我开始每个碎片服务器有:

mongod --shardsvr 

然后,我开始在配置服务器:

mongod --configsvr 

然后,我开始了mongos进程的APPSERVER有:

mongos --configdb CONFIGSERVER 

然后在mongos,我加了分片,使分片上我的数据库,并定义了一个集合的shardkey:

sh.addShard("SHARD1:27018");//again for 2 and 3 
sh.enableSharding("beacon"); 
sh.shardCollection("beacon.alpha2", {"ip":1}); 

我想每个碎片都在其他两个碎片上复制。 (是吗?)我需要打倒的mongod进程的碎片,并用不同的CL参数重新启动呢?我需要在我的mongos shell中发出什么命令来让它复制?我是否应该导出所有数据,将所有内容全部删除,重新启动并重新导入?同样,我看到了很多关于如何创建一个副本集教程,但我实在不明白如何做给分片系统开始与一个副本集东西。

谢谢!

回答

3

对于每个分片,您需要重新启动当前成员,并使用--replset命令行选项启动它和两个新成员(或1个新成员和仲裁器)。你可以添加更多的成员,但是3是最低可行集合。然后从里面是什么将成为新的主(当前的SHARD1为例),你可以做到以下几点:

rs.add("newmember1:port") 
rs.add("newmember2:port") 
rs.initiate(); 

你会那么需要检查并确保该sh.status()已更新,以反映新成员副本集。在2.2这已成为稍微容易因为它应该是自动的,以前的版本,有必要手动保存在配置数据库中,这被反射分片组下的文档中的碎片信息。如果已经自动添加,你会看到副本集列表中sh.status()输出,类似于以下内容:

{ "_id" : "shard1", "host" : "shard1/SHARD1:port,newmember1:port,newmember2:port" } 

如果这不会自动发生,你将需要按照上面的文档链接中列出的程序,即从内部mongos

db.getSiblingDB("config").shards.save({_id:"<name>", host:"<rsName>/member1,member2,..."}) 

按照上面的示例会像:

db.getSiblingDB("config").shards.save({_id:"SHARD1", host:"shard1/SHARD1:port,newmember1:port,newmember2:port"}) 

您需要为每个分片执行此过程,并且您应该一次执行一次,以便在将所有SHARD1作为副本集移到SHARD2之前。您还需要注意,每次复制集在初次选举时都将变为只读,因此至少应该在停机时间或维护时间内安排。理想情况下,首先在临时环境中进行测试。

+0

谢谢,我最终导出了所有的数据,并重建/配置整个系统,我从你的答案中拿出了一些概念 – Landon