シャーディングとは、テーブルシャーディングという可能性【水平分割】
2019.10.31
多量の情報を扱うシステムを作成する際に一番の問題になるのがDataBaseの負荷です。
DataBaseはデータの保存、検索、管理等が容易に行える点が利点ですが
考えなしに、1箇所にデータを集めてしまうと一定のラインを超えた瞬間から顕著にレスポンスの低下が見られます。
その対策としてよく用いられるのがシャーディングです。
今回はこのシャーディングについて、活用方法とその効果に関して紹介していきます。
シャーディングとは
シャーディングとはDataBaseの負荷分散方法の1種です。
水平分割とも呼ばれます。
同じテーブルを複数のDataBaseに用意し、1つのテーブルに保存していたレコードを分散する事で
各DataBase内に保持されるレコードの量をへらす負荷分散の方法です。
1つのテーブル内のレコード数が大きくなる事で、低下していく処理速度を複数のDataBaseに分ける事で
1テーブル内のデータ量を減らし、1DataBase内のデータ量も減らすことができます。
また、DataBaseのサーバーを分けることでCPUやメモリにかかる負荷も分散されます。
更に、保存しているディスクを分ける事ができ保存する事が出来るデータの最大量を増やすことが可能となります。
一つのテーブルを3つに分ける際は、ID等の数値の場合分割する数で割った場合の余りの値を基準に
データを格納するDataBaseを決める手法がよく使用されます。
例えば、IDが1、2、3、4、5、とある場合に3つのDataBaseに分配する場合
となりそれぞれの対応したDataBaseにデータを格納します
数値以外の場合は、事前に割り振りをどうするのかを決めて配列等で分配する手法を取る事もあるようです。
水平分割で気をつけること
水平分割はDataBaseが別れてしまう為以下の点に注意しなくては運用できなくなってしまいます。
- 他テーブルとのJOINが難しい点
- シャーディングの分割対象にした値以外での検索が難しくなる点
どうしてもこれらの問題を解決できない場合は水平分割は避けたほうが良いのかもしれないです。
正規化を細かく行っていた場合等は特にテーブル同士のJOINが必要となる為、この問題の発生率も高いのではないかと思われます。
テーブルシャーディングとは
シャーディングというと基本的に複数のDataBaseに同じカラム構成のテーブルを作成する形が主流です。
しかし、テーブルとのJOINがどうしても必要な場合にも、シャーディングが必要になることがあります。
その場合はテーブルシャーディングが有効かもしれません。
テーブルシャーディングとは、同じDataBase内で同じカラム構成のテーブルを複数用意し
分散の対象の値をテーブル名に入れる事で1テーブル内のデータ量を分散します。
この方法は、他テーブルとのJOIN等が出来る点が特徴です。
しかし、DataBase内の容量を分散する事はできなくなる為通常のシャーディング(データベースシャーディング)とテーブルシャーディングのどちらを使うかはしっかりと設計をしないといけません。
1つのDataBase内でのテーブルの水平分割をテーブルシャーディングと呼びます。
複数のDataBaseでの水平分割をデーターベースシャーディングと呼ぶこともあります。
まとめ
シャーディング(水平分割)はDataBaseを利用するシステムを作成する際にとても重要な要素になります。
1つのテーブルに多量のデータ(1億レコード等)がある場合、様々な動作に負荷がかかるようになります。
INDEX等でのSQLのチューニングも必要ですが、シャーディングの様に実際にデータの量を調整してみると
大幅にシステムの速度を高速化できるでしょう。
その際はしっかりとした設計で、どうシャーディングをすると問題が無いかを決めていく事が重要です。
関連