MongoDB副本集和ELB

时间:2012-11-13 13:22:07

标签: mongodb amazon-web-services load-balancing pymongo

我在使用ELB的aws上有一个主要和两个辅助。什么是阅读和写作的最佳实践?

1)我是否在ELB中使用主要和辅助节点创建一个包含所有节点的LB,并让python(pymongo)处理排序以进行读写操作吗?

2)或者在ELB下放置所有辅助节点并将主节点分配给弹性IP?这将需要一个脚本来跟踪节点类型并在故障转移时重新分配。

我希望选择1。

由于

3 个答案:

答案 0 :(得分:5)

这取决于你的情况。使用mongodb驱动程序,您无需跟踪客户端连接到哪个节点 - 您只需通知它有关副本集的信息,它将自动连接到主服务器并处理故障转移。

如果要分发读取负载,则可以设置读取首选项以允许应用程序从辅助节点读取,但您只能写入主节点。这意味着为所有传入连接设置ELB是不必要的,甚至可能会伤害到你,因为它可能导致写入被发送到辅助节点(它们将失败)。使用读取首选项将允许您分发读取,因此在您的情况下,我建议不要使用ELB。

一般来说,我会看一下http://www.slideshare.net/jrosoff/mongodb-on-ec2-and-ebs。你可能会发现它很有帮助。

答案 1 :(得分:1)

我在同一条船上,但我在一个复制集中运行3个mongo实例,2个默认值和1个仲裁器。设置ElasticIP是一个坏主意b / c,这意味着您的mongo服务器将具有您不想要的面向公众的连接。

我结束创建了一个ELB,它侦听27017并转发给复制集的两个默认成员,但不是用于实际的负载平衡,而是用于容错。因此,如果27017运行状况检查失败,备用数据库可以处理后续请求。再加上ELB,您可以创建DNS CNAME记录并指出您的应用程序使用它,在我的情况下,我使用'docstore'。这样您就不需要指定实际的mongo实例,如docstore-1和docstore-2等。

答案 2 :(得分:0)

我认为答案是,您没有使用负载均衡器。您的客户端提供了所有副本集成员(主要和次要成员)的详细信息,并且它连接到当前主要成员(无论哪个)。

请参阅How do you connect to a replicaset from a MongoDB shell?

mongo --host replicaSetName/host1[:porthost1],host2[:porthost1],host3[:porthost3] databaseToConnect

在这里,我们使用命令行客户端连接到副本集(不是单个节点),但它可以是nodeJS,MongoChef(支持副本集)或您要连接的任何客户端。