💸

個人開発者(Rails)が安くDBを使うにはTiDB serverlessがアリな気がする

2023/09/25に公開

どうもこんにちは、ちょっと前にこんな記事がバズったのを覚えている人も多いと思います
https://laiso.hatenablog.com/entry/nope-sql

もちろん1つのVPSの中にMySQLとNginxとRedisとRailsを突っ込んで動かせば月1000円で夢の全載せサーバーになるのですが管理がめんどくさいですし、AppサーバーとRDBサーバーとキャッシュサーバーをそれぞれ分離してそれぞれを独立管理するような感じで運用したいって人が多いのではないかと思われます

そうなってくるとRDBサーバーの部分が比較的料金が高い場合が多い……と言うのが大体の趣旨でその内容については多くの人が「まあそうだよなー」と頷いたのではないでしょうか

TiDB serverless良いかも

さっそく本題ですが、そんな時に「TiDB」が採用できるかもしれません

厳密に言うとTiDBはRDBではなくNewSQLだと思うので少し違うのですが、MYSQL互換ですしちょっと癖はあるみたいですがそこまで大きく学習コストがかかるわけではなさそうです

https://speakerdeck.com/colopl/batukuendoenziniagayu-ru-da-gui-mo-mobairugemuyun-yong-niokeruji-shu-nouhauda-gong-kai-slash-2023-06-29
↑ 上記はTiDBのアイデアの元となったspannerの例ですが同じような対処は考えていく必要はありそうです

https://qiita.com/kai_kou/items/b4ac2d316920e08ac75a
↑ 余談ですがUUIDよりULID使ってみると良さそう

これをserverlessで使える環境を用意しているのが「TiDB serverless」で↓↓のページから登録 & 利用ができます

https://pingcap.co.jp/

いくら安くても自前でdeployしないといけないとか、利用がめんどくさいとかそういう話になると最初に書いた「VPS全盛り構成」に勝てないのでserverlessでサクッと使えるのは非常に魅力的ですよね

「TiDB?初めて聞いたけど信頼性あるの?」

と疑った方、僕もそう思って調べてみたのですが実はかなり多くの著名企業で使われていて今すごく注目が集まっているらしくてすごいらしいです

なんかふわっふわであれですが、使ってない技術なんてこれくらいの事しか言えないですよね。うん


↑ 公式HP( https://pingcap.co.jp/ )より

TiDBはNewSQLという点以外にも、オープンソースであるため手元にDockerとかでポンッと落として開発時に繋げたり、なんなら自分でサーバー上に設置してオンプレ管理もできるかと思います(よく使われるRDB類と同じですね)

https://github.com/pingcap/tidb

なんでTiDBに辿り着いたのかという超どうでもいい話

元々自分がDB周りを調べていた理由は「Twitterくらいの規模でも破綻しないRDBサーバー」を探していたという背景がありまして、その中で色んな会社の事例を調査していました

例えばTwitterであればApache cassandra、Instagramであればpostgresqlのシャーディングで死ぬ気で対応しているなど特色がありつつこれらは一番最初に採用してしまったから今もこの技術で頑張っている~のような側面もあるようで、じゃあ一番楽な構成はなにか?というところで「Youtubeなどでも使われているGoogleのspannerがおそらく最良だろう」という結論に至りました

※NoSQLであれば、redisやdynamoなど選択肢はまだまだありますがみんなSQL使いたいですよね!!

ただ、Googleのspannerはオープンソースではないため手元の開発環境で触るにはハードルが高く(Dockerとかでポンッと作って触る~とか出来るのかな?)最低料金でも月3万円近くかかるっぽいので流石に個人開発でさっと採用するにはハードルが非常に高い感じです

※90日間は無料で使えるプランもあるらしいです

という事で、その代替が無いかなーという視点からTiDBにたどり着きました

TiDBはGoogleのspannerに影響を受けて作られたそうで、spanner同様にダウンタイムが無くスキーマ変更及び無限スケールが出来るというNewSQL的なサムシングであり実際300万QPSくらいで動いている実例があるそうです(ちなみに本家google spannerは毎秒20億QPSという桁違いまでいけるらしいです / https://cloud.google.com/blog/ja/products/databases/choosing-cloud-spanner-for-game-development

という事で

TiDBならあなたの作った個人開発サービスがなんかすごい良い感じになってTwitterとかInstagramとかYoutube規模になっても全然スケールするので安心して利用することが出来ます!!

なんと夢のあるサービスでしょう!!!!……と、まあ現実的にそうなるかはおいておいて、大きい夢を持てるのは素晴らしいことですね!

とは言いつつ、過去の実体験では月間2億PVくらいのサービスでもRead Heavyであれば月10万円くらいのRDB一台で(リードレプリカすらなく)普通に詰まること無く動いていたのでそこまでのスペックが必要な場面はなかなか訪れないとは思いますし、現実的にはRDBで充分なシーンも多いと思うので普通のRDBに比べてコストが跳ね上がるという事であれば採用できないという話になるかと思います

もちろんそこら辺は使い方によって料金が変わってくると思います

本当なら実測した方が良いのですがまとまった時間が取れないので普段使ってるRDBのデータを元にフワッと試算してみます

誰かやる気ある人いたら実測値出してください(丸投げ)

ざっくりコスト計算

\無料枠あるよ!/

お客様は1ヶ月間、行ベースのデータ5GiBと列ベースのデータ5GiBを同時に保存し、5,000万RUを消費することができます

https://pingcap.co.jp/tidb-cloud-serverless-pricing-details/

という感じの無料枠が設定されておりまして

5000万RUも無料枠あるのね!!!なるほど!!!??????んんん???????

ってなりません?AWSとかこういうクラウド系のサービスにありがちなんですけど正直 料金の想像が全くつかない ですよね

個々人の環境やプログラムの組み方によっても変わりますし、金額例を出す意味が無いというのは分かりつつも超ざっくりで良いからなんか目安ほしいよな~と毎回思うので自分で試算してみました。あくまでも試算なので本格的に使う前に自分で計算してください

Railsでよくあるアレはいくら?

select

例えばUser.all8件のデータを取ってきたら8ストレージ = 1 RU消費されるという感じだと思います

それに+してデータを取得するまでにかかったCPU時間がざっくり30msだとしたら +10RU、ネットワーク転送で1kb未満だとして + 1RU

合計 12RU くらいが消費されるかと思います

もちろんindexを貼っていないとかなると一気に跳ね上がりますので発行するSQLにはかなり慎重な姿勢が求められそうです

User.countとかやったらどれくらい時間かかるのかな?とちょっと気になりました # あとで試す

create

例えばUser.create1件のデータを作成した場合リードレプリカ?的なものの数だけ書き込みが処理されるので例えばマスター x 1 + レプリカ x 3 なら一度のUser.createで1ストレージ = 1 RU * 4台 = 4RU消費されるという感じだと思います

それに + して、insertも1件で30msはかかるでしょうから CPU時間で 30ms(10RU) * 4台分 + ネットワーク転送で + 1RU くらいを見て

合計 42RU くらいが消費されるかと思います

結局1000円のPostgreSQLと比較して安いの?高いの?

なんだかんだ書きましたが、細かいことはいいからこういう結論が知りたいですよね

東京リージョンでは、RU = リクエストユニットの価格は、1M(100万)あたり$0.12となっています

ざっくり計算すると、$1 = 150円換算で 0.000018 円 / RU という感じになりますが安いのか高いのか全然わかりませんね

さっきの試算を元に考えて、1000人が登録して1万件の記事が投稿されて、それぞれが10万回ほど更新されるとします

  • 1000人のユーザー登録 = 42RU * 1000 = ¥0.756
  • 1万件の記事投稿 = 42RU * 10000 = ¥7.56
  • 10万回の更新 = 42RU * 10万 = ¥75.6

サイトにアクセスするたびにログインの正当性を調べるために User.find( cookies[:user_id])をするとして、1ページに20件ほどの投稿データが表示されPost.order_latest.limit(20)ざっくり100万PVくらいだとしたら

  • 100万PVのUser.find = 12RU * 100万 = ¥216
  • 20件のPostデータ = 約20RU x 100万 = ¥360

とまあ、机上の計算ですが上記くらいの呼び出しで1000円程度となります。おそらく1000円で使えるRDBと比較しても充分と言えるくらいにはたっぷりと使えるのではないかと思います

他にストレージ料金もかかりますが、1GBもあれば上の条件なら充分 =30円程度 かと思います

一つだけ大きな注意点が最初にも書いた通り 「重いSQLを実行すると即死する」 という点ですね

例えばindexを貼り忘れた状態で User.find(1) をして、1.2sかかったとしたらそれだけで 1200ms(400RU)となり、そのページが1万PVあっただけで……

なんと……72円となってしまいます……

.

うわー!!高す…………?あれ…………?なんか思ってた「クラウド破産だー!!怖いーー!!!」って程でもないですね。思ったよりは全然怖くない気がします。これが10sとかになっても720円ですしね

結論としては意外と普通に本採用できそうだし、料金も1000円のRDBと比較すると割りとコスパよく使える気はします(もちろん固定費用のRDBの方が安心感はあると思いますが)

無料枠あるし試してみても良さそう

無限スケールするRDB(っぽいもの)というキャラ設定だけでも結構ワクワクしますし、将来的に業務でも使える可能性がめちゃくちゃあるので個人開発でさらっと触っておくのは面白い気がしました

副次効果として、SQLをキャッシュしたりindexに対して敏感になるので結果的に設計力もあがりそう

他の注意点としては、TiDB serverlessがAWS上で展開されているのでレイテンシー的にRails本体もAWSに置きたい = renderやherokuからは使えないという事にはなりそうですかね?

無料枠は本番運用で使っちゃダメ?

実はTiDB serverlessの存在はちょっと前から知っていたのですが、以下のような文言があり無料枠での本番での運用はダメだと勝手に思ってました

が、これはchatGPT部分に関して?であってTiDB serverless部分に関しては無料枠でも全然本番で使ってもらって大丈夫らしいです!↓ Twitterで教えてもらいました! thanks!

https://x.com/kanihanwei/status/1705946646750928930?s=20

最後に

とりあえず「こんなん見つけた!」くらいのテンションでがーーっと書いているのでめちゃくちゃ間違っている可能性があります(特に料金計算周りとか全く自信ない)

そういう不安をささっと解消するためにも無料枠で試しに使ってみるのはありだと思います

間違いなどあったら 優しく 教えてください!実際使ってみた人の感想とかも超募集してます!

Discussion