時々、たまたま見かけたRedditのスレッドが一晩まるごと私を沼にはめ込むことがある。これはそんな夜の一つだった。誰かがYouTubeのような企業がどうやってデータベースをスケールさせているかについて投稿していて、コメント欄は、たった一つのシステムがそれほどの負荷をどうやって処理できるのか本当に理解できないという人たちで溢れていた。その疑問が頭から離れず、調べ始めることになった。
YouTubeが実際にどうやっているか
調べてみると、YouTubeはMySQLをVitessでシャーディングして運用していることが分かった。Vitessはもともと、MySQLを何千ものシャードにまたがって水平方向にスケールさせつつも、アプリケーションからは1つのデータベースのように見せるためにYouTube自身が構築したシステムだ。それを知った瞬間、自分自身の構成を振り返り、「なぜ自分はこれをやっていないのか?」と自問することになった。
自分が実際に運用しているものを棚卸しする
私は2台のサーバーを持っている。1台はDocker内で共有PostgreSQLインスタンスを動かしており、複数の小規模サイトを提供している。もう1台はImmich専用で、写真の類似検索のためにpgvector拡張機能を使ったPostgresを使っている。MySQLを動かしている唯一のものは、母のサイトであるdoc-agnes.comで、WordPressで動いているが、それには触れられない。データを危険にさらすことなく稼働中のWordPressデータベースを移行するほどの自信がまだないし、正直、そもそもWordPressがPostgresとどれくらいうまく動くのかもよく分かっていない。
CitusとAuroraの沼へ
そこで、PostgresにVitessに相当するものがあるかどうかを調べに行った。Citusというものが出てきた。分散/シャード化されたPostgres用の拡張機能だが、私が見つけたほとんどの比較によると、純粋な水平方向のMySQL方式スケーリングという点ではVitessより遅い。それを見て私はブツブツ言い始めた。最初からPostgresではなくMySQLとVitessで構築すべきだったのではないかと。
それからAuroraが視野に入ってきた。AWSは、標準的なMySQLやPostgresの内部構造に頼るのではなく、Auroraの下にAWS独自のストレージエンジンを構築しており、その数値には感心させられた。私が読んだ多くのベンチマークで、両者を上回っていた。しかし、Geminiにこの3つを比較検討させたところ、Auroraの標準構成は非常に高い持続書き込みスループットで苦戦し始めることがあると指摘してきた(ざっくりした数字では、負荷限界はおよそ毎秒15万書き込み付近らしい)。これにより、本格的な規模での書き込みの多いワークロードに対しては、評価が少し下がった。
次に運用の複雑さを比較した。MySQLとVitessは、シャーディングロジック、プロキシ、接続処理をほぼ自分で管理することになるため、運用が最も難しい。Citusは、Postgresの拡張機能であるため、比較的手間がかからない。すでに知っているデータベースの上に乗る形なので、まったく新しい分散システムを手作業で組み立てる必要がない。この時、なぜ今これほど多くの企業がデフォルトでPostgresを選ぶのか腑に落ちた。すべてのベンチマークで必ずしも高速だからではなく、運用上の税金がはるかに低いからだ(AWSの新しい分散Postgresオファリングである Aurora Limitlessも堅実に見えた)。
市場シェアへの寄り道
この沼のどこかで、データベースの市場シェアを調べることになり、Postgresが開発者調査のランキングでトップに立ち、MySQLがすぐ後ろに続いていることを知った。ただしどの調査を見るか(導入実績か、開発者が使っている/使いたいと答えたものか)によって順位は入れ替わる。いずれにせよ、Postgresの今の勢いは見逃しようがない。
Redisについても話題になった。私はずっとRedisは純粋にキャッシュ層だと思い込んでいたが、Geminiが教えてくれたところによると、私はおおむね正しかったものの、技術的にはただキャッシュとしてどこかの前段に座っているのではなく、フル機能のインメモリデータベースだという。速さの理由は、RAMがディスクよりも劇的に速いからだ。私が曖昧に理解していたのは、Redisは依然としてバックグラウンドでディスクに永続化できる(スナップショットや書き込みの追記専用ログ)ということで、再起動したからといって必ずしもすべてを失うわけではないということだ。私が思っていたほど純粋に一時的なものではなかった。
現実チェック
これだけ読んで、比較して、おそらく自分には一生必要ないであろうアーキテクチャについてブツブツ文句を言った後、思わず自分自身に笑ってしまった。私にはYouTubeの問題はない。プロジェクトごとにユーザーは4人ほどで、それも実際に知っている人たちだ。私が保存している中で最も重いものはImmichの写真だ。シャードもVitessも、毎秒15万書き込みもない。あるのは自分自身とPostgres、そしてとても小さくとても満ち足りたデータセットだけだ。でもまあ、少なくとも今は理論を理解できたということで。