システムの可用性についてHAクラスタで出来ること

最近、"HAクラスタソフト を使用して DB サーバをクラスタ構成にする" という機会があったので、そもそも何で HAクラスタソフト をシステムに導入するんだっけ？ から振り返ってみようと思います。
(ちなみに、HAクラスタソフトは Pacemaker を使いました)

# そもそもシステムって
## 動かないと困るんです
基幹系システムから ECサイトまで、世の中のシステムが常に動くのはもはや当たり前のようになっています。  
障害が発生しシステムが予期せず止まってしまうと、[__経済損失__](http://www.ipa.go.jp/files/000026797.pdf)はおろか、__人命に関わる__ 事態を引き起こしてしまうことがあります。

## 安定して動かすために
上記のような事態を引き起こさないために、安定して動くシステムを構築する必要があります。  
そこで[非機能要求](http://www.ipa.go.jp/sec/softwareengineering/std/ent03-b.html)の 1 つである __可用性__ を実現する必要があります。

可用性はシステムが障害に強く、安定して稼働する能力のことであり、__稼働率__ で数値表現することが出来ます。

```math
稼働率 A = \frac{MTBF (動作可能時間)}{MTBF + MTTR (動作不能時間)} 
```

稼働率と対応するシステム例を以下に示します。(※)システム例はあくまで目安です。

|稼働率|許容停止時間 (年間)|システム例|
|:-:|:-:|:--|
|100%|0 分 (30秒)|人命に関わるシステム|
|99.999%|5 分|電気、水道などのインフラ系|
|99.99%|53 分|金融、保険|
|99.90%|8.8時間|メール|
|99.00%|3.6日|商用でない社内システム|


## 可用性を実現するために

システムに要求される可用性を実現するためには色々な方法があります。

* RAID
* ロードバランサ
* レプリケーション
* クラスタリング (HAクラスタ)

上記の中から、構築の対象とした **HAクラスタ** について当記事で紹介します。
(※) HA : High Availability

# HAクラスタ
## 概要
クラスタとは、__複数の PC__ をネットワークで接続して、__1 つの PC のように振る舞う__仕組みのことです。

中でも HAクラスタでは、複数の PC を以下の 2 つに分けて稼働させます。

* __現用系 (Master)__ : サービスが起動している
* __待機系 (Slave)__ : サービスが起動せず待機している


## 何が出来るか
クラスタ構成にした PC に HAクラスタソフトを導入しすることで、現用系で障害が発生した場合に**素早く・正確にシステムを復旧する**ことが出来ます。

* 現用系サービスの再起動による復旧
* サービス起動主体の、待機系への切替えによる復旧 (フェールオーバー)

HAクラスタソフトの導入により __稼働率約 99.99 %__、__復旧時間約 53 分__ のシステムを構築出来ると言われています。


## どうして復旧できるか
HAクラスタソフトは、PC 内の様々なサービスが正常に稼働しているかを常に監視しています。
加えて、ソフトがインストールされている PC(ノード) 間で通信を行い、以下を確認しています。

* 監視対象の__障害発生有無__
* 接続されている__ノードの生死__

これより、監視対象のサービスまたは各ノードで発生した障害をリアルタイムに検知し、復旧対応をとることが出来ます。

以下に HAクラスタソフトで監視することが出来るサービス例を示します。
なお、クラスタソフトによっては自分で監視対象をカスタムすることも出来ます。

1. ネットワーク監視
2. アプリケーション・ミドルウェア監視
3. OS 機能監視
4. ディスク監視
5. ノード (自己・他者間) 監視



![HAクラスタ監視対象.png](https://qiita-image-store.s3.amazonaws.com/0/147552/7ec4c9e9-0c06-0d20-2847-fbbe88e3914c.png)



以上より、HAクラスタで実現できることを説明しました。最後に、HAクラスタの組み方にはどういったパターンがあるかを紹介します。

# HAクラスタ の組み方
HAクラスタの組み方は、「ディスク構成」 × 「Master / Slave のサービス構成」で決まります。

どの構成を選択するかは、実行処理の負荷、トランザクション管理、データの引継ぎなどに考慮した上で、システム要件に沿って決める必要があります。

## ディスク構成
ディスク構成は、主に「シェアード構成」「シェアード・ナッシング構成」の 2 つに分類出来ます。


![HAクラスタ構成.png](https://qiita-image-store.s3.amazonaws.com/0/147552/13e89da6-d987-6c21-2628-7a813a60572b.png)


|構成|特徴|注意点|
|:--|:--|:--|
|シェアード構成|Master/Slave 間で共有ディスクを利用|共有ディスクが __単一障害点__とならない設計にする|
|シェアード・ナッシング構成|Master と Slave でデータをレプリケーションする|レプリケーションで__データ損失__が発生しない設計にする|

## サービス構成
Master / Slave のサービス構成は、主に「Active/Standby」「Active/Active」「N : 1」「N : M」の 4 つに分類出来ます。



![MasterSlave構成.png](https://qiita-image-store.s3.amazonaws.com/0/147552/4a1d7b6f-1042-7b69-310a-e4c2a56a9a21.png)


|構成|特徴|注意点|
|:--|:--|:--|
|Active/Standby|1 台ずつ Master/Slave があり、全サービスが Master で起動|1 台の Master で全サービスが起動することの**負荷**|
|Active/Active|1 台ずつある Master/Slave それぞれで異なるサービスが起動|サービス間の**データ引継ぎ**や**トランザクション管理**|
|N : 1|複数台の Master に分散してサービスが起動|同上|
|N : M|それぞれ複数台ある Master/Slave に異なるサービスが分散して起動|同上(より複雑化)|



# おわりに
当記事では以下を紹介しました。

* システムが動かない影響と対策
* 可用性を実現するための HAクラスタで出来ること
* HAクラスタの組み方

可用性(の中でも HAクラスタ)に話を絞りましたが、システム構成を考える上では他にも性能、セキュリティ etc... 実現しなければいけない要件が沢山あり、難しいですが面白いですね。

## 参考
* [Pacemaker \- ClusterLabs](https://wiki.clusterlabs.org/wiki/Pacemaker)
* [1\.4\. Pacemaker Architecture](http://clusterlabs.org/doc/en-US/Pacemaker/1.0/html/Pacemaker_Explained/s-intro-architecture.html)
* [Pacemakerの概要 « Linux\-HA Japan](http://linux-ha.osdn.jp/wp/manual/pacemaker_outline)
* [第1回　Pacemakerの歴史を見てみよう！：Pacemakerでかんたんクラスタリング体験してみよう！｜gihyo\.jp … 技術評論社](http://gihyo.jp/admin/serial/01/pacemaker/0001)
* [HAクラスターの仕組みとポイント \| サイオステクノロジー株式会社](http://sios.jp/products/lkdk/ha-cluster/structure.html)
* [Novell Doc: High Availability ガイド \- アーキテクチャ](https://www.novell.com/ja-jp/documentation/sle_ha/book_sleha/data/sec_ha_architecture.html)