我在使用 ELB 的 aws 上有一个主节点和两个辅助节点。阅读和写作的最佳实践是什么?
1)我是否在ELB中的所有节点与主节点和辅助节点创建一个单一的LB,并让python(pymongo)处理排序读写?
2) 还是将所有辅助节点置于 ELB 下并将主节点分配给弹性 IP?这将需要一个脚本来跟踪节点类型并在故障转移时重新分配。
我希望选项1。
谢谢
我在使用 ELB 的 aws 上有一个主节点和两个辅助节点。阅读和写作的最佳实践是什么?
1)我是否在ELB中的所有节点与主节点和辅助节点创建一个单一的LB,并让python(pymongo)处理排序读写?
2) 还是将所有辅助节点置于 ELB 下并将主节点分配给弹性 IP?这将需要一个脚本来跟踪节点类型并在故障转移时重新分配。
我希望选项1。
谢谢
这取决于你的情况。使用 mongodb 驱动程序,您不必跟踪客户端连接到哪个节点 - 您只需通知它有关副本集的信息,它就会自动连接到主节点并处理故障转移。
如果要分配读取负载,则可以设置读取首选项以允许应用程序从辅助节点读取,但您将只能写入主节点。这意味着为所有传入连接设置 ELB 是不必要的,甚至可能会伤害您,因为它可能导致写入被发送到辅助节点(它们将失败)。使用读取首选项将允许您分发读取,因此在您的情况下,我建议不要使用 ELB。
一般来说,我会看看http://www.slideshare.net/jrosoff/mongodb-on-ec2-and-ebs。您可能会发现它很有帮助。
我在同一条船上,但我在一个副本集中运行 3 个 mongo 实例,2 个默认实例和 1 个仲裁器。设置 ElasticIP 是一个坏主意 b/c 这意味着您的 mongo 服务器将有一个面向公众的连接,这是您不想要的。
我最终创建了一个 ELB,它在 27017 上侦听并转发给副本集的两个默认成员,但不是为了实际的负载平衡,而是为了容错。因此,如果 27017 健康检查失败,备用服务器可以处理后续请求。加上 ELB,您可以创建 DNS CNAME 记录并指向您的应用程序使用它,在我的情况下,我使用“docstore”。这样您就不需要指定实际的 mongo 实例,如 docstore-1 和 docstore-2 等。
我认为答案是,您不使用负载均衡器。您的客户端提供所有副本集成员(主副本和辅助副本)的详细信息,并连接到当前主副本,无论哪个可能。
mongo --host replicaSetName/host1[:porthost1],host2[:porthost1],host3[:porthost3] databaseToConnect
在这里,我们使用命令行客户端连接到副本集(不是单个节点),但它可以是 nodeJS、MongoChef(支持副本集)或您正在连接的任何客户端。