[インフラエンジニア向け]可用性設計の考え方


はじめに

私はインフラエンジニアとして4年の実績がありますが、結構偏ったキャリアだったのでインフラ全体の考え方が身についていませんでした。
なので、インフラ設計の基礎を改めて勉強しています。
今回はその中での可用性設計の考え方についてアウトプットしていきます。
間違っている点などあればバンバン指摘いただければと思います。

可用性とは

一言でいうと、ユーザーからみてシステムが利用可能である度合いのことです。
つまりどれだけ使い続けられるか、という指標です。

耐障害性

システムは障害がつきものです。
ですが障害が発生するたびにシステムが使えなくなってしまっては利便性が落ちてしまいます。
なので障害が発生しても継続できるような仕組みを設計する必要があります。
これが耐障害性となります。

SPOF

単一障害点(SPOF:Single Point Of Failure)
これはシステムの構成上、そこに障害が発生するとシステムが利用できなくなってしまうポイントのことです。

例えば、クライアント端末 ー ルータ ー ハブ ー 負荷分散装置 ー WEBサーバー
このような構成があった場合、全ての装置で1台ずつしかなかったら、どれか一つが壊れたらWEBサーバーに辿り着けないですよね。
また、WEBサーバー自体も壊れてしまったらリクエストをクライアントに返せなくなってしまいます。
各機器や設備でそこが壊れたらシステムが使えなくなってしまうという部分があるとそこがSPOFということになります。

冗長化

このような状態を避けるためにサーバーやネットワーク機器を冗長化します。
機器を2台以上で構成すれば、もし一つが壊れたとしてももう一台で処理を継続することができます。
もちろん切り替わりに時間がかかることもありますが、ネットワーク機器であれば経路切り替えはほぼ一瞬で行われます。

冗長化にもいくつか種類があります。
・ハードウェア(電源ユニット、NWケーブルなど)の冗長化
・サーバーの冗長化

ハードウェアの冗長化

ここではネットワークアダプタ(NIC)とディスクの冗長化について見ていきます。

NICの冗長化には以下の3種類があります。
・フォールトトレランス
・リンクアグリゲーション
・ロードバランシング

フォールトトレランスは「アクティブ、スタンバイ」のかたちです。
片方がアクティブで、片方がスタンバイ。
アクティブ側に障害が発生したら、スタンバイがアクティブに切り替わる方式です。

リンクアグリゲーションは複数のNICを仮想的に一つとして運用する方式です。
例えば1Gbpsの回線を2本あったとして、それを仮想的に2Gbpsの回線1本で運用するかたちです。
どちらかに障害が発生した場合は、1Gbpsの回線のみに縮退して継続するかたちです。

ロードバランシングは「アクティブ、アクティブ」のかたちです。
セッションごとに使用するNICを分けて、負荷分散できます。
フォールトトレランスに比べて可用性だけでなく性能も向上できますが、設計や構成がやや複雑になる、という点があります。

ではこれらのうちどれを採用するのが最適なのか?
性能、という意味だとインクアグリゲーションやロードバランシングがいいのですが、構成やネットワーク機器によってできる・できないがあります。
また、設計の複雑さもあるので、コストの面も考慮して何を重視するのかをすり合わせて採用していく必要があります。
具体的には
・性能を重視するのか?
・コストはどこまで出せるのか(それぞれの構成のコスト比較)
・NW機器や現在の構成で対応ができるか?
などを詰めていくかたちとなります。

次にディスクですが、まず大きく分けて「内部ストレージ」「外部ストレージ」での冗長化があります。
内部ストレージの場合、RAIDという考え方があります。
詳しくは書きませんが、以下を覚えておけばとりあえず大丈夫です。

方式 内容
RAID0(ストライピング) 複数のディスクを一つの大きいディスクに見せる
RAID1(ミラーリング) 複数のディスクで冗長化
RAID0+1 ミラーリングしつつ、ストライピングで容量も大きくする。
RAID5 データ領域とパリティ領域にわかれ、1本故障してもパリティ情報から復元可能

RAID1は冗長化として性能は高いのですが、コストが高くつきます。
RAID5の場合は最低3本のディスクが必要ですが、データ領域を多く使えるため限られた予算で最大限のデータ容量を確保したい場合はこの方式が検討されます。

外部ストレージについても基本的には同様で、RAIDで複数のディスクを論理的にまとめます。
この際の仮想的に一つのディスクの単位のことをLUN(Logical Unit Number)と呼びます。

サーバーとストレージ間はSAN(Storage Area Network)を介して接続することが一般的で
・FC-SAN
・IP-SAN
の2種類があります。

ここで出てくる用語をまとめます。

用語 意味
HBA Host Bus Adapter サーバーとネットワーク機器やストレージ機器を接続するためのハードウェア
SAN Storage Area Network サーバーとストレージを結ぶ高速なネットワーク
SANスイッチ 複数のサーバーとストレージを束ねてSANを構成するためのハードウェア。FCスイッチとも呼ばれる。(FCってのはファイバーチャネルのこと)
LUN Logical Unit Number 論理的なHDDの1単位に対して割り振られる番号

構成されるそれぞれの部分で冗長化が必要になります。
じゃないとSPOFになってしまうので。。。

サーバーの冗長化

ネットワークやストレージのSPOFを無くしても、サーバー自体(OSやミドルウェアなど)で障害が発生した場合も考える必要があります。

サーバーの冗長化はクラスタリングという考え方で実現します。
クラスタリングには
・並列クラスタ
・HA(High Availability)クラスタ
の2種類があります。

並列クラスタ

同じ機能のサーバーを複数用意し、ロードバランサで処理を振り分ける方法です。
特徴としては
・複数台がActive構成
・負荷分散でのメリット
・どれか1台で障害が発生しても、ロードバランサで残りのシステムに振り分けが可能。
・順序保証が必要な処理には不向き

WEBサーバーはこのかたちが最適です。

HAクラスタ

稼働系と待機系に分けて運用する構成です。

特徴としては
・データの一意性や順序性が保障される
 →DBサーバーやファイル連携サーバーなどはこちらの方が適している。

HAクラスタは仮想化製品(VShereやHyper-Vなど)でも使われています。
例えば
物理サーバーA
物理サーバーB
ディスクアレイ
という構成でサーバーA、Bにハイパーバイザを入れて仮想マシンを運用しているとしましょう。」

その場合、物理サーバーAで障害が発生した場合、サーバーAで動いていた仮想マシンは自動的にサーバーBに動かすことが可能です。
これはディスクアレイに仮想マシンの仮想的なHDDが保存されている後世のため、実現できる方式です。

この辺りは仮想化製品によっても仕様が異なってくるので、予備調査は実施する必要があります。

まとめ

ここまで可用性の基本的な考え方について書いてきました。
感想としては、可用性を高めるにはSPOFは無くしたい、そうなるとコストはかかるなぁという印象です。
お金に糸目を付けないのであれば、全部いい感じにやってよ、となるのですが
実際には可用性をどこまで求めるのかは、システムごとに異なります。
なので、システムごとの可用性を判断できるような指標、チェックシート的なものを用意して
この可用性であればこういう構成、といったメニュー化ができるのがいいなと思いました。

ここまでいろいろ書いてきましたが、間違っていることも多いかと思いますので、気づいた方はコメント頂けるとありがたいです。

参考資料

インフラ設計のセオリー