13
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

HerokuAdvent Calendar 2017

Day 21

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

Posted at

はじめに

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

13
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?