最近我一直在尝试各种云管理工具,例如 RightScale、Scalr、用于管理各种服务器的自定义脚本,每个服务器都承载多个角色(应用程序、数据库、负载均衡器、作业队列等)。
我发现大多数解决方案都缺少一种滚动部署的方法,即在具有相同角色的多个服务器上按顺序运行部署。例如,我不想同时构建我的所有 Web 服务器,因为这几乎肯定会导致我的客户停机或出现 500 次故障。我宁愿一次构建一两台服务器,同时其他服务器仍可用于处理请求。
另一种选择显然是启动在启动时自动更新的新服务器,但这并不那么划算,并且很可能需要更多时间才能完成构建(在现有服务器上构建比启动新服务器并关闭旧服务器更快)。
我们都听说过大公司有著名的“按下构建”按钮(如 Twilio、Etsy 等公司),但似乎它们都有自定义实现。我说的不是简单的 ssh-loop、clusterssh,甚至不是 mcollective - 我更喜欢具有简单易用的界面的东西,它允许我指定 RightScript 或 Scalr 脚本之类的东西在具有特定角色的一组服务器上运行,并按顺序构建它们。
是否有人知道完成此操作的简单方法,或者这是一个新的开源项目的候选?
答案1
结合使用 Puppet 和 MCollective。Puppet 可以完成大部分构建工作。MCollective 可让您选择节点并进行调度。
http://www.devco.net/archives/2010/03/17/scheduling_puppet_with_mcollective.php
答案2
我确实部署了韦比斯特拉诺,但我永远无法让我们的开发人员使用它。他们总是找到某种方法导致部署混乱。
答案3
我不知道有任何服务可以帮助进行此类更新。问题是应用程序需要考虑到这一点进行设计。您会看到很多服务器配置为使用服务器 x 作为数据库服务器或服务器 y 作为缓存服务器。当我开始查看我们的遗留软件并思考如何自动化更新过程等时,这是我看到的最大问题。
我们遇到了和你一样的问题。对我们来说,解决方案并不太难,因为我们所有的最新产品都是为此类更新而设计的,因为我们已经看到了它的难度。我们试图在开发中避免紧密耦合的服务。这使我们能够在暂存区启动一组全新的服务器。一旦我们完成暂存区的测试,我们就会通过更改 DNS 服务器中的 CNAME 将暂存区提升到生产状态。此过程不会发生任何停机时间,并且使用错误配置更新服务器的风险很低。我们使用 http 作为主要通信协议和本地 DNS 服务器实现了这一点。
我意识到重新设计整个应用程序以适应与滚动更新配合良好的特定架构可能并非易事,但我们发现这是最简单的解决方案。著名的“按下构建”按钮不一定只适用于大鱼,即使是小金枪鱼也可以获得一些这样的操作。根据您的应用程序的复杂程度或简单程度,将决定构建您自己的“按下构建”按钮的难易程度。