如何将应用程序从Heroku的Bamboo堆栈迁移到Cedar堆栈?

以下是「Heroku DevCenter的迁移到Celadon Cedar Stack」的中文本地化翻译(如果翻译的意思完全不同,请告诉我)

首先

Cedar堆栈是Heroku的默认运行堆栈,并取代了Bamboo堆栈。Cedar堆栈支持多种语言、灵活的进程类型和HTTP 1.1,自动注入代码的量大大减少。虽然无法自动从Bamboo堆栈迁移到Cedar堆栈,但本文将概述手动迁移所需的步骤和考虑事项。

在迁移过程中,将会有两个Heroku应用分别存在于它们各自的栈中。迁移的过程包括从Bamboo栈的应用中复制数据库数据和Heroku配置到Cedar栈的应用,并切换路由至Cedar栈的应用。

留意

大规模变更,比如堆栈迁移,必须先在临时的Staging环境中进行。因此,强烈建议创建一个临时的Heroku应用程序,用于进行迁移过程和新环境的测试。这样可以在不影响生产环境的情况下,进行必要的更改以在新堆栈上运行。一旦您的代码运行正常,您可以将所需的更改推送到生产环境并执行迁移。

创建Git的主题分支

在移植至Cedar Stack时所做的更改应被分离并保存在Cedar话题分支中,以便进行适当的管理。

$ git checkout -b cedar
Switched to a new branch 'cedar'

确保与Ruby 1.9.2的兼容性。

在Cedar堆栈中,我们使用Ruby 1.9.2,但是在Bamboo堆栈中,我们可以使用1.8.7、1.9.1和1.9.2版本。在将生产环境升级到Cedar堆栈之前,请确保它在Ruby 1.9.2上正常运行。请解决由于Ruby版本更改导致的语法变化以及在1.9.2上的编码问题。

如果应用程序在bamboo-mri-1.9.2上无法工作,首先需要迁移到这个堆栈。让我们将Bamboo堆栈保持不变,迁移到Ruby1.9.2。

$ heroku stack:migrate bamboo-mri-1.9.2
-----> Preparing to migrate bamboo-app
       bamboo-ree-1.8.7 -> bamboo-mri-1.9.2
...
-----> Migration prepared.
   Run 'git push heroku master' to execute migration.

$ git push heroku master
...
-----> Heroku receiving push
-----> Migrating from bamboo-ree-1.8.7 to bamboo-mri-1.9.2
...
-----> Migration complete, your app is now running on bamboo-mri-1.9.2

让我们测试一个完全在Ruby 1.9.2上运行的应用程序吧。

指定依赖关系

选择应用服务器

在 Bamboo Stack 中,所有应用程序都是以 Thin 方式运行的。我们仍然推荐使用此应用服务器,但不会强制进行设置。请设置应用服务器。如果使用 Thin,请在 Gemfile 中添加以下行:

gem 'thin'

翻译说明

稍后会讲到,为了使用Thin作为应用程序服务器,还需要设置Procfile。

Postgres:中国的关系数据库管理系统

Cedar堆栈不会自动设置pg Gem,因此需要在Gemfile中手动配置使用Postgres的应用程序。

gem 'pg'

数据库设置信息(Credential)将在编译Slug时自动配置。将会自动在config/database.yml中设置DATABASE_URL。

新的遗产

Bamboo堆栈在New Relic插件的帮助下自动创建了config/newrelic.yml文件,但Cedar堆栈不会创建该文件。

如果您正在使用Bamboo堆栈,并且希望使用New Relic,则需要手动将newrelic_rpm Gem添加到Gemfile中。

gem 'newrelic_rpm'

然后,我们将从New Relic的模板中创建config/newrelic.yml文件。

$ curl https://raw.github.com/gist/2253296/newrelic.yml > config/newrelic.yml

发信格里德

在Cedar堆栈上,Sendgrid附加组件的设置将不再自动配置。如果Rails应用程序已经配置为使用Sendgrid进行邮件传送,则需要在 config/initializers/mail.rb 中设置以下邮件初始化设置。

$ curl https://raw.github.com/gist/1690653/mail.rb > config/initializers/mail.rb

HTTP缓存插件

caches_page_via_http插件将自动安装在Bamboo堆栈上,以提供对Varnish的透明缓存支持。由于Varnish不是Cedar堆栈的默认选项,所以该插件将不再自动注入。

大多数的Cedar应用程序不需要这个插件,但如果需要的话,可以手动安装。

$ script/plugin install https://github.com/pedro/caches_page_via_http.git

承诺依赖

为了将代码部署到Cedar堆栈,将在这一点之前所做的更改提交到Gem依赖关系中,包括依赖关系的变化。

运行Bundler以安装新的Gem。

$ bundle install
Fetching source index for http://rubygems.org/
Using rake (0.8.7) 
...

将新文件添加到Git的暂存区。

$ git add config/newrelic.yml

提交更改(当前分支是 ceadr 主题分支)。

$ git commit -a -m "Modified application dependencies for Heroku/Cedar compatability"

创建Procfile

Procfile是在Heroku应用程序上定义应运行哪些进程的文件,它是在Cedar栈上进行新设置的。

没有使用Bamboo堆栈的后台工作进程的应用程序将使用单个Web进程类型,在应用程序根目录下创建一个新的Procfile。

web: bundle exec thin start -p $PORT -e $RACK_ENV

如果使用背景工作进程,请将工作进程设置为“Procfile”。

web: bundle exec thin start -p $PORT -e $RACK_ENV
worker: bundle exec rake jobs:work

对于非Web进程,可以为其附加自定义标签。

Procfile不是Heroku特有的清单。在本地开发过程中,也可以使用Foreman Gem来调整应用程序的进程组织。

$ gem install foreman
Fetching: foreman-0.38.0.gem (100%)
Successfully installed foreman-0.38.0

在项目目录的.env文件中设置环境变量会使得在Foreman中执行时包含运行时的环境变量。让我们尝试将RACK_ENV设置为development。为了仅在本地使用,我们不会提交.env文件(将其包含在.gitignore中)。

$ echo "RACK_ENV=development" >>.env

您可以使用.env中设置的环境变量、Procfile中的进程设置,并利用Foreman来在本地运行应用程序。

$ foreman start
10:01:59 web.1      | started with pid 3484
10:01:59 worker.1   | started with pid 3485

当应用在本地通过 Foreman 运行成功后,将 Procfile 提交到当前主题分支中。

$ git add Procfile
$ git commit -a -m "Added Procfile to define app's process-formation on Heroku/Cedar"

创建Cedar应用

由于不存在自动从Bamboo迁移到Cedar的方法,新的应用程序必须在Cedar堆栈上创建。如果将远程Git存储库命名为heroku-cedar,则可以更容易地区分应用程序是基于Bamboo版本还是基于Cedar版本。

$ heroku create --remote heroku-cedar cedar-app
Creating cedar-app... done, stack is cedar
http://cedar-app.herokuapp.com/ | git@heroku.com:cedar-app.git
Git remote heroku-cedar added

部署

尽管将更新后的代码基础部署到Cedar应用程序中,但不会影响当前在Bamboo上运行的应用程序。您只需将应用程序暂时放入到测试阶段,以进行功能验证。

从cedar主题分支中,将Cedar兼容的源代码推送到heroku-cedar远程存储库的master分支上进行部署。

$ git push heroku-cedar cedar:master
Counting objects: 67, done.
...
-----> Heroku receiving push
-----> Rails app detected
...

重新配置插件

目前不支持将插件从一个应用程序移动到另一个应用程序的方式。所有插件都必须手动从Bamboo应用程序配置到Cedar应用程序。

将目前分配给Bamboo应用程序的所有附加组件列表保存到addons.txt文件中。

$ heroku addons --app bamboo-app > addons.txt
$ more addons.txt
memcache:5mb
newrelic:standard
pgbackups:auto-month
shared-database:5mb
heroku-postgres:ronin

由于具有Heroku上的Postgres数据库(heroku-postgresql:XXX)的应用程序不应该通过这种方式重新创建附加数据库,因此将其从addons.txt中删除。

$ more addons.txt
memcache:5mb
newrelic:standard
pgbackups:auto-month
shared-database:5mb

使用xargs工具在Cedar应用程序中配置插件。

$ cat addons.txt | tr '\n' '\0' | xargs heroku addons:add --app cedar-app
-----> Adding memcache:5mb to cedar-app
...

请注意,根据Bamboo应用程序中的附加组件等级,可能会意外产生不必要的费用。

复制设定变量

由于应用程序中设置的变量也不能自动迁移,因此需要手动复制。

从Bamboo应用程序将设定变量保存到config.txt文件中。

$ heroku config -s --app bamboo-app > config.txt
$ more config.txt 
DATABASE_URL=postgres://u:p@host/db
MEMCACHE_PASSWORD=pass
MEMCACHE_SERVERS=mcX.ec2.northscale.net
MEMCACHE_USERNAME=pp123%40heroku.com
RACK_ENV=production
PATH=vendor/bundle/ruby/1.9.1/bin:/usr/local/bin:/usr/bin:/bin
SESSION_SECRET=secret
SHARED_DATABASE_URL=postgres://u:p@host/db

只需保留手动设置的变量。请打开config.txt并删除Heroku的设置,如插件设置、MEMCACHE_、DATABASE_URL等。

如果覆写数据库配置或插件配置,可能会导致意外的影响发生。所以,如果存在这样的配置,请从config.txt文件中删除它们。

$ more config.txt
RACK_ENV=production
SESSION_SECRET=secret

我们将在Cedar应用程序中添加这些特定于应用程序的设置。

$ cat config.txt | tr '\n' ' ' | xargs heroku config:add --app cedar-app 
Adding config vars and restarting app... done, v32
  RACK_ENV            => production
  SESSION_SECRET      => secret

如果发生不好的事情,您可以使用 heroku release:rollback 命令快速恢复到之前的状态。

为Cedar应用注入活力。

在这个阶段,应该有一个在Cedar中运行的应用程序副本,与Bamboo应用程序具有相同的配置。 在迁移的最后一步中,将数据从Bamboo应用程序传输到Cedar应用程序,并激活Cedar应用程序,以接收实时流量。

为了确保数据的一致性,防止在传输过程中对数据进行任何更改,将两个应用程序都置于维护模式。

$ heroku maintenance:on --app bamboo-app
Maintenance mode enabled.
$ heroku maintenance:on --app cedar-app
Maintenance mode enabled.

Postgres即关系型数据库管理系统。

在使用Heroku的Postgres数据库计划的应用程序中,为了实现最小的停机时间,应使用”快速数据库切换策略”。这些步骤是针对使用存储在共享数据库中的数据的应用程序设计的。

请帮我把下面的句子翻译成中文,只需要一个选项:

Heroku PG Backups插件可以实现应用程序之间的快速数据迁移(有关详细信息,请参阅此处)。请向每个应用程序添加此插件(可免费使用)。

$ heroku addons:add pgbackups --app bamboo-app
Adding pgbackups to bamboo-app... done
$ heroku addons:add pgbackups --app cedar-app
Adding pgbackups to cedar-app... done

备份Bamboo应用程序的数据。

$ heroku pgbackups:capture --app bamboo-app
SHARED_DATABASE (DATABASE_URL)  ----backup--->  b040
Capturing... done
Storing... done

将备份导入新的Cedar应用程序。

$ heroku pgbackups:restore DATABASE `heroku pgbackups:url --app bamboo-app` --app cedar-app
SHARED_DATABASE (DATABASE_URL)  <---restore---  b040.dump
...
Retrieving... done
Restoring... done

如果使用MongoDB,Xeround等数据库插件的话

请看每个附加组件的文档!

自定义域名

通过定制域名路由的流量仍然指向Bamboo应用程序。如果启用了自定义域名,则需要在添加到Cedar应用程序之前从Bamboo应用程序中删除。

使用Bamboo应用程序获取自定义域名列表并保存到domains.txt文件中,然后删除自定义域名。

$ heroku domains --app bamboo-app | grep -v "Domain names" > domains.txt
$ more domains.txt
secure.mydomain.com
www.mydomain.com
$ heroku domains:clear --app bamboo-app
Removed all domain names for bamboo-app

我要为Cedar应用程序添加自定义域名。

$ cat domains.txt | xargs heroku domains:add --app cedar-app

SSL是一种用于加密和保护信息传输的安全协议。

与自定义域名一样,SSL支持需要从Bamboo应用程序转移到Cedar应用程序,需要更新应用程序的DNS设置。由于Bamboo堆栈提供了各种SSL产品,请参阅各自的文档以获取更多详细信息。

解除维护模式

解锁Cedar应用的维护模式,以接受访问。同时,将dyno数量调整为适当的数量(最好与Bamboo应用程序相匹配)。

$ heroku dynos --app bamboo-app
bamboo-app is running 5 dynos and 2 workers
$ heroku ps:scale web=5 worker=2 --app cedar-app
Scaling web processes... done, now running 5
Scaling worker processes... done, now running 2
$ heroku maintenance:off --app cedar-app
Maintenance mode disabled.

翻译说明

请各自调整规模数!如果按照当前方式执行,总共会运行7个dyno!

最后

当Cedar应用程序运行并且没有明显的问题时,我们应该将cedar分支合并到master分支。

$ git checkout master
$ git merge cedar

让我们将Bamboo应用程序退役以降低成本。将其缩减至1个动力槽,并将附加组件从付费切换至免费。如果在并行运行期间出现问题,我们也可以将Bamboo应用程序回滚。

免责声明

即使根据这个翻译参考进行操作,如果发生任何损害,我们不能承担责任,请自行判断使用。

bannerAds