はじめに
この記事は、Heroku に関するアドベントカレンダー 2017 の21日目になります。
Herokuで本番運用の実績
さて、昨日に引き続きではないのですが・・・インスパイアを受けHeroku で本番運用ってどうなのよというお話をします。
とある、私が関わったシステムではHerokuでマルチテナント型の企業向けSaasサービスを5年ほど運用しています。
5年もやっていれば、さすがにHeroku起因の障害があると思いきや、ほとんど経験はありませんでした。
Add-onではまあまあ、あります。 SendGrid とかあとは、SendGrid とか SendGrid とか・・・
様々な経験があるのですが、今回は「Heroku Postgres」にフォーカスしたいと思います。
Heroku Postgres の使い方
わたしのところでは、各テーブルに tenant_id カラムを準備してテナント毎のデータを管理しています。
5年運用していると一番データ量の多いテーブルだと数千万行のテーブルなどもありますが、OLTPにおいては
Heroku Postgres に課金しまくることで時間のかかるアーキテクチャの変更などはせずに運用できています。
数千万行に耐えうるということは、ほとんどの場合においてHeroku と Heroku PostgresでWEBアプリケーションは
完結するということになります。ただし・・・ 「OLTP」においてはです。
OLAPに限界がある
WEBからの入力を処理する分には、十分なパフォーマンスをだしてくれるものの、B2Bサービスのためまあまあ一括処理があります。CSVによる一括登録やメール送信、集計処理やレポーティングなどです。
Paasを利用した、マルチテナント型のSaasにおいてOLAPはまことにやっかいな問題です。特に、
- Herokuさんは我慢強くない(30秒ルール)
- Herokuさんは飽きっぽい(24時間に1回再起動)
- Herokuさんは懐が深くない(Dynoのメモリが×2で1G)
ため、自分でどうにかする必要があります。
ソリューションとしては3つ
Heroku 推奨のものと、私たちが考えているものを2つ
プログラムでなんとかする(Heroku 推奨)
アーキテクチャを見直したり、Octopus,switch_pointなどDB分割系のGemを利用もしくは自作して、Heroku Postgres のfollower 等の機能を利用しDB負荷を分散する。
pgpool-2を利用する
これがわたしが考える最強の・・・、ではないのですがデータベースの移行を行わず、プログラムの変更を行わずにRead処理を並行に速度向上させることができます。
Citus Cloudを利用する
基本的に、tenant_id を超えてデータを読み出すことは無いためCitus Data を利用することで快適なクエリとなるはずです。
それに、なんと Heroku の add-onです。
各ソリューションのメリット・デメリット
ソリューション | メリット | デメリット |
---|---|---|
プログラムでなんとかする | サーバーコストが安い | エンジニアリソースがかかる |
pgpool-2を利用する | サーバーコストが比較的安い | pgpool-2サーバーの運用が必要 |
Citus Cloudを利用する | コスト高い、実績が少ない | 早い、楽ちん |
まとめ
大規模なHeroku アプリケーションのOLAP処理で速度をだすための方法をいくつか考えたわけですが、Heroku Postgresに限界はあるのか? の答えは、普通のRDBと一緒ですよということです。マルチテナントなアプリケーションでなければ、Citus のメリットは活かせないですし、読み込み処理ではなく書き込みが多いアプリケーションであれば、上記で考えたような解決策は難しいのです。Heroku を選択したがために何か失敗するわけではないです。
ここで、私の好きな記事と言葉を紹介します。
「C#、Java、PHP、Pythonの中のどれを選んだらいいのだろう? 本当にある違いというのは、あなたがより良く知っているのがどれかということだ。Javaでいくつもの大きなシステム構築に成功しているJavaのグルがあなたのチームにいるのなら、C#よりもJavaで成功する可能性がずっと高いが、それはJavaがより優れた言語だからではなく(Javaの方が劣るが、その違いは問題になるほど大きなものではない)、彼がより詳しいからなのだ。」 by Joel Spolsky
「Heroku のことをよく知ってい人と一緒にやるならHerokuを使えばいいし、AWSのプロがいるならAWSを使えばいい、それだけだ」by niseiss
#番外編 Amazon Aurora with PostgreSQL Compatibilityに移行する
Auroraは、read replica を最大15まで増やすことができますし、IOに課金することで速度を増加させることができます。もはやHerokuでは無いですが・・・