我刚开始使用EC2负载均衡器,并试图实现自动调用和容错。 数据库托pipe在RDS中,会话是共享的,文件使用S3共享。
我似乎无法find代码部署的最佳解决scheme。 我不想使用结构在所有实例上重新运行部署命令。
更新一个实例上的代码,从中创build一个AMI,然后用这个AMI重新启动实例似乎对我来说是一个重大的矫枉过正,因为我们每天部署多次,整个过程有点麻烦。
理想情况下,我希望将应用程序代码存储在所有实例中的共享(NFS?)卷上,并在部署期间更新该卷上的代码。 所有实例都可以监视特定文件的更改,并在文件被触摸时重新启动应用程序的工作人员。
有没有办法在所有实例上使用NFS并自动挂载共享EBS?
还是有更好的方法来做到这一点?
总结什么是期望的:
我更新了1个EC2实例/ NFS卷,然后在没有创build新的AMI的整个过程中剔除它,销毁实例并创build新的实例。 当应用程序代码和数据库模式不同步时,我不想让一些实例陷入困境。 我知道最好的做法是编写支持2个连续数据库模式更改的代码,但在这一点上我们确实无法承受。
我build议避免使用NFS共享,因为它们会为您的系统创build一个单一故障点,并且NFS客户端有时可能在从NFS服务器停机恢复时遇到问题。 NFS并不是真正做事的“云端办法”。 在虚拟机之间进行数据共享的AWS方式涉及使用各种分散的AWS服务。
为了这个特定的目的,我build议使用AWS S3服务。 为您的软件版本创build一个S3存储桶,在那里上传您的发布,并让虚拟机访问,以便他们可以通过轮询桶来下载发行版。 我还build议使用IAMangular色为生产虚拟服务器提供对S3存储桶的只读访问权限,而不使用任何硬编码的API凭据。 这个scheme保护您的发行版和存储桶,以防攻击者设法访问您的服务器。 由于没有硬编码的API凭证,因此不能在其他地方进行反向工程或滥用。
构build和开发环境可以用类似的方式build立 – 构build服务器或CI服务器如果驻留在AWS基础架构上,则可以具有对存储桶的读写访问权限。 如果您的构build/ CI服务器位于其他地方,则可以设置一个具有对S3的适当访问权限的IAM组,并创build一个具有API凭据的IAM用户以在外部站点使用。
您仍然需要准备一个AMI,以便它可以根据需要下载和configuration发行版,并启动应用程序,但至less在您每次发布新版本时不必重复此过程。 使用Chef,Puppet或Ansible等configurationpipe理工具可能可以满足您的所有需求,但您需要分配一些时间来熟悉这些工具,并与您的环境build模。
可以使用AWS CloudFormationbuild模,创build和维护基础架构(负载均衡器,asgs,安全组,angular色等)。 如果你的环境比单个ELB和单个ASG增长的更复杂,我build议看一看。 通过使用CloudFormation对基础架构进行build模,您可以轻松创build和维护整个环境的精确副本,例如testing/ qa和生产环境。 基础架构描述是可以保存在VCS存储库中的json文档。
我希望这有帮助。
理想情况下,您的自动configuration系统应该挂钩到您的部署环境中,以便为新节点提取初始代码。 自动调整组对于获取实例非常有用,但代码更新问题留给用户来练习。 在AMI中烘烤你的代码效果很好,除非你一天多次更新代码。 在这种情况下,最好build立一个独立的代码部署机制。
它确实取决于你的代码。 你有几个方法来做到这一点。
拉部署
这就是你所描述的方法:每个节点监视一些事情,一旦变化事件发生,它知道要拉新的代码。 有很多方法可以做到这一点。
这样做的好处是可以很好地扩展你的代码部署基础设施。 Pull方法意味着代码层运行两个版本的间隔时间更长,这会降低您的部署基础架构的强壮程度。
但是,你说你不能容忍多个代码版本。 这将是一个问题。 拉可能不是你现在想要的方法(尽pipe最终)。
推送部署
该方法在节点上推送代码。 像拉,有很多方法来做到这一点:
推动的优势在于它更容易在代码库中保持紧密的同步性。 如果你真的需要严格的单一版本的层次,那么更容易做到。 根据您如何configuration缩放间隔,可以closures部分实例,更新子集上的代码并将其打开。 数据库中的模式密钥告诉代码不处理任何工作,并将请求转发给那些拥有正确密钥的请求。 更新数据库中的密钥,并在几个毫秒内新代码节点开始做所有的工作,旧代码节点开始转发。 然后更新其他层上的代码。
如果您缩放组不能容忍代码中断…您可能必须去一个A / B系统的可伸缩性组。 更新B组中的代码,翻转数据库中的位,将ELB更改为指向B组。下一次更新的反向。
您使用哪种方法完全取决于您的整体应用程序对同时运行的多个代码版本的宽容程度。 像这样的分布式系统是一个复杂的系统,无论你多么努力,系统的一部分状态与系统的另一部分稍有不同。 您越不宽容,每次更新代码时都会发生越多的中断。 中断可能不到一秒钟,但仍然中断。