Heroku Postgresのロールバック

この記事はHeroku Advent Calendar 2014の2日目です。



先ごろCodeZineにHeroku Postgresの記事を書いたんですが、そこでさらっと触れたHeroku PostgresのRollback機能について、実際の使い方を紹介したいと思います。



ほとんどの場合Rollbackの必要に迫られる場面は突発的に訪れ、かつ時間の制約も厳しかったりするんですが、これさえあれば安心です!(多分)


★ Heroku PostgresのRollbackとは

Databaseを扱ったことのある技術者でRollbackという用語を知らない人はいないと思いますが、ここでいうRollbackは世間一般に浸透しているトランザクション制御のためのRollbackのことではありません。

名前が紛らわしいので正直、名前変えたほうが良いんじゃないかと思ったりもしますが。。。(^^;;;
自分の言葉で説明するならば、これは

時間を指定してその時点のスナップショットから新しいDBを作成する機能

です。
Forkを使ったことある人ならForkで時間指定ができるようになっただけ、と捉えても良いです。(ちなみにForkというのは既存DBのスキーマやデータをコピーして新しいDBを作成する機能です。)

Rollbackが使用できるのはStandard-0以上のプランによって指定できる時間の制限が異なります。

  • Standard-X. 現在時刻から1時間前まで
  • Premium-X. 現在時刻から7日前まで


ちなみに指定できる時間は分単位までで、秒単位での指定はできません。


★ コマンド

実際にRollbackデータベースを作成するためのコマンドは以下

 

heroku addons:add heroku-postgresql:standard-0 --rollback green --to '2014-12-02 12:00+00:00'

 



見ての通り、通常のAddon追加のコマンドにロールバックに必要なパラメータを追加しているだけです。

「--rollback」にはロールバックの対象となるDBの色名の部分のみを指定します。
「--to」にはロールバックする時間をタイムゾーンつきで指定します。

ちなみに「--to」の代わりに、「--by 3 days 7 hours 22 minutes」のように何時間何分前に戻る!という指定の方法もあるんですが、時間を計算したりコマンドを叩いたりしているうちに時間が経過したらローブバックする時間もずれるので、はっきり言ってこのオプションの存在意義がわかりませぬ。。。(--

コマンドの実行にはそれなりに時間がかかります。試したところそれほど多くのデータの入っていないDBを数分過去の状態に戻すだけでも10分程度かかりました。

元々PostgresのAddon追加自体が数分を要しますし、データ量や巻き戻す時間によっても所要時間は変わってくると思います。
なので、コマンド実行後はpg:waitでDBの作成完了を待ったほうが良いです。

ロールバックDBの作成が完了したら、DBを置き換えて元のDBを削除します。
全体としてのコマンドシーケンスは以下のような感じです。(元のDBがgreen、作成したロールバックDBがblueの場合)

 

heroku addons:add heroku-postgresql:standard-0 --rollback green --to '2014-12-02 12:00+00:00'
heroku pg:wait
heroku pg:promote blue
heroku addons:remove HEROKU_POSTGRESQL_GREEN

 




★ バックアップは計画的に

以上が、ロールバックの使い方でしたが意外と簡単だったかと思います。そして非常に強力です。

ただ、個人的には障害時の対応をこれだけに頼り切るのは危険だとも思っています。
もちろん、選択肢のひとつとしてはあっても良いんですが実際に使うかどうかはケースバイケースのような気がしています。どの時間まで戻すのが適切なのかわからないこともあるだろうし、このようなめったに使われることのない機能にはバグや想定外の何かがあってもおかしくないですしね。

pgbackupsを入れるのは当然として、障害対応はある程度あらかじめシュミレーションしておくことが重要です。


★おまけ。Heroku Postgresの識別名

Heroku Postgresを追加するとご存知の通りconfigには「HEROKU_POSTGRESQL_<色名>_URL」という環境変数が設定されるわけですが、いざこれをコマンドで指定しようとすると以下のようないくつかのパターンがあります。

  • HEROKU_POSTGRESQL_BLUE (「_URL」がない)
  • blue (「HEROKU_POSTGRESQL_」も省略されている。ついでにCaseInsensitive)


つねづねかねがね「何だ?この一貫性の無さは。。。」と思ってたんですが、今回一連の操作を試していてなんとなく枠組みが見えてきました。
おそらく、

・HEROKU_POSTGRESQL_<色名>
Addon名。Heroku Postgresは1アプリケーションに複数追加できるのでそれを識別するための名前。
Addonを操作するコマンドではこちらを使用する

・<色名>
pg:xxxxコマンドなど、文脈からHeroku Postgresを指定することがわかる箇所では色名のみの省略記法が使用できる


ということなんではないかなぁと。(^^;(全部を確認したわけではないですが)

Addonの中でHeroku Postgresのみが同一Addonを複数追加できることにも違和感があったんですが、もしかしたらサードパーティ製のAddonでも複数追加できるものを作れるのかもしれません。

□□□□

明日は@anoworlさんによる画像アップロードの話です。
あとはがんばってください。(^^)/



コメント(0)