【しゃーでぃんぐ】

シャーディング とは?

💡 データベースを「横に切って」分散する
📌 このページのポイント
データベースシャーディング 巨大なDBテーブル user_id: 1〜900 (数百万行…) シャードキー (user_id) で分割 Shard 1 user_id: 1〜300 Shard 2 user_id: 301〜600 Shard 3 user_id: 601〜900 サーバー1 東京リージョン サーバー2 大阪リージョン サーバー3 海外リージョン データを分割して複数サーバーに分散 → 負荷を軽減
データベースシャーディングのイメージ
ひよこ ひよこ

レプリケーションとの違いは?

ペンギン先生 ペンギン先生

レプリケーションは「同じデータを複数サーバーにコピー」する。読み取り性能とか可用性の向上が目的。シャーディングは「データを分割して複数サーバーに分散配置」する。書き込み性能とストレージ容量のスケールが目的。レプリケーション+シャーディングの組み合わせも一般的だよ

ひよこ ひよこ

シャードキーってどう選ぶの?

ペンギン先生 ペンギン先生

データが均等に分散するキーを選ぶのが鉄則。ユーザーIDは分散しやすくて定番。作成日時は「最新シャードに負荷集中」になりやすいから注意。国コードは日本のユーザーが多ければ偏る。ホットスポット(特定シャードへの負荷集中)を避けるのが最大のポイントだよ

ひよこ ひよこ

シャーディングのデメリットは?

ペンギン先生 ペンギン先生

①クロスシャードJOINが困難(複数シャードにまたがるクエリが非効率)、②トランザクションの複雑化(分散トランザクションが必要になる)、③リシャーディング(シャード数の変更)が大変、④運用の複雑性増大。「シャーディングは最後の手段」と言われるほどで、まずはリードレプリカ、キャッシュインデックス最適化を試すべきだよ

ひよこ ひよこ

どのくらいのデータ量でシャーディングを検討する?

ペンギン先生 ペンギン先生

明確な基準はないけど、1テーブルが数億行を超えてインデックスだけでは追いつかない場合や、1台のサーバーのディスクI/Oが限界に達した場合が目安。最近はNewSQLCockroachDBTiDB)が自動シャーディング機能を提供していて、手動シャーディングの苦労を軽減してくれるよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「シャーディング」って出てきたら「DBを水平分割して複数サーバーに分散する手法」と思えればだいたいOK!
📖 おまけ:英語の意味
「Sharding」 = 破片に分割する
💬 Shard(破片・かけら)。データベースを破片に分けて分散保存するイメージだよ
← 用語集にもどる