我是Amazon AWS的新手。 很多时候,我听到有关人们产生实例的信息,并且几乎立即将它们放在负载平衡器和现有集群之后。
在托pipe机器的传统世界中,这将包括供应硬件,安装操作系统,在机器上configurationnetworking,一旦networking可用,使用您select的工具(例如CFengine,Puppet或Chef)来引导机器它的类。
似乎有一些“快捷方式”能够在Amazon EC2中启动并运行特定类的服务器。 如果我在我的服务器上运行一个特定的堆栈,比如erlang,tomcat6等。让这些启动并运行并且连接到Amazon负载均衡器的最快方法是什么? 从networking到软件堆栈到内核调优? 是创build一个AMI,然后运行像Puppet这样的工具对新实例的组合吗?
任何想法
简短的回答:
这取决于您的应用程序 – AMI始终是一个起点,启动时需要定制您的实例的多less将决定除了“负载平衡器”后面的简单“自动调整实例”示例之外还需要什么。
不是这么简单的答案:
EC2上的实例非常类似于VPS – 实际上,它们是虚拟机(Amazon使用Xen虚拟化)。 我认为VPS和“云”服务器之间的主要区别在于易于部署 – 在“云”中configuration和添加十几个实例或几百GB的存储空间应该是一件小事。
由于亚马逊使用虚拟机,他们有这些机器的“图像”。 这些映像引用存储并包含对默认内核的引用(可以更改)。 此映像的内容通常将用于创build附加到实例的根卷。
你基本上使用Amazon提供的(相当多的)内核 – 编译你自己的内核通常不是一个选项 – 但你可以设置大部分参数,并利用可用的内核模块来实现你想要的。 一旦你创build了自己的AMI,你从它启动的所有实例将是相同的(禁止AMI运行自定义的任何脚本)。 这使得这几乎是所有情况下的起点。
对于事物的“虚拟”性质有一定的限制。 例如,您可以通过简单地停止实例,分离根卷,附加新卷并启动实例来切换根卷。 同样,您可以通过停止实例,修改实例属性并再次启动实例来更改实例types。
当你启动一个实例时,你可以指定(除其他外),实例types(例如m1.large)和AMI。 这意味着您的实例将启动在AMI上保存的所有内容 – 预先configuration的操作系统,安装的任何软件等。此外,AMI(或ec2-run-instances命令)还可以引用额外的存储 – 短暂的EBS支持。 在额外的EBS存储卷的情况下,可以从现有快照创build这些存储卷,并在启动时将其附加到您的实例。 (有趣的是,这些快照的内容是“懒惰地”加载的 – 意味着您可以在快照完全加载之前访问它们上的数据,如果您正在加载大量文件,则是有利的)。
考虑最简单的情况 – 所有机器都是相同的集群 – 首先,假设我们正在服务一个静态站点。 EC2可以让你垂直缩放(更强大的实例)和水平(更多的实例)。 所以,我们从最小的实例 – t1.micro开始,最终发现它不能处理负载。 我们现在可以在Elastic Load Balancer(ELB)之后添加第二个实例。 所以,一个传入的请求将会被传送到ELB(它应该被devise成具有冗余性和可扩展性 – 它应该自动添加更多的资源来满足对它的要求),并且将它传送到其中一个实例,该实例将处理请求并通过负载均衡器返回。
为了使这个过程自动化一些,我们可以使用Amazon的自动调节 – 本质上来说,使用触发器(Cloudwatch指标的值),您可以随时添加和删除实例(就像手动启动实例,指定实例types和AMI的新实例)。 而且,这些实例可以(不必是)与ELB根据某些度量标准(例如,CPU负载,RAM使用情况或其他自定义variables)的变化自动增大或缩小群集相关联。
现在 – 几乎所有关于上述情况的都是“糟糕的做法” – 您可能不应该从t1.micro横向扩展,因为它们的效率比较低,所以您首先要增加实例的大小; ELB的成本远高于(保留)t1.micro的成本,使其在经济上不可行; 如果你在AWS上提供一个静态的站点,你只需要使用S3,完全免除了实例的花销和麻烦,但重点是一个例子。
让我们来看一个更复杂的例子 – 一个PHP / MySQL网站(例如Wordpress)。 首先,我们将数据库从Web服务器中分离出来,所以让我们从每个实例开始 – 现在我们可以独立地进行缩放。 可以说,我们不是自己托pipeMySQL,而是使用Amazon的RDS(尽pipe个人而言,我更喜欢维护我自己的MySQL设置),这将简化其他MySQL实例的部署(当然,价格当然)。 我们的networking服务器都提供相同的内容,但现在可能会改变内容。 存储在数据库中的更改(例如新文章,注释等)不是问题 – 所有服务器都从相同的数据库实例中读取数据。 理想情况下,你会将你的代码存储在一些中央位置(例如S3),每个实例将在启动时将其拉出。 静态资产可以从CDN提供,这样就可以避免在本地处理分布式文件系统。 (ELB可以处理粘性会话,但最好是集中存储会话(例如Memcached),以便所有实例都可以访问它们 – 请记住,请求可以在任何情况下结束)。
(AWS确实有Elastic Beanstalk–它应该能够处理某些应用程序类所需的资源(例如PHP / MySQL) – 但我没有亲身体验过)。
对于更复杂的设置,可以将用户数据传递给实例,并且有方法可以获取所有正在运行的实例的列表(并且可以根据需要标记实例以将其分组)。 您可以在消息队列中处理任务(Amazon版本是简单队列服务,或者如果需要,请使用开源版本),以确保您的群集只处理每个请求一次。 当然,您也可以使用典型的高可用性工具(例如,Heartbeat / Corosync,Pacemaker等)来控制群集 – 这将使所有节点相互“意识到”,并让您控制运行的资源每个节点。 添加一个分布式文件系统(例如Gluster),你可以处理大多数场景。
除此之外,你仍然可以使用你提到的相同的工具。 上面的大多数想法是基于多次部署相同的AMI(您自定义您的AMI,并启动它的多个副本 – 每个应配备处理自己的基本configuration(如拉最新的代码等)) 。 如果您的实例要经常更改,或者您拥有更大的群集(例如,将更改发布到所有节点会有问题),或者如果您的节点不相似,则可以根据您的select部署节点configurationpipe理软件(例如Puppet,Chef等)。
还有一个步骤可以实现 – 即configuration您自己的“虚拟专用networking”(Virtual Private Network) – 从本质上讲,允许您创build一些面向私人和面向公众的NAT,并控制私有IP地址和networking接口(例如,你可以在一个实例上有多个接口)。
最后,如何部署应用程序非常依赖于应用程序的需求 – 每个节点需要共享什么信息,集群中有多less个节点,以及哪个节点相互依赖。 最简单的情况将永远是每个节点可以彼此独立运行的一个节点,并且发送到任何节点的请求将产生相同的结果…启动一个实例,定制它,创buildAMI,并在ELB后面自动调整。 所有其他scheme都需要一些计划来devise可以有效扩展的东西。
鉴于上述情况,我认为重要的是指出另一面–AWS是一项很好的服务 – 因为进入门槛较低 – 你可以从本质上免费学习(他们有一个免费的层级) – 而你可以根据您的需求进行扩展 然而,AWS上的每一件事都要付出代价 – 运行实例的小时数,存储的GB数量,磁盘上的I / O数量,对S3的请求数量,即将离任)的带宽 – 一切。 未来的事情很容易在相当短的时间内拿出相当的账单。 AWS绝对不是解决所有问题的办法,也不是没有限制(例如,在他们的networking上没有广播/多播数据包)。
(好吧,这比我打算写的几行更有意思了…)
在一个完全虚拟的环境中运行(不仅仅是EC2,尽pipe它配备了API,任何人都可以使用它)相对于完全物理的环境提供了几个加速:
所以是的,它确实提供了更好地简化stream程的方法。 鉴于正确的操作系统,更改服务器的身份可能相当容易,因此您可以使用纯物理方式完全预构build系统,从而最大限度地减less映像暂存时间。