1

我已经使用 mongo 工作了几个星期,并在开发人员中构建了我的环境。我从单个节点开始,然后移动到一个分片集群,现在想移动到一个复制的分片集群。从我读到的复制碎片集群是最好的,可扩展性,持久性,性能提升等。

我已经阅读了他们帮助中的大多数(非常好的)教程。似乎他们的课程建议从单节点到副本集,再到分片副本集,不幸的是,这与我的做法相反。我似乎找不到任何东西可以将分片集群升级为复制分片集群。

这是我拥有的 5 台主机:

  • 应用服务器
  • 配置服务器
  • SHARD1
  • 分片2
  • SHARD3

我启动了每个分片服务器:

mongod --shardsvr 

然后我启动了配置服务器:

mongod --configsvr 

然后我在 APPSERVER 上启动了 mongos 进程:

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 中发出什么命令才能复制它?我应该导出所有数据、删除所有数据、重新启动并重新导入吗?同样,我看到了很多关于如何创建副本集的教程,但我并没有真正看到任何关于如何在分片系统开始时创建副本集的内容。

谢谢!

4

1 回答 1

3

对于每个分片,您需要重新启动当前成员并使用--replset命令行选项启动它和两个新成员(或 1 个新成员和一个仲裁器)。您可以添加更多的成员,但 3 是最低的可行集。然后从将成为新主节点的内部(例如您当前的 SHARD1),您可以执行以下操作:

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

然后,您需要检查并确保sh.status()已更新以反映副本集的新成员。在 2.2 中,这变得稍微容易一些,因为它应该是自动的,对于以前的版本,必须手动将分片信息保存在配置数据库中,这反映在 sharded cluster 下的文档中。如果它已被自动添加,您将在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"})

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

于 2012-09-19T01:28:01.150 回答