システムの組み方と性能

INPUT · スライド

壊れても止めない作り

01 / 12

1台で全部やるか、分けるか

ここまで書いてきたコードは、たいてい1台の中で動くものだった。でも実際のサービスは、そうはいかない。使う人が増えれば1台では足りなくなるし、その1台が壊れたら全部止まってしまう。

いちばん素朴なのが 集中処理 だよ。1台の大きなコンピュータが処理もデータも全部持つ形。作りが単純で、データが1か所にあるので管理も楽。そのかわり、そこが止まると全部止まる

反対が 分散処理。何台かに仕事を分け合わせる形だよ。1台が止まっても残りで続けられるし、足りなくなったら台数を足せる。そのかわり、台数ぶんの管理が要るし、データの食い違いにも気をつける必要がある。

このレッスンは、分けたときに何が起きるかをずっと追いかけていく話だよ。

集中処理  1台が全部やる  止まると全滅分散処理  何台かで分け合う  1台止まっても続く

02 / 12

クライアントサーバ ― 頼む側と応える側

分散処理のいちばん身近な形が クライアントサーバシステム だよ。サービスを頼む側(クライアント)と、それに応える側(サーバ)に役割を分ける組み方のこと。

ブラウザとウェブサーバがまさにこれ。ブラウザは「このページをください」と頼むだけで、中身を作るのはサーバの仕事だよ。

大事なのは、これが機能を分けて配置する分散処理の一種だということ。1台の中でぜんぶ済ませるのではなく、サービスという単位で仕事を切り分けて、担当する機械を分けている。

よく似た言葉に ピアツーピア がある。こちらは頼む側と応える側を決めず、どの機械も対等に振る舞う形。「サーバがいるかどうか」で見分けられるよ。

03 / 12

仕事を3つに割る ― 3層クライアントサーバ

サーバ側の仕事は、さらに細かく分けられる。よく使われるのが3つに割るやり方で、これを 3層クライアントサーバシステム と呼ぶよ。

  • プレゼンテーション層 … 画面の表示と入力。ブラウザが受け持つ
  • ファンクション層(アプリケーション層) … 業務の処理。AP サーバが受け持つ
  • データ層 … データの保管と検索。DB サーバが受け持つ

この前の形が 2層 だよ。2層ではクライアント側に業務処理まで持たせていたので、処理を1つ直すたびに全員の端末にソフトを配り直す必要があった。さらに、クライアントから DB サーバへ直接 SQL 文が飛ぶので通信量も増える。

3層にすると、業務処理はサーバ側に集まる。クライアントに残るのは画面の表示だけになるので、端末は軽くて済むし、直したいときはサーバを直せば全員に効くよ。

クライアント  ↓ 画面の表示AP サーバ  ↓ 業務の処理DB サーバ    データの保管

04 / 12

端末をとことん軽くする ― シンクライアント

3層をつきつめると、クライアントには画面を出すことしか残らない。それなら端末側にデータを置く必要もない、という発想が シンクライアント だよ。シン(thin)は「薄い」という意味。

処理もデータもサーバ側に置き、手元の端末は入出力だけを担当する。ハードディスクなどの外部記憶装置を持たない作りにすることも多いよ。

この形がとくに効くのがセキュリティ。手元にデータが残らないので、端末を紛失しても中身は漏れない。守るべき場所がサーバに集まるので、そこを固めればリスクをまとめて下げられる。

弱点もある。サーバと通信できないと何もできないし、サーバ側が混むと全員が遅くなる。守りやすさと引きかえに、サーバへの依存が強くなる組み方だよ。

05 / 12

足りなくなったら ― 増やし方は2つ

処理が追いつかなくなったときの手は、大きく2つあるよ。

  • スケールアップ … いまの機械をもっと高性能なものに入れ替える。1台のまま強くする
  • スケールアウト台数を足す。1台あたりはそのままで、数で処理する

スケールアウトで台数を足したら、来た仕事を各サーバへ振り分ける係が要る。それが ロードバランサ(負荷分散装置)だよ。

ロードバランサは処理を均等に配るので、機械を遊ばせずに使えるし、あとから台数を足して処理量を伸ばせる。これを 負荷分散クラスタ と呼ぶよ。

スケールアウトが向くのは、同じ処理を並べて実行できる仕事。読み取りが中心の処理は分けやすい。逆に、1つの大きな処理を途中で分けられないものや、書きこみが多くて食い違いを直す手間が大きいものには向かないよ。

ロードバランサ  ├ Web サーバ 1  ├ Web サーバ 2  └ Web サーバ 3

06 / 12

壊れる前提で二重にする ― 冗長化

機械はいつか壊れる。だから同じものを2つ用意しておく、というのが 冗長化(二重化)の考え方だよ。名前が似た方式が並ぶので、ここで整理しよう。

  • シンプレックスシステム … 1系統だけ。予備は無い
  • デュアルシステム2系統がまったく同じ処理を同時に行い、結果を照合する。食い違えば異常が分かる。片方が壊れたら切り離して、残りで続ける(縮退運転)
  • デュプレックスシステム片方が本番(現用系)、もう片方は控え(待機系)。現用系が倒れたら待機系に切り替える

混ざりやすいのはこの2つだよ。デュアルは「両方が同じ仕事をしていて、答え合わせをする」。デュプレックスは「片方が働き、片方は控えている」

どちらも2系統だけれど、目的が違う。デュアルは結果の正しさまで守りたいとき、デュプレックスは止まらないことを守りたいときのやり方だよ。

デュアル  A ─┬─ 同じ処理  B ─┘  結果を照合デュプレックス  A 現用系 … 処理する  B 待機系 … 控える

07 / 12

待機系がどれくらい温まっているか

デュプレックスの「控え」には温度差がある。待機系がどこまで準備できているかで呼び名が変わるよ。

  • ホットスタンバイ … 待機系でも同じプログラムをあらかじめ起動して待つ。現用系の生死を見張っていて、倒れたらただちに引き継ぐ
  • ウォームスタンバイ … 電源は入っているが、業務プログラムは動かしていない。切り替えに少し時間がかかる
  • コールドスタンバイ … 待機系は止めてある。壊れてから起動して立ち上げるので、いちばん時間がかかる

止まらなさで並べると、デュアル > ホットスタンバイ > コールドスタンバイ > シンプレックス の順になる。予備の温度が高いほど早く戻れる、と考えれば並びは覚えなくていいよ。

複数のサーバをまとめて1つに見せる作りを クラスタ と呼ぶ。待機系を置く形が HA クラスタ、ロードバランサで分け合う形が 負荷分散クラスタ だよ。

この2つは狙いが違う。HA クラスタは壊れても同じ性能を保つためのもので、待機系は普段ひまをしている。負荷分散クラスタは全台を使い切るためのもので、1台減ればその分だけ残りが苦しくなるよ。

08 / 12

止めないための考え方に、4つの名前がある

冗長化は道具で、その上にどういう方針で守るかという設計思想がある。試験でいちばんよく混ざる4つを並べるよ。

  • フォールトトレラント … 部分的に壊れても全体としては必要な機能を保つ。多重化して、故障の影響を外へ出さない
  • フェールソフト … 壊れたら機能を減らしてでも動かし続ける。性能を落として生き延びる(この状態が縮退運転)
  • フェールセーフ … 壊れたら安全な側に倒して止める。動かし続けるより、被害を出さないことを優先する
  • フールプルーフ … そもそも人が操作を誤っても異常にならないようにしておく。故障ではなく誤操作が相手

見分け方はこうだよ。壊れたときの話か、間違えたときの話かをまず分ける。間違えたときの話ならフールプルーフ。

壊れたときの話なら、続けるのか止めるのかを見る。減らしてでも続けるならフェールソフト、安全に止めるならフェールセーフ。そして、そもそも全体を落とさないという大きな目標がフォールトトレラントだよ。

誤操作 → フールプルーフ故障して  減らして続ける    → フェールソフト  安全に止める    → フェールセーフ  全体は落とさない    → フォールト      トレラント

09 / 12

ディスクをまとめて強くする ― RAID

壊れる部品の中でも、いちばんよく壊れるのがディスクだよ。そこで、複数のディスクをまとめて1つに見せるやり方が RAID だよ。

まとめ方によって番号がついていて、データと冗長ビットを、どう記録してどこに置くかの組み合わせで区別されている。

  • RAID0(ストライピング) … データを細かく分けて複数のディスクへ分散して書く。同時に読み書きできるので速い。ただし冗長性は無く、1台壊れたら全部だめ
  • RAID1(ミラーリング) … 2台に同じ内容を書く。片方が壊れてももう片方で続けられる。そのかわり使える容量は半分
  • RAID5 … データをブロック単位で分散し、復元用の パリティ複数のディスクに分散して置く。1台までなら残りから復元できる

0 は速さ、1 は安全、5 はその折衷と覚えるといいよ。

RAID0 ストライピング  D1: A C E  D2: B D F  速い / 冗長性なしRAID1 ミラーリング  D1: A B C  D2: A B C  安全 / 容量は半分

10 / 12

RAID5 のパリティと、必要な台数

RAID5 がうまいのは、復元用のデータを1台に集めないところだよ。

パリティを1台にまとめて置く方式(RAID4)だと、書きこむたびにその1台へ必ずアクセスが集まって、そこが渋滞する。RAID5 はパリティも分散して置くので、その渋滞が起きない。

台数の話もよく問われるよ。

  • RAID1 は同じ内容を2台に持つので、使いたい容量の2倍のディスクが要る。4T バイトぶん使いたければ、1T バイトのディスクが 8台
  • RAID5 は n 台のうち1台ぶんがパリティに使われるので、使える容量は (n − 1) 台ぶん

「何台必要か」は、この関係を素直に当てはめるだけで出るよ。

RAID5 分散パリティ  D1: A C P  D2: B P E  D3: P D F  1台までなら復元RAID1 で 4T 使う  1T × 8台

11 / 12

機械を分けずに分ける ― 仮想化

ここまでは「台数を足す」話だった。でも、いつも物理的に増やせるとはかぎらない。そこで 仮想化 が出てくるよ。

仮想化は、1台の物理サーバの中に、独立したコンピュータが何台もあるように見せる技術だよ。中で動く仮想サーバはそれぞれ別の OS を持ち、お互いに干渉しない。

うれしいのは、使い切れていない性能を分け合えること。1台で 30% しか使っていないサーバが3台あるなら、まとめてしまったほうが無駄が無い。台数が減れば置き場所も電気代も減るよ。

注意したいのは、物理サーバが1台壊れると、その中の仮想サーバが全部止まるということ。空いた分は残りの物理サーバが引き受けるので、そのぶん残りの負荷が上がる。使える力を超えると、機能を絞った縮退運転に入るよ。

物理サーバ 1台 ├ 仮想サーバ A ├ 仮想サーバ B └ 仮想サーバ C

12 / 12

借りる範囲で名前が変わる ― SaaS・PaaS・IaaS

仮想化を、他人の持っている大きな設備の上でやってもらう。それを必要なぶんだけ借りるのが クラウドコンピューティング だよ。コンピュータの資源をネットワーク越しに提供するサービスのこと。

借りる範囲によって呼び名が変わる。どこまでが向こうの仕事かで分かれるよ。

  • IaaS … 借りるのはハードウェアと実行環境まで。OS から上は自分で入れて自分で管理する。自由度がいちばん高い
  • PaaS … 借りるのは OS やミドルウェアまで。自分が用意するのはアプリだけ。土台をいじることはできない
  • SaaSアプリまで出来ているものを使う。用意するものは無く、設定を変えて使うだけ

名前の真ん中の文字が答えを持っているよ。I はインフラ、P はプラットフォーム、S はソフトウェアその文字までが向こうの担当、と読めばいい。

楽なのは SaaS だけれど、出来合いなので自社だけの都合には合わせにくい。自由なのは IaaS だけれど、OS の面倒は自分で見ることになる。楽さと自由は引きかえだよ。

自分で用意する範囲IaaS  OS から上を自分でPaaS  アプリだけ自分でSaaS  何も用意しない