データベース管理・運用

シャーディング しゃーでぃんぐ

水平分割スケールアウト分散データベースパーティショニングNoSQLハッシュシャーディング
シャーディングについて教えて

簡単に言うとこんな感じ!

シャーディングは「データを複数のDBサーバーに分けて入れる」仕組みだよ! 1つの倉庫に荷物が入りきらなくなったら倉庫を増やして荷物を振り分けるイメージ。ユーザーIDが1〜1000万はDB1、1001万〜2000万はDB2、みたいに分散させることで超大規模サービスを支えてるんだ!


シャーディングとは

シャーディング(Sharding)とは、1つのテーブルのデータを複数のデータベースサーバー(シャード)に分散して格納する技術です。データを「水平に切り分ける(水平分割)」ことから水平シャーディングとも呼ばれます。

単一のDBサーバーでは処理しきれない膨大なデータ量・アクセス数に対応するため、データを複数サーバーに分散させることで書き込み・読み取りともにスケールアウトできます。SNS・ゲームのユーザーデータ・ECのトランザクションログなど、億単位のレコードを扱う大規模サービスで採用されています。

一方で、シャーディングには複雑さが伴います。複数シャードをまたぐJOINが困難になる、シャード間のトランザクション(分散トランザクション)が難しくなる、データの再分散(リシャーディング)が大変といった課題があります。そのため、レプリケーションや垂直スケール(サーバーのスペックアップ)で対応できる段階ではシャーディングを避けることが多いです。


シャーディングの戦略

戦略仕組み特徴
レンジシャーディング値の範囲でシャードを振り分け(user_id 1〜100万はシャード1)実装が単純。ホットスポットが発生しやすい
ハッシュシャーディングキーのハッシュ値でシャードを決定均等に分散。範囲クエリには不向き
ディレクトリシャーディングルックアップテーブルでシャードを管理柔軟だがルックアップのオーバーヘッドあり
地理的シャーディング地域ごとにシャードを分けるレイテンシ改善・データ主権対応
ハッシュシャーディングの構成 アプリケーション user_id → hash(user_id) % 3 余り=0 余り=1 余り=2 シャード 0 user 3, 6, 9… DBサーバー1 シャード 1 user 1, 4, 7… DBサーバー2 シャード 2 user 2, 5, 8… DBサーバー3 各シャードは独立したDBサーバー。同時に読み書きできるのでスループットが向上 複数シャードをまたぐJOINはアプリ側でマージする必要あり

シャーディング vs パーティショニング vs レプリケーション

比較項目シャーディングパーティショニングレプリケーション
データ配置別々のDBサーバー同一DBサーバー内全データをコピー
書き込みスケール○ 向上する△ 限定的× 向上しない
読み取りスケール○ 向上する○ 向上する○ 向上する
可用性向上△ 部分障害あり×フェイルオーバー
実装難易度高い低〜中中程度

歴史と背景

  • 2000年代初頭:Google・Amazonなどが数億〜数十億レコードを扱う必要性からシャーディングを内部実装
  • 2009年:MongoDBなどNoSQLがシャーディングを標準機能として提供開始。普及が加速
  • 2012年:VitessがMySQLのシャーディングミドルウェアとしてYouTubeから公開
  • 2014年:CockroachDB・TiDBなどのNewSQLが「シャーディングを意識せずに水平スケール」できるアーキテクチャを提供
  • 現在:Amazon Aurora Sharding・Google Spannerなどクラウドサービスが自動シャーディングを提供し、利用者がシャーディングを意識しなくてよい方向に進化している

関連する規格・RFC

規格内容
CAP定理分散DBにおける一貫性・可用性・分断耐性のトレードオフ理論
MongoDB Shard KeyMongoDBのシャーディング設定仕様

関連用語