さくらのクラウドでロードバランサを使ってみる(2)

##VIP追加
前回まででロードバランサの作成は完了しているのでサービスに利用するVIPを追加します。

![ロードバランサ(VIP設定).png](https://qiita-image-store.s3.amazonaws.com/0/140995/1635db81-fb04-141e-f797-7c07d58db8dc.png)

VIP設定画面で「+追加」ボタンをクリックします。

![ロードバランサ(VIP追加).png](https://qiita-image-store.s3.amazonaws.com/0/140995/667b9609-6f7a-010a-cb23-b775de78d1ff.png)

VIPの追加ダイアログが表示されるので適切に入力していきます。
「VIPアドレス」は実際にサービスに利用するIPで、WEBサービスであればDNSサーバに登録するIPといえます。
ルータなしのスイッチでロードバランサを利用している場合はローカルIPで問題ありません。

「ポート番号」はサービスに利用するポートでhttpであれば80になり、httpsでは443です。
サービスに応じて適切に入力します。

「チェック間隔」は後で登録する実サーバの死活監視間隔になります。
短すぎると余計な負荷になり、長すぎるとサービス停止の検出が遅くなるので提供するサービスの内容に応じて適切に決定します。
あとで変更出来るのでデフォルトの10秒で様子を見て必要に応じて変更するのがお勧めです。

「ソーリーサーバ」は実サーバがすべて応答しなくなった場合にリクエストを投げる先になります。
どんな場合でも適切なサービスダウン応答が返せるサーバにする必要があります。

![ロードバランサ(VIP追加IP).png](https://qiita-image-store.s3.amazonaws.com/0/140995/bbe42108-9c17-372e-20b2-0c939290ec71.png)

今回はVIPアドレスとして「スイッチ+ルータ」に割り当てられたIPで未利用のものを使います。
「作成」ボタンをクリックした後、「反映」ボタンをクリックしたら完了です。

##VIPの確認
VIPの追加が終わるとロードバランサに新しいタブが追加されます。

![ロードバランサ(実サーバ設定).png](https://qiita-image-store.s3.amazonaws.com/0/140995/f8309ecb-9cd0-8712-b545-87133139b609.png)

ここに実サーバを追加することでロードバランサとして機能します。
今回はまだ実サーバを作成していないので使えるIPを整理してから作成したいと思います。

##使えるIPの確認
作業前に整理しておくべきものですが、改めて「スイッチ+ルータ」に割り当てられたIPと利用状況を確認します。
※このIPはあくまで仮のものです。

ネットワークアドレス：100.65.219.128/28

| IPアドレス | 利用状況 |
|:-:|:-:|
| 100.65.219.129 | ゲートウェイ |
| 100.65.219.130 | ルータ |
| 100.65.219.131 | ルータ |
| 100.65.219.132 | ロードバランサ#1 |
| 100.65.219.133 | ロードバランサ#2 |
| 100.65.219.134 | ロードバランサVIP#1 |
| 100.65.219.135 | ロードバランサソーリーサーバ  |
| 100.65.219.136 | web01(実サーバ#1) |
| 100.65.219.137 | web02(実サーバ#2)  |
| 100.65.219.138 |   |
| 100.65.219.139 |   |
| 100.65.219.140 |   |
| 100.65.219.141 |   |
| 100.65.219.142 |   |

というわけでロードバランサを利用するだけで結構な数のIPが消費されてしまいました。
※サーバを増やして負荷分散を実施するのであれば同じさくらのウェブアクセラレータなどを利用することも検討していいと思います。

##実サーバの作成
整理したので実サーバで利用するIPが確認出来ました。
[さくらのクラウドで最小構成のサーバを作成する(1)](http://qiita.com/sato-w-m/items/eae773e2e4155063f95b)
[さくらのクラウドで最小構成のサーバを作成する(2)](http://qiita.com/sato-w-m/items/a909360c81bc92575c1c)
このあたりを参考にサーバを作成しつつ、NICの設定でスイッチに接続を選択して今回ロードバランサを接続した「スイッチ+ルータ」を選択します。
![サーバ追加(NIC).png](https://qiita-image-store.s3.amazonaws.com/0/140995/65e95d23-9d49-ffc6-9cb3-2219b4f826d6.png)

するとディスクの修正でIPアドレスが選択できるようになるので先ほど確認したIPアドレスを選択します。
![サーバ追加(ディスク修正).png](https://qiita-image-store.s3.amazonaws.com/0/140995/be555d74-8d6d-e6f3-818c-031827cdfa34.png)

これで名前などを適切に設定して「+作成」ボタンをクリックすれば実サーバが作成されます。

##実サーバのループバックアドレス設定
作成後、起動したサーバにログインしてループバックアドレスなど、DSR構成として動作するように設定を行います。
この設定はサンドボックス環境では行えないので実環境で実施します。
CentOS6系の設定方法はこちらの[ロードバランサ &ndash; さくらのサポート情報](https://help.sakura.ad.jp/hc/ja/articles/206208781-%E3%83%AD%E3%83%BC%E3%83%89%E3%83%90%E3%83%A9%E3%83%B3%E3%82%B5)にコマンドレベルで詳しく記載されています。

この作業を簡単にまとめると、

- ループバックアドレス(IPv4)でARP応答しない様に設定
- ループバックアドレス(具体的にはロードバランサのVIPに設定したIPv4アドレス)を追加

というものになります。
これでクライアントからのリクエストはロードバランサ経由、サーバからのレスポンスはサーバから直接クライアントへ返ることになります。
実サーバの作成とループバックアドレス設定はロードバランサに接続する実サーバ台数分必要なので、
1台作ったらコピーするかアーカイブにしてそこから作成するのが便利です。

##実サーバをロードバランサに登録
ロードバランサで登録済のVIPタブを表示して「+追加」ボタンをクリックすると実サーバが登録出来ます。

![ロードバランサ(実サーバ追加).png](https://qiita-image-store.s3.amazonaws.com/0/140995/aec3c44e-eab3-672a-ed5b-b9db76464aee.png)

今回は1台目を以下の様に入力してみました。

![ロードバランサ(実サーバ追加).png](https://qiita-image-store.s3.amazonaws.com/0/140995/2b1d5c67-0ae7-e483-7124-62e41ab67146.png)

「監視方法」はバランシングするサービスに沿ったものにしたほうがよいはずです。
「有効/無効」は追加後にメンテナンスなどで実サーバを停止したい場合に利用すると良さそうです。

2台追加したら今回の作業は終了です。
![ロードバランサ(実サーバ追加完了).png](https://qiita-image-store.s3.amazonaws.com/0/140995/b0d40915-b7a3-39de-94f0-557377e557ee.png)
正常に動いているとこのような表示になります。
※サンドボックスではサーバが存在しなくても正常表示になるようです。

##ロードバランサが正常に動かない場合
以下の点を改めて確認すると問題点が切り分け出来るかもしれません。

- ロードバランサのVIPとDNSサーバに登録されているIPアドレスは一致しているか
- 実サーバとロードバランサが互いのIPで通信出来る状態か
- 実サーバにループバックアドレスの設定が適切に行われているか
- 実サーバのステータスがUPになっておりロードバランサから認識されているか
- ロードバランサで設定したポートとサービスポートが合っているか(httpとhttpsなど)
- 実サーバのIPに接続した場合に問題なくサービスが動いているか(今回であれば100.65.219.136,100.65.219.137)

##まとめ
実際は実サーバ側でセッション対策などを行う必要があるはずなので
1台だけでサービスしている場合、なかなか導入に踏み切れないかもしれませんが、
ソーリーサーバの設定などはロードバランサならではで、
スケールアウト前提でなくてもロードバランサを導入するメリットは多いと思います。
DNSラウンドロビンより土壇場で制御しやすいと思うのでお勧めです。