如何在生产中的副本集中添加新服务器

时间:2013-11-27 19:41:24

标签: mongodb database-replication

我是mongodb副本集的新手。

根据Replic Set Ref,这应该是我的应用程序中连接到mongodb的连接字符串

mongodb://db1.example.net,db2.example.net,db3.example.net:2500/?replicaSet=test

假设这是生产副本集(即我无法更改应用程序代码或停止所有mongo服务器)而且,我想在db4.example.net副本集中添加另一个mongo db实例test。我该怎么做?

我的应用程序如何了解新的db4.example.net

如果您正在寻找真实场景: 在任何现有服务器因硬件故障等原因而关闭的情况下,将另一个数据库服务器添加到副本集以保留冗余是很自然的。但是,怎么做。

2 个答案:

答案 0 :(得分:4)

连接字符串中的replica set hosts列表是“种子列表”,不必包含副本集的所有成员。

应用程序使用的MongoDB客户端驱动程序将遍历种子列表,直到它可以成功连接到主机,并使用该主机请求当前replica set configuration,它将列出副本集的所有当前成员。根据文档,建议在连接字符串中包含至少两个主机,以便在第一个主机发生故障时,驱动程序仍可以连接。

客户端驱动程序会自动发现副本集配置中的任何更改(即添加/删除成员或选择新主服务器),因此您不必在应用程序配置中对add a new member进行任何更改副本集。

副本集配置的更改可能会触发新主节点的选举,因此您的应用程序代码应该在重新配置期间处理几秒钟的瞬态错误。

一些有用的mongo shell命令:

您应该注意rs.conf()返回的配置文档中的版本号。此版本在每次配置更改时都会递增,因此驱动程序和副本集节点可以检查它们是否具有过时的配置版本。

  

我的应用程序如何了解新的db4.example.net

只需rs.add("db4.example.net"),您的应用就会自动发现此主机。

在您的方案中,如果您要替换完全死亡的主机,您可能还需要rs.remove()原始主机(添加替换后)以维护voting majority for your replica set

或者,不是添加具有新名称的主机,而是使用与先前配置的主机名相同的新服务器替换死主机。例如,如果db3.example.net死亡,您可以将其替换为新的db3.example.net,然后按照Resync a replica set member的步骤操作。

答案 1 :(得分:0)

为数据库提供抽象的方法是设置sharded cluster。在这种情况下,应用程序和数据库之间的访问点是mongodb路由器。它们背后发生的事情是在应用程序的可见性之外。您可以添加分片,删除分片,将分片转换为副本集以及更改所需的所有副本集。应用程序继续与路由器通信,路由器知道他们需要转发它们的服务器。您可以通过使用mongo shell连接到路由器来在运行时更改群集配置。

如果您对如何设置和管理MongoDB群集有疑问,请在http://dba.stackexchange.com上询问。

但请注意,在您描述的场景中,甚至不需要这样做。当您的某个数据库服务器出现硬件故障且系统管理员希望在没有应用程序停机的情况下更换它时,他们只需将相同的IP和主机名分配给新服务器,这样应用程序甚至不会注意到它是替代品。

如果您想了解有关如何执行此操作的详细信息,可以在http://serverfault.com

上找到帮助