わかりやすく 分散データ とは
データがどんどんたまっていくと、どうなるでしょうか。どんなに大きな倉庫も、いつかはいっぱいになります。そこで倉庫を何棟かに増やして荷物を分けて入れ、一棟がこわれても荷物を失わないように、同じ荷物をほかの倉庫にも写しておきます。データも同じです。コンピューター一台で手に負えなくなったら何台にも分けて収め、故障に備えて何台にも写しを置いておきます。
一台では足りなくなる
前のレッスンまでで、データを収め、探し、安全に変え、速く小さくあつかう方法を見てきました。でも、データは止まることなくたまっていきます。利用者が増え、記録が増え、写真や動画まで入ってきます。
コンピューター一台に収められる量には限りがあります。ディスクの大きさも、一台が一度に処理できる要求の数も決まっています。下で、一台にデータを入れ続けてみましょう。
データ追加を押し続けてみましょう。一台の容量をこえると、もう収められません。
一台がいっぱいになりました。もっと入れたくても、場所がありません。もっと大きなコンピューターにかえる方法もあり、これを垂直スケーリング(スケールアップ)といいます。でも、大きなコンピューターほど値段が急に高くなり、どれだけ大きくしても、結局またいっぱいになります。
そこで、別の道を選びます。一台を大きくするかわりに、台数を増やすのです。これを水平スケーリング(スケールアウト)と呼びます。では、データを何台にどう分けて収めればよいのでしょうか。
何台にも分けて収める
データをかけらに分けて、何台にも散らばらせて収めます。一台が全部をかかえこむかわりに、それぞれの台が一部だけを受け持つのです。このように分けて収めることを分散、なかでもデータそのものをかけらに分けることをシャーディングといいます。
分け方はいろいろあります。名前があ行からな行までのデータは1号機、は行からわ行までは2号機というように範囲で分けることもできますし、前に見たハッシュでキーを数に変え、その値にしたがって均等に散らすこともできます。範囲で分けると特定の区間にデータがかたよることがあるので、均等に広げたいときにはハッシュがよく使われます。
かけらを一つずつ押して、何台にも分けて収めてみましょう。それぞれの台が、全体の一部だけを持つようになります。
かけらが三台に散らばりました。一台が背負っていた荷物が軽くなり、データがさらに増えたら、コンピューターをもう一台つないで新しいかけらを任せればすみます。このように増やしていけるので、とても大きなデータも収められます。
あるデータを探すときは、まずそのデータがどの台にあるかを知らなければなりません。分け方の決まりは分かっているので、キーを見れば行き先の台が決まります。でも、心配が一つ出てきます。あるかけらを受け持つその一台が、急に故障したらどうなるでしょうか。
同じデータを何台にも写しておく
分けて収めると、弱点が生まれます。あるかけらを受け持つコンピューターが故障すると、そのかけらがまるごと消えてしまいます。コンピューターが多いほど、そのうちのどこかが故障することも多くなります。
そこで、同じデータを何台にも写しておきます。一台が止まっても、写しを持つ別の台が引きつぐので、データは失われません。このように同じデータを何台にも置くことを複製(レプリケーション)といいます。写しがあれば、読み出しの要求を何台かで分けて受けることもできます。
先に写しを作ってから、一台を止めてみましょう。一台を止めても、写しを持つ別の台が動いているので、データは残ります。
一台を止めても、データは無事でした。写しのおかげです。ここで、二つをはっきり区別しておきましょう。分散はデータを割ってちがう台に分けること、複製は同じデータを何台にもそのまま置くことです。実際のシステムでは、ふつう二つをいっしょに使い、かけらごとに写しを置きます。
複製には代償もあります。データを直すたびにすべての写しをそろえなければなりませんが、コンピューターどうしの連絡には時間がかかるので、しばらくは写しごとに値がちがうことがあります。ネットワークが切れたとき、古い値でもすぐに答えるか、そろうまで待つかを選ばなければならない場面もやってきます。
ゆるい入れ物、NoSQL
データがとてつもなく多く、とても速く出し入れしなければならないときは、厳しい表がかえって重荷になることがあります。すべての行が同じ列をそろえなければならず、表どうしをつなぐジョインやトランザクションを何台にもまたがって守るのは、手間がかかるからです。
そこで、決まりをゆるめた保存の仕組みを使います。表のかわりに、一つのキーに一つの値をぶら下げて、すぐ入れてすぐ取り出すやり方です。前に見たハッシュ表を何台にも広げた形なので、キーさえあれば、どの台にあるかもすぐに決まります。このような保存の仕組みをまとめて、NoSQLと呼びます。
ものさしを押して、厳しい表とゆるいキーと値の入れ物を比べてみましょう。形が自由で、大きく速い処理に向いているのは、ゆるい入れ物の方です。
ゆるい入れ物は、決まりが少ないぶん自由で速いです。行ごとに列がちがってもよく、キーさえあれば値をすぐに入れて取り出せます。そのかわり、表どうしをつなぐジョインや厳しいトランザクションのような便利さは、一部手放します。
だから、何を得て何を手放すかを、使いみちに合わせて選びます。お金が行き来する帳簿のように正確さが第一のところには厳しい表を、ものすごい量の記録を速くためていかなければならないところにはゆるい入れ物を使う、というように。一つのサービスの中で、二つをいっしょに使うこともよくあります。
データの分野をまとめる
ここまで、長い道のりを歩いてきました。値を収めるデータ構造から始めて、表を集めたデータベースを見て、ハッシュや木、インデックスで大きな表から速く探す方法を学びました。SQLで尋ね、ジョインで表をつなぎ、正規化で重なりを減らし、トランザクションで安全に変えました。
キャッシュと圧縮で、もっと速く小さくあつかう方法も見ました。そして今回は、一台では足りないときに分けて収め、写しを置いておく方法までたどり着きました。
データ分野の大きな流れを順に押して、締めくくりましょう。(データ構造という入れ物 → 表を集めたデータベース → 速く探す → 尋ねてつなぐ → 整理して安全に変える → 速く小さく → 分けて収めることと複製)
今回の内容をまとめるとこうです。データが一台で手に負えなくなったら、何台にもかけらに分けて収め(分散)、故障に備えて同じデータを何台にも写しておきます(複製)。分けることと写すことは別の仕事で、実際には二つをいっしょに使います。
大きく速い処理のためには、表の決まりをゆるめたNoSQLという保存の仕組みを使うこともあります。何を得て何を手放すかを選んで使うことが、かなめです。
これで、データをあつかう大きな絵が、ひと目で見わたせるようになりました。小さな入れ物一つから始めて、何台にも分けて写しを置く大きな仕組みまで来ました。情報を安全に収め、速く探し、大きく広げるこの力が、次の分野の土台になります。
次の分野は人工知能です。たくさんのデータが集まるところで、機械が決まりを自分で見つけ出します。最初のレッスンでは、機械が学ぶとはどういうことかから見ていきます。