部署大规模系统的常见做法是什么?

时间:2009-09-28 02:38:55

标签: deployment release-management

鉴于一个大型软件项目,其中包含使用不同语言编写的多个组件,配置文件,配置脚本,环境设置和数据库迁移脚本 - 部署到生产的常见做法是什么?

需要考虑哪些困难?可以使用Ant或Maven等工具简化流程吗?如何处理回滚和数据库管理?是否建议对生产环境使用版本控制?

3 个答案:

答案 0 :(得分:10)

答案 1 :(得分:3)

免责声明:在我工作的地方,我们使用我写的内容,我将提及

我会告诉你我是怎么做的。

对于配置设置以及代码和内容的一般部署,我使用NAnt,CI服务器和dashy(自动部署工具)的组合。您可以将dashy替换为任何其他“东西”,自动上传到您的服务器(可能是capistrano)。

对于数据库脚本,我们使用RedGate SQL Compare获取脚本,然后对于大多数更改,我实际上手动创建(如果适用)。这是因为有些变化有点复杂,我觉得手工操作更舒服。您实际上可以使用此工具为您执行此操作(或至少生成脚本)。

根据您的语言,有一些工具可以为您编写数据库更新脚本(我想这个论坛上有人写了一个;希望他会回复),但我没有经验。这是我想补充的内容。

<强>难点

我忘了回答你的一个问题。

更新任何非常复杂/分布式站点的最大问题是数据库同步。您需要考虑是否有任何停机时间,如果这样做,DB会发生什么。你会关闭所有东西,以便不能处理任何交易吗?或者您将所有内容转移到一台服务器,更新DB B,然后同步DB A&amp; B,然后更新DB B?或其他什么?

无论你选择什么,你都需要选择它,并且要么说“每次更新都好,将有X停机时间”,或者其他什么。请记录下来。

你可以做的最糟糕的事情是某人交易失败,中间处理,因为你正在更新该服务器;或以某种方式只留下部分系统运作。

答案 2 :(得分:1)

我认为您对使用版本控制没有任何选择。

你不能没有版本控制(如评论中所述)。

我正在谈论经验,因为我目前正在一个网站上工作,我们有几个必须一起工作的项目:

  • 软件本身,在给定时间点的功能
  • 我们链接的外部系统(其中6个)(消息已版本化)
  • 包含配置(和翻译)的数据库
  • Apache服务器上托管的静态资源(图像,css,javascripts)(实际上是几个)
  • 一个java applet,必须与javascript和软件同步

这是有效的,因为我们使用版本控制,但我必须承认我们的数据库非常简单,并且因为部署是自动化的。

版本控制意味着我们实际上在任何时间点都有几个并发版本的消息,数据库,静态资源和Java小程序。

在“后退”事件中尤为重要。如果你在加载新软件时发现了一个缺陷并且突然你负担不起,那么如果你没有版本化就会出现危机,如果有的话,你只需加载旧软件。

正如我所说,部署是脚本化的:   - 首先部署静态资源(+ Java applet)   - 接下来是数据库,几个配置同步,因为它们是版本化的   - 软件在“酷”时间窗口排队等待(当我们的流量处于最低点时,所以在晚上)

当然,我们会处理外部服务器的向后/向前兼容性问题,这不应该被低估。