Sass
Heroku
PostgreSQL
Salesforce
HerokuDay 21

Heroku Postgres に限界はあるのか?!

はじめに

この記事は、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では無いですが・・・