シャーディングとは、1台のデータベースに収まりきらないデータを、決めた規則に従って複数のサーバー(シャード)に分けて保存する手法です。データ量やアクセスが1台の限界を超えたとき、サーバーを足して処理能力を横に広げる「水平スケール」の代表的な方法です。
シャーディングとは:何をどう分けるのか
テーブルを行単位で分け、たとえば「ユーザーIDのハッシュ値で振り分け、このユーザーのデータはシャード3に置く」と決めます。振り分けの基準にする列を「シャードキー」と呼びます。
同じデータを複数台にコピーするレプリケーションとは違い、シャーディングでは各シャードが別々のデータを持ちます。そのため、読み取りだけでなく書き込みの性能と保存容量も、シャードの数に応じて伸ばせます。ここが、読み取り用レプリカを増やす方式との大きな違いです。
使い方:設計で決めること
導入で一番大事なのはシャードキーの選び方です。特定のキーにアクセスが集中すると、そのシャードだけが過負荷になります(ホットスポット)。また、一緒に読むデータが別々のシャードに散らばると、複数のシャードをまたぐ検索・JOIN・トランザクションが必要になり、遅く複雑になります。データが増えたときにシャードを分け直す「リシャーディング」の手順も、最初から考えておく必要があります。
実装方法は大きく2つです。アプリ側で振り分けを自前で書く方法と、ミドルウェアやデータベース側に任せる方法です。後者の例として、MySQL向けの Vitess、PostgreSQL の拡張機能の Citus、MongoDB に組み込まれたシャーディング機能があります。Google Spanner や CockroachDB、TiDB のような分散SQLデータベースは、内部で自動的にデータを分割します。
事例:PlanetScale の自動シャーディング「Neki」
PlanetScale は、PostgreSQL のシャーディングを自動化するサービス「Neki」をプレビュー公開しました。仕組みは、同社がこれまで提供してきた MySQL 向けの Vitess を参考にしています。同社のベンチマークでは、約1.4PBのデータベースを512シャードに分けて最大1億1875万QPSを記録し、シャードを増やすとほぼ比例して性能が伸びたとしています。なお、これは開発元自身が公表した数値です。
OpenAI も、10億人を超える ChatGPT の利用者を支えるためにストレージを急拡張した経緯を公式ブログで説明しています。ただ、シャーディングを採用しているかどうかは、当サイトで確認できた範囲では分かりません。
料金:何にお金がかかるのか
Neki の料金は、当サイトの取材範囲では公表を確認できていません。そのため、具体的な金額はここでは書きません。
費用は主に3つです。シャードの数だけ必要になるサーバー代、マネージドサービスを使う場合の利用料、そして自前で運用する場合の設計・監視・リシャーディングにかかる人件費です。企画やDXの担当者は、まず1台のサーバーの増強や読み取りレプリカで足りないかを検討し、書き込みや容量が本当に限界に近づいてからシャーディングを選ぶのが妥当です(これは一般的な設計の考え方に基づく筆者の見解です)。
誰が作っているか・競合
Vitess は YouTube で生まれ、CNCF の卒業プロジェクトになったオープンソースです。PlanetScale は Vitess の開発者が創業した会社で、Neki によって MySQL に加えて PostgreSQL 市場にも参入します。PostgreSQL のシャーディングでは、Microsoft が買収した Citus が先行しています。さらに、Spanner(Google)、CockroachDB、TiDB(PingCAP)、YugabyteDB などの分散SQL勢も、別のやり方で同じ課題に取り組んでいます。Neki はこれらと競合する立場になると考えられます(筆者の推測)。

