低コストなデータストアと運用についての調査
この Scrap について
この Scrap は、
と言う Scrap で個人的に他の方の意見を聴いてみたいと言っていた、
$10/mo 前後の維持費で維持できる永続化データストアは何が良いのか?
と言う事柄について、自分なりに情報収集してみることを目的に作られました。
収集したい情報について
収集したい情報としては、Web サービスを開発・維持するにあたって利用するデータストア(SQL 系や KVS、Document Store などを含む)の選択肢として、下記の条件を満すデータストアには何があるか、と言った辺りです:
- 月額の維持費が $10 or 1,000円前後であること
- マネージド、もしくは自己管理・維持が容易であること
情報の追加はどなたでも OK です
以上がこの Scrap の前提となる事柄ですが、この情報収集では広く選択肢を知りたい、と言う事を目的としているので、情報をお持ちの方は、どなたの投稿でも OK です。
マネージドデータストアの選択肢
AWS DynamoDB
概要
- Amazon Web Services の Managed NoSQL Database
- 基本的には範囲(Range)が部分的に取れる KVS と言うイメージ
- 上手いことデータベース設計すると無限にスケールする
利点
- 小規模で使うにはそこそこの無料枠がある
- 上手くスキーマ設計すると無限にスケールする上、金の弾丸が後で使える
- AWS なのである程度は知見が共有されている
難点
- スキーマ設計がけっこう難しい
- スキーマ設計を誤ると容易にクラウド破産する
- 範囲が取れると言っても基本的には KVS なのでそこを考慮する必要がある
Google Cloud Firestore
概要
- Google Firebase の要件に合わせてカスタムされた Cloud Datastore
- 基本的には Google 製の Document Store 系の Database と言うイメージ
- 大本が Google Cloud Datastore であるため若干クセがある
利点
- 小規模で使うには十分っぽい無料枠がある
- Firebase Functions などの Integration で色々できる
- Web Browser などのクラインアトから直接データベースの API を叩ける
難点
- ACL の設計に失敗した状態でクライアントから API を直接叩かれると死
- Google Cloud Datastore と利用が排他で Cloud Datastore と同時利用できない
- 考えなしに情報をブチ込むとあとで破滅する(とは言えこれは他の DB でも一緒)
MongoDB Atlas
概要
- MongoDB の開発元が提供する DBaaS
- Shared Clusters や Dedicated Clusters 、On-Premises を選択できる
- 個人開発の範囲ではわりとそこそこの価格で利用できる
利点
- 中身は MongoDB そのものなんでベンダーロックインの心配がない
- MongoDB 自体はそこそこ以前から存在するのである程度の知見はネットから拾える
- 共有クラスタの M2 Plan が $9/mo で利用できる。なお Storage は 2 GB まで
難点
- SQL 系データベースではなく Document Store 系の NoSQL なので正規化はしてはならない
- MongoDB の 公式ドライバの提供は最近のメジャーな言語に限られている(Perl の 公式が EOL)
- MongoDB Atlas の提供が近年からなので MongoDB Atlas でのサービス運営の知見が少ない
Google Cloud SQL
概要
- Google Cloud Platform で提供される Managed SQL as a Service
- Google Cloud Platform がメインなら割と楽に使える
- リージョンによって $10/mo 以下で使えるインスタンスの料金が上がったり下がったりする
利点
- MySQL の db-f1-micro インスタンスが $8/mo 前後で利用できる(ただしリージョンによる)
- MySQL のインスタンスは普通の MySQL っぽいので MySQL の知見がそのまま使える
- 他の Google Cloud Platform 上のサービスからの利用も容易なのでその点も利点
難点
- $10/mo 縛りだと MySQL の db-f1-micro インスタンスの最小構成しか選択肢が無い
- $10/mo 縛りではバックアップや HA は当然できないので、その辺りは調整するしかない
- なおログを取ってないと DB 周りでサーバサイドで詰まったりすると死ぬ(私はやった)
Heroku Postres
概要
- PaaS の老舗である Heroku が提供する DBaaS
- $9/mo で 10M Record まで使えるプランがある
- Heroku だけでサービス運営を完結させる場合には支払いがまとまって便利
利点
- Heroku Postgres 自体けっこう昔からあるのである程度は安心して使える
- Heroku 内だけでサービス運営を完結させると管理が楽
- Heroku Postgres は普通の Postgres っぽいので Postgres の知見がそのまま使える
難点
- Heroku の PaaS 以外から扱う場合にはリージョン間のレイテンシを考慮する必要がある
- また Heroku 以外から使う場合には Deploy などが煩雑になる場合もあり得る
- $9/mo で使えるプランだと 10M レコードまでしかデータを挿入できない
Render の Postgres
概要
- 新興の PasS である Render の Full-Managed Postgres
- $7 で shared cpu + 256 MB memory + 1GB SSD の Postgres が使える
- また 90 days の Free Trial な感じの Free Plan も存在する
利点
- Render が Dockerfile が使える PaaS であるため実装言語を問わず Postgres が使える
- また Postgres の Listen Port へ外部からも接続できる
- また Postgres への接続元 IP を制限できたりもする
難点
- Render 自体が新興の PaaS であるため情報量が少ない(特に日本語)
- Postgres を外部に露出させる場合 IP 制限を掛けないとアタックされそう
- Render の他のサービスと組合わせて使うと軽く 14 USD 以上は行く
fly.io の Postgres
概要
- 新興の PaaS である fly.io が提供する Full-Managed Postgres
- fly.io 全体が cli ポチポチであるため、コマンド一発で Postgres を立てられる
- また Postgres の無料枠が存在し小規模なインスタンスなら無料で使える
利点
- Postgres も含めて従量課金であるため小規模なサービスなら安く済ませられる
- また複数 Region もサポートしているため Region 障害にも(たぶん)強い
- あと Postgres の scaling がコマンド一発で出来る
難点
- 従量課金の利点の反面としてクラウド破産のリスクが当然の様にある
- fly.io が新興の PaaS であるため fly.io 自体の情報が少ない
- また Postgres のインスタンスに直付けで外部アクセスは出来ない
GCPでMySQLやPostgreSQLを使う場合CloudSQLがいちばんの選択肢に上がってくると思います。CloudSQLだとリージョンを東京にすると一番低スペックなマシンタイプを選んでも月$50以上かかってしまったりします。
ただ、リージョンをアイオワあたりにするとさらに下のスペックが選べるようになり、ある程度はコストを抑えられます。もちろんレイテンシや安定性などの問題などは大きいので使えるシーンは限られていますが…
あと以前誰かからMongoDB AtlasがFirestoreよりできることが多くておすすめという話を聞きました。自分では使ったことがないので詳しくは分からないのですが、無料枠もありコスパが良いみたいです。
(詳しい話ができずすみません)
お、返信ありがとうございます。いつも Zenn.dev は応援しています :-)
GCPでMySQLやPostgreSQLを使う場合CloudSQLがいちばんの選択肢に上がってくると思います。
今し方調べてみたんですが、私の理解が間違ってなければ Google Colud SQL だと MySQL の最小インスタンス(db-f1-micro)がギリギリで $10/mo 以内で、それ以外の Postgres だと $50/mo ぐらい、SQL Server だと $80/mo 前後がスタートっぽい感じでした。
あと Postgres の DBaaS だと Heroku が提供してたよな……? と思い出したんで調べ直してみたところ、今は Heroku Postgres の Hobby Basic が $9/mo で 10M Record までの上限で提供されている様です。
以前誰かからMongoDB AtlasがFirestoreよりできることが多くておすすめという話を聞きました
私の知っている範囲だと @mizchi さんが似た様な事を Twitter でつぶやいてた様な気がします。詳しい内容と時期はちょっと覚えてないですけども。
あと MongoDB Atlas の Pricing もキチンと調べてみたんですが、Shared Cluster の M2 Plan が $9/mo で利用可能みたいですね。だた Pricing が表示される位置が Shared Cluster の Dropdown を開いて View Pricing をクリックすると出てくる Modal Dialog に表示されたので、その辺りなんでそんな奥まったところにあるのーと言う感じではありましたが……。
差し当たって catnose さんのコメントを切っ掛けに調べてみた範囲では、以上の様な料金でサービスが提供されてるみたいなんで、その辺り追記したいと思います。ありがとうございました。
おぉ…調べていただきありがとうございます。Potgres使うならやはりHerokuはいいですね。MongoDB Altasほんとですね…見つけづらい。勉強になりました、ありがとうございます🙏
VPS などで自己運用・管理するデータストアの選択肢
SQLite
概要
- ファイルベースの SQL データベース
- 小規模なデータベースとしてもスマホ内でのデータベースとしても利用されている
- ライセンスが public domain 。なのでどんな場合でも使える
利点
- データベースがローカルなファイルシステムで完結する
- バックアップがキチンと出来ればデータベースファイルの取り扱いが楽
- 昔から存在するので色々な言語で利用できる
難点
- 当たり前だがローカルファイルで完結しているので SQLite 自体ではスケースアウト出来ない
- データベースが特定インタンスでしか存在できないバックアップをしくじると死
- あと File I/O が詰まったりすると性能が劣化する
RQLite
概要
- Golang で実装された SQLite に HTTP API を生やして Raft で分散合意できる様にしたデータベース
- P2P を利用する分散 DB なので書き込みノードと読み込みノードを分けたりも出来る
- とは言え新興の SQL 系 Database なのでクライアント実装が少ない
利点
- 部分的な制約があるにしろ SQLite の SQL 文がほぼそのまま使える
- Raft による分散合意を行なっているので、マルチマスターなクラスタ構築などが容易
- あと HTTP API が生えているので curl などで API を容易に叩ける
難点
- いわゆる P2P 系データベースなのでクラスタの Bootstrap がちょっと面倒
- ノード数が奇数でなくなるとネットワーク分断などで Raft による分散合意がトラブる
- あと HTTP API は剥き身なので認証機構とかは別に構築する必要がある
MySQL / MarriaDB / Postgres
- FIXME: 私は詳しくないので誰が詳しい人の情報待ち
データストアのバックアップについて
マネージドデータストアの場合
- ベンダーロックインされている場合には書き込みログを CRDT な形式でログ取るしか無いのでは説
- データストアの dump が出来る場合にはバッチで定期的に dump を取ってバックアップする
- ベンダーロックインされておりバックアップが容易ではない時には障害が起きない様に祈る
セルフマネージドの場合
- データロストを防ぐためにバックアップは最初からキチンと取る
- また読み書きの性能を落したく無い場合には読み込み専用のバックアップインスタンスを立てる
- どちらにせよ障害が起きた時のためにバックアップはちゃんと取るしかない
データストアのバックアップ手段や利用できるソフトウェアについて
SQLite / RQLite
概要
- SQLite 系データベースを無停止でバックアップ・リストアできるツール
- AWS S3 や Google Cloud Storage などの Object Storage に対応している(追記:2022-02-09)
- Open Source だが Open Contribution ではない。なお要望の提起は Github Issue でできる
利点
- SQLite 系データベースを無停止でバックアップできる
- データベースのバックアップやリストアがワンコマンドで手軽に出来る
- データベースのバックアップはリアルタイムで継続して出来るっぽい
難点
- 基本 pull-req 不許可なので独自に機能を追加したい場合には fork して patch を当てるしかない
- 2021-03-03の実装ではデータベースのリストアは tmpfs に書き出して rename してるだけっぽい
- データベースのバックアップはリアルタイムで出来てもリストアはリアルタイムではない