【问题标题】:MongoDB Replicate sets and ELBMongoDB 复制集和 ELB
【发布时间】:2012-11-13 13:22:07
【问题描述】:

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

1)我是否创建一个单一的LB,所有节点都在ELB中,主节点和次节点,让python(pymongo)处理排序读写呢?

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

我希望选择 1。

谢谢

【问题讨论】:

  • 你为什么要使用负载均衡器——通常你给客户端一个集合中所有成员的列表,它会找出每个成员的状态并相应地直接请求跨度>
  • 嗨 Frederick,谢谢,您上面简洁的评论确实为我提供了启示 - 请您快速检查下面的答案以确保它是正确的。
  • @FrederickCheung 如果您在私有网络中有 mongo 实例并且需要公开 mongo 而不使实例可以从 Internet 访问,那该怎么办?

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


【解决方案1】:

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

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

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

【讨论】:

  • 所以...如果我在一个代表集中有三个节点...并且我与 mongo 连接...我应该提供什么 IP 地址?假设任何人都可以倒下。我是否应该将弹性 IP 附加到当前主节点并始终监视主节点中的谁?
【解决方案2】:

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

我结束了创建一个 ELB,它在 27017 上侦听并转发到副本集的两个默认成员,但不是为了实际的负载平衡,而是为了容错。因此,如果 27017 健康检查失败,备用服务器可以处理后续请求。加上 ELB,您可以创建 DNS CNAME 记录并指向您的应用程序使用它,在我的情况下,我使用“docstore”。这样您就不需要指定实际的 mongo 实例,例如 docstore-1 和 docstore-2 等。

【讨论】:

  • 请详细说明一下,我在私有子网中有 3 个 mongo 实例,需要使它们可用,最好通过单个 ip/elb cname 来实现,这可能吗?
【解决方案3】:

我认为答案是,您不使用负载平衡器。您的客户端提供所有副本集成员(主副本和辅助副本)的详细信息,并连接到当前主副本,无论哪个可能。

How do you connect to a replicaset from a MongoDB shell?

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

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

【讨论】:

    猜你喜欢
    • 2016-02-27
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    相关资源
    最近更新 更多