0

我很高兴Amazon EC2用户,我在这里和那里跟随了一些教程(主要是this one),并且我成功部署了一个node.js应用程序。在亚马逊EC2上缩小我的单实例node.js/mongodb应用程序 - 从头开始​​

我目前有t2.nano机器,它可以很好地作为我的情侣用户的测试环境。目前我的iOS应用程序已经准备就绪,因此在发布大版本之前,我需要关注可扩展性并为更多用户做好准备。

我乐观地认为我很快就会有1000个用户。我希望准备好整个环境,以便至少能够为这些用户顺利工作。但问题是 - 我不知道我应该如何开始配置一切。

纠正我,如果我错了,但我认为我需要2-3台机器t2.medium(?)所有这些运行我的node.js代码,并由Amazon's Load Balancer处理,但数据库呢?

如果我把事情做好了,我需要在一台机器上(上面提到的那些t2.medium之一)设置一个mongodb主实例,并在另外两台机器上创建slave实例?

但是 - 如果我这样做 - 那么在机器之间复制数据呢?另外 - 每个t2.medium机器上运行的每台node.js服务器必须与数据库建立连接 - 是否指向主数据库?

我试图找到任何教程 - 类似于我用来部署单个应用程序的教程 - 但我很努力。我发现this youtube video一个家伙描述他如何用5台机器(一台主人,其余的人是奴隶)来设置环境,但我不确定这是否是一个好方向。

请问你们能否帮助我,并在此给我提示?我不知道什么时候开始,现在我真的很感激任何事情。 谢谢!

+1

证明纳米是不够的。使用http://locust.io/或类似工具加载测试您的应用程序。检查瓶颈,并缩小最弱的组件。 –

+0

是的,你说得对,'nano'确实不够。目前我需要扩展环境,所以我想知道我该怎么做 - 我是否需要设置3台'中型'机器在单个负载平衡器后面?如果是的话 - 我如何将它们连接到我的数据库?我曾想过用node.js和3'medium“机器与数据库建立3台'medium'机器 - 其中一台有主设备和两台从设备,但是如何将这些设备连接到一个工作环境?我是否必须将每个node.js服务器指向我的主数据库,并希望 - 在过载的情况下 - 从站自动接管? – randomuser1

+0

从nano开始,您可以享受横向和纵向可扩展性。使用哪一个,以及要扩展的组件取决于负载测试和成本比较的结果。典型的设置使用主要读/写,并使用辅助冗余,但有用户案例直接连接到辅助。当您连接到副本集时,驱动程序的工作是找出哪个节点是主节点,并在选出后立即切换到下一个主节点。你可以继续。这样说,副本集使数据库变得更慢,它与规模无关。 –

回答

0

这个答案只限于数据库服务器的问题:

对于数据库,你当然应该配置一个replica set;但为了冗余和可用性,不能支持更高的负载。 MongoDB文档中有一些好的instructions on how to deploy

如果您想确保数据库支持更高的负载,那么您需要确保硬件(CPU,RAM,磁盘IO)完成任务;很难提前知道你需要什么水平的硬件配置,所以我建议你做一些负载测试来找出给定的硬件如何响应。

+0

感谢Vince,我会仔细研究一下,现在当我检查你的第二个链接时,它看起来就像我在原始问题中提到的YouTube教程中所做的完全一样。目前,我不知道如何与我的node.js设置一起处理它,尽管...我不确定是否应该将代码拆分到具有负载平衡器的单独机器中,如果是这样,如何首先将它与我的数据库副本集 – randomuser1

1

我会尽力一步一步回答这个问题。请记住,这只是众多可能的设置之一,可能完全不符合您的需求。

拓扑:

  1. AWS
  2. Node.js的
  3. MongoDB的

AWS - 你提到你现在正在争取1000个用户。你所说的关于你的应用程序的就是IOS,所以我们不知道后端数据库的密集程度如何(CRUD操作)。

我会开始关闭如果您需要它,并关注可扩展性。因此,我强烈建议亚马逊将其称为NAT Gateway。这将允许您的Node.js坐在面向Internet的服务器上,而MongoDB将在它后面。这首先保护了Mongo免受任何不必要的访问。换句话说,初始设置为1个网关(它可以存放Node.js),暂且让我们称之为网关后面的Master MongoDB。只能通过来自Gateway的SSH隧道访问此服务器。它位于CIDR地址范围内。

但是正确设置NAT网关并不简单1-2-3。您确实需要了解亚马逊如何使用路由,当然也需要了解如何正确使用入站和出站规则。

实际的网关服务器(Node.js服务器)应位于ElasticIP上。当您需要扩展到更好的服务器时,这将为您节省很多心痛。您在任何时候对服务器进行重大更改时都应该拍摄快照或实际的服务器映像。

至于网关服务器本身。根据您的Node.js实际代码,您至少应该使用t2介质,(微不会这样做)。至于保护,再次入站和出站规则,并可能在服务器上放置软件防火墙。

我自己也使用了其他一些实用程序,但我认为其中的一个实用程序是PM2。这将使您的节点代码在重新启动的情况下运行,并且随着您扩展到服务器上的更多内核而使生活更轻松。

你没有提到你选择的操作系统,所以我不会触及那个激烈的话题,除非说Ubuntu和AWS Linux是理智的选择。

至于你现在在你的网关后面保护的MongoDB。这里我可能会有点保守,基本上是因为我正在处理你询问的数字的现实。我个人认为没有理由让1000个用户在MongoDB上建立一个集群或分片,直到你看到你的应用真正起飞。 NAT网关是可扩展的,如果你的应用起飞了,那么你将会转向ATLAS或Enterprise。但是,你想要群集(主 - 奴隶),你可以选择3或7(我认为7可能是5)。一个是你的主人。你ssh隧道进入任何人,就像你ssh进入你的主人(显然是通过不同的CIDR)。如果你做集群,你必须真正密切关注mongod.conf file and all the parameters available to you

显然还有很多需要写的东西,当然很多人有不同的看法,这是一件好事。但是,我会在这里谨慎(以及您的月度账单!),直到您拥有需要工作的基本设置。然后,你可以将你的Mongo扩展到集群和分片以及你的Node.js应用程序。

只是为了总结:

  1. 入站和出站规则在AWS &路线
  2. OS将使用
  3. 实际的服务器和核心配置
  4. 的Node.js面临的网关服务器上世界
  5. 网关后面的MongoDB服务器(或集群)。
  6. 严重:您几乎应该立即在MongoDB中创建角色。这也是最后一道防线。如果没有至少一个管理员角色的设置,从来没有MongoDB的实例,所以您将能够控制访问或更改数据所需的权限。

祝你好运 - 希望它能比你梦想的更好!

+0

连接起来,非常感谢您耐心编写所有内容,我已经阅读过一次,我已经阅读过两次,但绝对不是最后一次。我认为这是一条更长的道路,但也很有趣。只要我完全理解了你答案中的所有单词,我就会分析它,看看我该如何继续。与此同时,我还有一个问题 - 我已经阅读了一些其他问题和答案,并且我想到了设置 - 仅仅是开始 - 像这样的设置:1'load ballancer'指向两个't2.medium '具有'node.js'代码的机器,以及一个存储'mongo'数据库的't2.medium' ... – randomuser1

+0

。从那时起,如果应用程序启动并且变得流行(D),我会考虑增加更多的机器到负载平衡器,并可能用'mongo'升级它。你认为这可能是一个健康的环境吗?我在问这个问题,因为我觉得我可以在几个小时内创建这样的环境,而不是花费几天时间来挖掘更复杂的解决方案。你怎么看? – randomuser1

+0

@ randomuser1查看我的帖子中提到的[NAT网关](http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-nat-gateway.html)。只要您在安装时提供足够的磁盘空间,两个t2就可以。请记住,MongoDB **绝对喜欢内存**,并且如果您正在执行繁重的CRUD,则需要正确设置mongod.conf中的参数。一旦你掌握了它,你就可以考虑真正的缩放,_if和when needed_。不要太过分,因为你有每月的账单需要考虑。 :) – twg