Azure Load Balancerで高可用性Webシステムを構築!冗長化の手順を完全解説
生徒
「最近、Webサイトがアクセス集中で止まらないか心配なんです。サーバーを2台に増やせば安心ですか?」
先生
「サーバーを増やすのは良い判断ですね!ただ、2台あるサーバーにうまくアクセスを振り分ける仕組みが必要です。そこで登場するのがAzure Load Balancer(アジュール・ロードバランサー)ですよ。」
生徒
「ロードバランサー…聞いたことはありますが、具体的にどうやって設定すればいいんでしょうか?」
先生
「高可用性(こうかようせい)を実現するための冗長化(じょうちょうか)の手順を、初心者の方にもわかりやすくステップバイステップで解説しますね!」
1. Azure Load Balancerとは?負荷分散の基本
Azure Load Balancer(アジュール・ロードバランサー)とは、Microsoftが提供するクラウドサービス「Azure」における負荷分散装置(ふかぶんさんそうち)のことです。インターネットから届くたくさんのアクセスを、後ろに控えている複数の仮想(かそう)マシンに効率よく割り振る役割を持っています。
例えば、1台のサーバーだけでWebサイトを運営していると、そのサーバーが故障した瞬間にサイトは見られなくなってしまいます。これを専門用語で「単一障害点(たんいつしょうがいてん)」と呼びます。Azure Load Balancerを使って複数のサーバーに処理を分散させることで、1台が止まっても他のサーバーが処理を引き継げるようになります。この仕組みを冗長化(じょうちょうか)、そして止まりにくいシステムの状態を高可用性(こうかようせい)と呼びます。
歴史的には、昔は高価な専用ハードウェアを購入して設定していましたが、現代のクラウド時代では数クリックで強力な負荷分散システムを構築できるようになりました。まさにエンジニアの強い味方ですね。
2. 高可用性を実現するための事前準備
まずは、負荷分散の対象となる「サーバー」を準備しましょう。Azureでは「Virtual Machine(バーチャル・マシン:仮想マシン)」を作成します。ポイントは、同じ役割を持つサーバーを2台以上用意することです。これらを「バックエンドプール」というグループにまとめます。
また、これらのサーバーを可用性セット(かようせいセット)または可用性ゾーンに配置することが重要です。これは、物理的な故障やメンテナンスが同時に起きないように、Azure側でサーバーの置き場所を分散してくれる機能です。この設定を忘れると、せっかく冗長化しても「同じ電源を使っていたから同時に落ちた」という悲劇が起こりかねません。
まずは、サーバーを識別するための情報を整理しましょう。以下は、今回構築する環境のイメージデータです。
サーバーID | サーバー名 | 役割 | 内部IPアドレス
-----------+--------------+----------------+---------------
1 | Web-Server-01| メインWebサーバー| 10.0.0.4
2 | Web-Server-02| 予備Webサーバー | 10.0.0.5
3 | DB-Server-01 | データベース | 10.0.0.6
3. Azure Load Balancerの作成手順
それでは、実際にAzureポータルからロードバランサーを作成していきましょう。主な設定項目は以下の通りです。
- 基本設定:リソースグループを選択し、名前を付けます。
- フロントエンドIP構成:ユーザーがアクセスするための窓口となるIPアドレス(公開IPアドレス)を設定します。
- バックエンドプール:アクセスを転送する先のサーバー(先ほど作った2台のVM)を登録します。
作成時には「SKU(エスキュー)」という種類を選びます。「Basic」と「Standard」がありますが、本番環境で高い信頼性を求めるなら「Standard」を選ぶのが一般的です。Standardはセキュリティがより強固で、複雑なネットワーク構成にも対応しています。
4. 正常性を確認するヘルスプローブの設定
ロードバランサーは、ただ闇雲にデータを投げるだけではありません。「後ろのサーバーは元気に動いているかな?」と常に確認しています。この監視機能をヘルスプローブと呼びます。
もし、1台のサーバーがフリーズしてしまった場合、ヘルスプローブが異常を検知し、そのサーバーへのアクセスを自動的に遮断(しゃだん)してくれます。その間、アクセスは正常なもう片方のサーバーだけに送られるため、利用者はトラブルに気づくことなくサイトを使い続けることができます。
以下は、サーバーの状態をチェックするための簡単な監視ログのイメージです。
時刻 | サーバー名 | ステータス | 応答時間
--------------------+--------------+------------+---------
2026-03-30 10:00:01 | Web-Server-01| 健康 (UP) | 10ms
2026-03-30 10:00:02 | Web-Server-02| 健康 (UP) | 12ms
2026-03-30 10:01:00 | Web-Server-01| 異常 (DOWN)| タイムアウト
5. 負荷分散ルールの作成とポート設定
次に「どのポートに届いた通信を、どのポートへ転送するか」という負荷分散ルールを決めます。Webサイトの場合、一般的にはHTTP(80番ポート)やHTTPS(443番ポート)を使用します。
ここで「セッション永続性(えいぞくせい)」という設定も重要です。これは、一度特定のサーバーにつながったユーザーを、一定時間は同じサーバーに繋ぎ続ける仕組みです。ショッピングカートの情報などがサーバーごとに保存されている場合に役立ちますが、最近のモダンな設計ではどのサーバーに繋がっても大丈夫なように作ることが推奨されています。
ネットワークの疎通確認を行うために、Linuxサーバー側でポートの待機状態を確認するコマンドを覚えておくと便利です。
netstat -ant | grep LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
6. 仮想マシンのWebサーバー設定(Apache/Nginx)
ロードバランサーの設定が終わったら、受け皿となるサーバー側の準備をします。Linux(リナックス)であれば、Apache(アパッチ)やNginx(エンジンエックス)といったソフトウェアをインストールして、Webページを表示できるようにします。
2台のサーバーで全く同じコンテンツを表示させる必要があります。ここでは、練習として簡単なHTMLを表示させる設定をしてみましょう。以下のコマンドは、サーバーにログインしてWebサーバーを起動する例です。
sudo systemctl start httpd
sudo systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
これでサーバーがWebのリクエストを受け付ける準備が整いました。ロードバランサー経由でこの画面が表示されれば成功です。
7. C#で動作確認用の簡易ツールを作成する
ロードバランサーが正しく動作しているか、何度もアクセスして確認するのは大変ですよね。そこで、C#を使って、Webサイトに連続でリクエストを送り、どのサーバーから応答があったかを表示する簡単なコンソールアプリを作ってみましょう。
このプログラムを実行すると、ロードバランサーが交互にサーバーを切り替えている様子が視覚的にわかります。
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
using var client = new HttpClient();
string url = "http://あなたのロードバランサーのIP/";
for (int i = 1; i <= 5; i++)
{
var response = await client.GetStringAsync(url);
Console.WriteLine($"{i}回目のアクセス結果:");
// 応答内容の一部(サーバー名など)を表示
Console.WriteLine(response.Substring(0, 30));
await Task.Delay(1000);
}
}
}
実行結果は以下のようになります。応答内容に含まれるサーバー名が変化していれば、負荷分散が成功している証拠です。
1回目のアクセス結果:
Welcome from Web-Server-01...
2回目のアクセス結果:
Welcome from Web-Server-02...
3回目のアクセス結果:
Welcome from Web-Server-01...
8. データベースの冗長化と連携の考え方
Webサーバー(フロントエンド)が冗長化できたら、次はデータベース(バックエンド)のことも考えなければなりません。Webサーバーを2台に増やしても、データベースが1台きりで、そこが故障してしまったらシステム全体が止まってしまいます。
Azureでは「Azure SQL Database」などのサービスを使うことで、データベース自体の高可用性を簡単に確保できます。プログラムからデータベースに接続する際は、接続文字列(コネクションストリング)を正しく設定しましょう。SQLでユーザー情報を取得する際の基本的なコード例を確認しておきます。
SELECT user_id, user_name, last_login
FROM m_users
WHERE is_active = 1
ORDER BY last_login DESC;
Webサーバーが複数あっても、全てのサーバーがこの一元化されたデータベースを参照するように構築するのが基本の形です。これにより、データの整合性(せいごうせい)を保ちながら、システム全体の耐久力を高めることができます。
9. 構築後のテストと運用時の注意点
最後に、必ず「片方のサーバーをわざと止める」というテストを行ってください。これを切り退きテストと呼びます。1台をシャットダウンしても、サービスが継続して利用できることを確認して初めて、高可用性システムが完成したと言えます。
また、Azure Load Balancer自体のログ(診断ログ)を有効にしておくことも重要です。どのタイミングでヘルスチェックに失敗したのか、どのくらいのトラフィックが流れているのかを可視化することで、将来のトラブル解決や負荷予測に役立てることができます。クラウドは作って終わりではなく、育てていくものなのです。
これで、Azure Load Balancerを使った冗長化の全手順の解説を終わります。一見難しそうに見えますが、一つ一つのステップを確実に進めれば、初心者の方でも必ず堅牢(けんろう)なシステムを構築できますよ!
まとめ
ここまで、Azure Load Balancer(アジュール・ロードバランサー)を活用して、高可用性(こうかようせい)なWebシステムを構築するための具体的な手順と、冗長化(じょうちょうか)の本質について詳しく解説してきました。クラウドネイティブな時代において、サーバー1台のみでサービスを運用することは、単一障害点(たんいつしょうがいてん)という大きなリスクを抱えることを意味します。アジュールの負荷分散装置を導入することで、トラフィックを適切に複数の仮想マシンへ振り分け、万が一の故障時にもサービスを継続できる強固なインフラを手に入れることが可能になります。
本記事の重要ポイントを振り返ると、まずは「可用性セット」や「可用性ゾーン」を利用して、物理的な障害からサーバーを保護する配置を行うことが大前提となります。その上で、ロードバランサーの「フロントエンドIP」でユーザーの窓口を作り、「バックエンドプール」で実際の処理を担うサーバー群をグループ化します。そして、システムの信頼性を支える要となるのが「ヘルスプローブ」です。この監視機能が正常に動作していなければ、故障したサーバーにアクセスを送り続けてしまうため、適切な設定と動作確認が欠かせません。
また、実務レベルでは、Webサーバー層だけでなくデータベース層の冗長化もセットで考える必要があります。SQLデータベースの接続文字列を適切に管理し、どのWebサーバーからアクセスしても同じデータが参照できる整合性(せいごうせい)を保つ設計が、真の高可用性を実現します。最後に実施する「切り退きテスト」は、理論上の設定が正しく機能するかを証明する最後の砦です。わざと1台を停止させ、ロードバランサーが瞬時に切り替わる様子を確認して初めて、自信を持って本番運用へと進むことができます。
実践的な振り返り:システム構成の確認
構築した環境が正しくデータ連携できているか、データベースのレコード状態を例に確認してみましょう。負荷分散されたWebサーバー群が参照する、統合されたユーザー情報のテーブルイメージです。
user_id | login_name | status | last_access_ip
--------+-------------+---------+----------------
101 | 開発者太郎 | 有効 | 10.0.0.4
102 | 運用花子 | 有効 | 10.0.0.5
103 | テスト次郎 | 停止中 | 10.0.0.4
104 | 管理者三郎 | 有効 | 10.0.0.5
このように、複数のサーバー(10.0.0.4や10.0.0.5)からアクセスがあっても、データベース側で一元管理されていれば、ユーザーはどのサーバーに繋がっても同じ体験ができます。この整合性を維持するためのSQLクエリも、バックエンド開発では頻繁に使用されます。
/* アクティブなユーザーのアクセスログを抽出するSQL */
SELECT
user_id,
login_name,
last_access_ip
FROM
m_user_status
WHERE
status = '有効'
ORDER BY
user_id ASC;
運用で役立つシェルスクリプトと監視
実際の運用現場では、ロードバランサーの設定変更後に、各Webサーバーのネットワーク状態をLinuxコマンドで迅速に確認するスキルが求められます。特にポートの開放状況や、外部からの接続待ち(LISTEN)状態を把握することは、トラブルシューティングの基本です。
# HTTPポートの待機状態とプロセスIDを確認
sudo lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 1234 root 4u IPv6 12345 0t0 TCP *:http (LISTEN)
Azure Load Balancerは、単なる転送装置ではなく、クラウドインフラ全体の「司令塔」としての役割を担っています。標準(Standard)SKUを選択することで、より高度なメトリック監視や、ネットワークセキュリティグループ(NSG)との連携による強固な防御も可能になります。これからエンジニアを目指す方も、すでに現場で活躍されている方も、この冗長化の技術をマスターすることで、ユーザーにとって「当たり前に繋がる」安心なサービスを提供できるようになるはずです。
生徒
「先生、ありがとうございました!ロードバランサーがあるおかげで、1台のサーバーが壊れてもサイトが止まらない理由がよくわかりました。ヘルスプローブが自動で見張ってくれているのは本当に心強いですね。」
先生
「その通りです!単にアクセスを分けるだけでなく、『健康状態をチェックして、ダメなところには送らない』という賢さがアジュールの特徴なんです。構築してみて、何か気づいたことはありますか?」
生徒
「はい、C#で書いたチェックツールを動かしたとき、アクセスするたびに応答するサーバー名が変わるのが面白かったです。まるで手品みたいに綺麗に振り分けられていました!」
先生
「良いところに気づきましたね。あの動作こそが負荷分散の証拠です。実際の現場では、アクセスが数万件になってもあのようにスムーズに処理が流れていくんですよ。次は、データベースの冗長化についても深掘りしていきましょうか。」
生徒
「はい!SQLを使ってデータを一元管理する大切さも学んだので、もっと複雑な構成にも挑戦してみたいです。止まらないシステムを作るのって、パズルを完成させるような達成感がありますね!」
先生
「素晴らしい意気込みです!高可用性はインフラ設計の華ですから、しっかり自分のスキルにしていきましょう。何かわからないことがあれば、いつでも聞いてくださいね。」