【しゃーでぃんぐ】

シャーディング とは?

最終更新:
💡 巨大なデータを「複数の引き出しに分けて管理」する手法

データ集合をシャードという部分に分け、複数のサーバーへ分散して保存・処理する手法。容量や読み書きの負荷を分担して、水平スケーリングを行う。

📌 このページのポイント
シャーディング:データを分散 IDを範囲で分けて保存する例 アプリ ID = 150 ルーター 配置を参照 Shard 1 ID 1〜100 Shard 2 ID 101〜200 Shard 3 ID 201〜300 150はShard 2へ 同じデータの複製とは別の仕組み
MongoDBのルーターを使う配置の概念例。青い矢印はID 150を探す問い合わせの向きで、データの移行ではありません。全体を対象とする問い合わせは複数シャードへ送る場合があります。各シャードの複製と設定情報は省略。
ひよこ ひよこ
シャーディングって、なぜデータを分けるの?
ペンギン先生 ペンギン先生
1台で扱う容量や処理の限界を広げるためだよ。たとえばユーザーIDが1〜100、101〜200、201〜300のデータを別々のシャードへ保存する。データを分けても、アクセスの偏りによって負荷は変わるので、必ず三分の一になるわけではないよ。
ひよこ ひよこ
シャードキーって何?
ペンギン先生 ペンギン先生
データをどこへ配置するか決める基準だよ。MongoDBでは文書のフィールドを使い、値の範囲やハッシュで分けられる。値の種類、出現頻度、増え方、よく使うクエリを考える。偏ると一部に負荷が集中するホットスポットができるんだ。
ひよこ ひよこ
レプリケーションとは違うの?
ペンギン先生 ペンギン先生
レプリケーションは同じデータのコピーを持つ仕組み、シャーディングはデータを分ける仕組みだよ。MongoDBでは各シャードをレプリカセットにして組み合わせる。シャード一つが必ずサーバー一台というわけではないんだ。
ひよこ ひよこ
どのシャードへ問い合わせるかは、アプリが決める?
ペンギン先生 ペンギン先生
製品によるよ。MongoDBではmongosというルーターが問い合わせ先を決める。キーを使って対象を絞れる場合も、全シャードへ問い合わせて結果を集める場合もある。シャードをまたぐ集計を必ずアプリだけで実装するわけではないよ。
ひよこ ひよこ
複数のシャードを一緒に更新できる?
ペンギン先生 ペンギン先生
対応は製品と設定によるよ。MongoDBにはシャードをまたぐ分散トランザクションがある。ただし単一文書の更新より性能コストが増えることが多く、データ設計や制約を考える必要がある。分散すれば何でも速くなるわけではないんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「シャーディング」って出てきたら「データを複数のサーバーに分けて保存・処理する方法」と思えばだいたいOK!
📖 おまけ:英語の意味
「Sharding」 = かけらに分ける
💬 Shardは「破片・かけら」という英語。データをシャードという部分に分けるイメージだよ。

参考資料

← 用語集にもどる