Heroku Advent Calendar 2014の18日目の記事です。
この記事では、herokuでRailsアプリを運用していくにあたってのノウハウや便利なGem等を紹介します。
herokuでのサイト表示の高速化(配信データのdeflate圧縮)
herokuで運用するアプリはWebサーバをチューニングしてページ読み込み負荷を減らすという最適化がなかなか難しいですが、heroku上のRailsアプリであればheroku_rails_deflateというgemを使うことで、Rack::deflaterによるファイルのdeflate圧縮配信をheroku上で実現できます。
gemの組み込みと多少のasset設定(environments/production.rb)をすることで、予め圧縮済みのファイルを配信できるためCPU使用率にも優しいです。
また、アプリの性能測定には以下のGTmetrixがお勧めです。GTmetrixのサイトにアクセスし、計測対象サイトのURLを入力すればさまざまな指標についてサイト読み込み速度を確認できます。
DBの選択について(PostgreSQL or MySQL)
Herokuは標準のDBとしてpostgresをサポートしており、また、ClearDBアドオンを利用することでMySQLも利用可能です。DBの通信遅延や信頼性の面でも両DBの違いがあるようですが、ここでは保存レコード数(容量)の観点について述べます。
Heroku Postgresはレコード数1万件まで無料で利用できます。
ClearDBについてはレコード数の制限は無く利用容量5MBまで無料で利用できます。
自前でDBを用意するということもできますが、上記どちらかのDBを使うか悩んだ場合はアプリのDB利用特性で決めるとよいと思います。
けち臭い話ですが、記録できるレコード数の観点では、DBの1レコードが平均524バイトを超える場合(1万レコードの時点で利用容量5MBを超える)は、Heroku Postgresを使い、細かなレコードが大量にあるという場合にはClearDBを使う方が良さそうです。
Heroku PostgresからClearDBへの移行
herokuでアプリを作成すると初期状態ではHeroku Postgresが採用されるため、後からClearDBを利用したいとなった場合にDBのデータ移行が大変です(私のことですが)
上記ブログ記事を参考にHeroku PostgresからClearDBへのDBデータ移行を実施しましのたで簡単に紹介しておきます。
おおまかに手順をまとめると、Heroku PostgresからエクスポートしたDBデータをローカルに構築したPostgreSQL環境に一旦インポートしてエクスポート。
このエクスポートしたデータを変換ツールによりMySQL形式にした後にClearDBへインポートするという手順になります。
(herokuからエクスポートしたデータ形式では変換ツールにかけられず、わざわざローカルのPostgreSQL環境に一度インポートする手順になっています。きっともっと良い手順があると思いますが、参考になればと思い紹介します)
事前準備
- ローカル環境にPostgreSQLをインストール(brew install postgresql等)
- ローカルのPostgreSQL環境にherokuアプリからエクスポートしたDBデータのインポート用DBを作成しておく
- herokuアプリにClearDBアドオンを導入
- DBデータ変換ツールpg2mysql_cliを用意(※)
- pgbackupsの導入
- RailsアプリにMySQLのgemを導入
(gem mysql2したGemfileを含むリポジトリをherokuにプッシュしておく)
移行概要
具体的なコマンド等は上記リンク先の解説記事も合わせて御覧ください。
- herokuアプリをメンテナンスモードにする(heroku maintenance:on)
- Heroku PostgresのDBデータをエクスポート
- DATABASE_URL環境変数をClearDB用に変更(heroku config:setにて)
- Heroku PostgresからエクスポートしたファイルをローカルのPostgreSQLへインポート
- ローカルのPostgreSQLからデータをエクスポート
- エクスポートしたデータをPostgreSQL形式からMySQL形式へ変換(pg2mysql_cli.phpを利用)
- herokuのClearDB環境にアプリのスキーマを設定する(heroku run rake db:migrateを実行)
- herokuのClearDB環境のホスト名、ID、パスをメモ(heroku confingコマンドにて取得)
- ローカルからmysqlコマンドにてClearDB環境へ接続しデータインポートのためテーブルのカラム削除
(この時点ではアプリからデータ保存していないためrailsのmigration用スキーマだけ削除すればよいので、truncate table schema_migrations を実行) - ClearDB環境へログインし変換したデータをインポート
- herokuアプリのメンテナンスモードを解除(heroku maintenance:off)
※:pg2mysql_cli(PostgreSQL形式からMySQL形式へ変換するphp製ツール)が最近のバージョンのphpでは互換性の問題で動作しないため、
コードを修正するか古いphp実行環境が必要になります。(自分の環境の場合はphpが古かったため実行できました)
herokuのアプリ通信遅延について
ご存知のとおりherokuにデプロイしたアプリはUS-EASTリージョンやEUリージョンとなり、日本のリージョンはありません。
そのため、日本からのアクセスに対しては結構な通信遅延があります。
東京にあるVPSに構築したテスト環境とheroku上のアプリの通信遅延を比較すると遅延が約10倍違うこともあります。
以前から、herokuに東京リージョンがあればなあと思っていますが、change.orgにてherokuの東京リージョン対応の署名活動が行われていますので紹介します。
追記:Heroku Advent Calendar 2014の15日目の記事末尾に発起人のshu_0115さん自身による紹介もありました。Heroku便利機能まとめ(アドオン含む)
herokuのアプリを紹介する
せっかくアプリやサービスを作ったのであれば多くの人に使ってもらいたいですよね。
herokuで運用しているサービスならではの紹介方法として、we love herokuというherokuで運用しているサービスを登録できるギャラリーがあります。herokuで何か作ったらこのギャラリーに登録してみてはどうでしょうか。自分も登録してみました。
眺めていると色々なアプリやサービスがあって楽しいです。
おわりに
今回の記事は東京メトロのオープンデータ活用コンテスト応募用に作成したWebアプリをherokuで運用するにあたってのノウハウをまとめたものです。
作成したアプリはモバイル端末等の位置情報をもとに東京メトロ各駅(全143駅)への訪問を記録するめとろべあというスタンプラリーアプリです。東京メトロを利用されている方は暇だったらぜひ使ってみてください。すてきなクマのイラストは友人に書いてもらっています。
アプリのソースコードはGitHubで公開しています。
東京メトロのオープンデータ活用コンテストの応募アプリ一覧はここで確認できます。どれも便利だったり面白かったりと素晴らしいアプリです。
明日のHeroku Advent Calendarは@hkusuさんのHerokuとNode.js(Express)でTwitterボットを作るです。