前書き
DigitalOceanロードバランサーは、複数のバックエンドサーバー間でHTTP、HTTPS、およびTCPトラフィックを分散する簡単な方法です。 このチュートリアルでは、doctl
(DigitalOceanのAPIの公式コマンドラインクライアント)を使用して、複数のバックエンドWebサーバーのロードバランサーを作成および構成します。
前提条件
このチュートリアルを開始する前に、doctl
とDigitalOceanロードバランサーについて理解しておく必要があります。 次の記事が役立ちます。
続行する前に、doctl
バージョン1.6.0以降がインストールおよび認証されていることを確認する必要があります。 doctl version
を実行して、doctl
のバージョンを確認します。 また、DigitalOceanアカウントにSSHキーを追加する必要があります。
[[step-1 -—- setting-up-the-backend-web-servers]] ==ステップ1—バックエンドWebサーバーのセットアップ
まず、doctl
を使用して、ロードバランサーがトラフィックを転送する2つのWebサーバーを作成します。 LAMPスタック(Linux、Apache、MySQL、PHP)がプリインストールされている2つのサーバーから始め、それぞれが固有のWebページを提供するように更新します。 これにより、ロードバランサーが実際に複数のサーバー間で接続を分散していることを確認できます。
2つのサーバーを作成するには、最初にそれらのサーバーを配置するリージョンと、使用するSSHキーのフィンガープリントを知る必要があります。 このチュートリアルでは、nyc1領域を使用します。 すべてのリージョンとその短縮されたスラッグをdoctl
で一覧表示できます。
doctl compute region list
OutputSlug Name Available
nyc1 New York 1 true
sfo1 San Francisco 1 true
nyc2 New York 2 true
ams2 Amsterdam 2 true
sgp1 Singapore 1 true
lon1 London 1 true
nyc3 New York 3 true
ams3 Amsterdam 3 true
fra1 Frankfurt 1 true
tor1 Toronto 1 true
sfo2 San Francisco 2 true
blr1 Bangalore 1 true
使用する地域に応じてスラッグを選択します。
[.note]#Note:ロードバランサーとそのターゲットドロップレットはすべて同じリージョンにある必要があります。
#
SSHキーの指紋を見つけるには、もう一度doctl
を使用します。
doctl compute ssh-key list
OutputID Name FingerPrint
7738555 sammy@host your_ssh_key_fingerprint
出力で、使用するSSHキーのフィンガープリントに注意してください。 次のコマンドで必要になります。
Ubuntu 16.04を実行するワンクリックLAMPスタックイメージを使用し、これを512MBのドロップレットに配置します。 画像と液滴サイズに使用できるさまざまなオプションは、list
コマンドを使用して、doctl
でも一覧表示できます。 これについての詳細は、前提条件の記事のCreating, Deleting, and Inspecting Droplets sectionで読むことができます。
すべての情報が揃ったので、1つのコマンドで2つのサーバーを作成できます。
doctl compute droplet create web-1 web-2 \
--region nyc1 \
--image lamp-16-04 \
--ssh-keys your_ssh_key_fingerprint \
--enable-private-networking \
--size 512mb
web-1
とweb-2
がサーバーの名前になります。 --enable-private-networking
も選択しました。 これにより、ロードバランサーからターゲットドロップレットへのトラフィックは、DigitalOceanの未測定のプライベートネットワークにとどまります。
create
コマンドは、新しいドロップレットに関する情報を出力します。
OutputID Name Public IPv4 Private IPv4 Public IPv6 Memory VCPUs Disk Region Image Status Tags
48463543 web-1 512 1 20 nyc1 Ubuntu LAMP on 16.04 new
48463544 web-2 512 1 20 nyc1 Ubuntu LAMP on 16.04 new
2つのサーバーが現在プロビジョニングされています。 プロセスが完了するまで数分待ってから、Webドロップレットをリストします。
doctl compute droplet list web-*
list
コマンドは、*
ワイルドカード文字を受け入れます。 この場合、名前に少なくともweb-
が含まれるドロップレットのみが表示されます。
OutputID Name Public IPv4 Private IPv4 Public IPv6 Memory VCPUs Disk Region Image Status Tags
48603683 web-1 111.111.111.111 111.111.111.333 512 1 20 nyc1 Ubuntu LAMP on 16.04 active
48603684 web-2 111.111.111.222 111.111.111.444 512 1 20 nyc1 Ubuntu LAMP on 16.04 active
ドロップレットにIPv4アドレスが割り当てられ、active
としてリストされていることに注意してください。 WebブラウザでDropletsのいずれかのパブリックアドレスに移動すると、デフォルトのApacheプレースホルダーページが読み込まれます。 それぞれに新しい一意のページを追加して、web-1とweb-2を区別できるようにします。
doctl
を介してサーバーにSSHで接続できます。
doctl compute ssh web-1
これにより、作成時に指定したSSHキーを使用して接続し、rootとしてログインします。 サーバーで新しいHTMLファイルを開きます。 nano
テキストエディタを使用します。
nano /var/www/html/test.html
次のHTMLスニペットに貼り付けます。
/var/www/html/test.html
Hello from web-1!
ファイルを保存し、テキストエディターを終了します。 これは完全なHTMLファイルではありませんが、ブラウザは寛容であり、目的には十分です。
次のアドレスに移動して、新しいページが適切に配信されていることを確認します。 強調表示された部分を正しいIPに置き換えてください:
http://web-1_public_ip_address/test.html
このページに、作成したばかりの見出しHello from web-1!が表示されます。
SSHセッションを終了します。
exit
次に、2番目のサーバーにSSHで接続し、HTMLページで別のメッセージを使用してプロセスを繰り返します。
doctl compute ssh web-2
新しいHTMLファイルを開きます。
nano /var/www/html/test.html
コンテンツに貼り付けます:
/var/www/html/test.html
Hello from web-2!
テキストエディターを保存して終了し、SSHセッションを終了します。
exit
ブラウザを使用して、web-2が新しいWebページも適切に提供していることを確認します。 その場合、2台のサーバー間で負荷を分散するロードバランサーを作成する準備が整いました。
[[step-2 -—- creating-a-load-balancer]] ==ステップ2—ロードバランサーの作成
nyc1領域に新しいロードバランサーを作成します。 ロードバランサーとそのターゲットドロップレットは同じ領域にある必要があるため、ドロップレットが配置されている領域を使用するようにしてください。
doctl compute load-balancer create \
--name load-balancer-1 \
--region nyc1 \
--forwarding-rules entry_protocol:http,entry_port:80,target_protocol:http,target_port:80
このコマンドは、nyc1
領域にload-balancer-1
という名前のロードバランサーを作成します。 各ロードバランサーには、--forwarding-rules
フラグの下に少なくとも1つのルールが必要です。 これらのルールは、ロードバランサーがトラフィックを受け入れる方法と、トラフィックをターゲットに転送する方法を記述します。 上記の転送ルールは、ポート80のHTTPトラフィックをターゲットサーバーに直接渡すことを示しています。
他の--forwarding-rules
プロトコルオプションはhttps
とtcp
であり、エントリとターゲットの両方に有効なポートを選択できます。 複数の転送ルールを指定する必要がある場合は、ルールのリスト全体を引用符で囲み、各ルールの間にスペースを使用します。 HTTPとHTTPSの両方の転送を有効にする例は次のとおりです。
--forwarding-rules "entry_protocol:http,entry_port:80,target_protocol:http,target_port:80 entry_protocol:https,entry_port:443,target_protocol:https,target_port:443"
実行したばかりのcreate
コマンドは、新しいロードバランサーに関する情報を出力します。
OutputID IP Name Status Created At Algorithm Region Tag Droplet IDs SSL Sticky Sessions Health Check Forwarding Rules
ae3fa042-bfd2-5e94-b564-c352fc6874ef load-balancer-1 new 2017-05-10T19:28:30Z round_robin nyc1 false type:none,cookie_name:,cookie_ttl_seconds:0 protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3 entry_protocol:http,entry_port:80,target_protocol:http,target_port:80,certificate_id:,tls_passthrough:false
上記のハイライトされたロードバランサーのIDをメモします。これは、次のステップでターゲットドロップレットを追加するために使用します。 ヘルスチェックルールやスティッキーセッションなど、設定しなかったデフォルトの設定に関する情報もあります。 これらのオプションの詳細については、prerequisite load balancer articleを参照してください。 doctl
を使用してこれらのオプションを設定する方法の詳細を確認するには、--help
フラグを指定してcreate
コマンドをいつでも実行できます。 ロードバランサーの作成の場合、次のようになります。
doctl compute load-balancer create --help
これにより、使用可能なすべてのコマンドラインフラグとオプションのリストが出力されます。 この--help
フラグは、任意のdoctl
コマンドで使用できます。
ロードバランサーが作成されたので、ターゲットのドロップレットを追加する必要があります。 次のセクションでそれを行います。
[[step-3 -–- adding-droplets-to-the-load-balancer]] ==ステップ3–ドロップレットをロードバランサーに追加する
2つのDropletの情報をもう一度リストして、IDを取得できるようにします。
doctl compute droplet list web-*
OutputID Name Public IPv4 Private IPv4 Public IPv6 Memory VCPUs Disk Region Image Status Tags
48603683 web-1 111.111.111.111 111.111.111.333 512 1 20 nyc1 Ubuntu LAMP on 16.04 active
48603684 web-2 111.111.111.222 111.111.111.444 512 1 20 nyc1 Ubuntu LAMP on 16.04 active
上記の出力例では、IDが強調表示されています。 Be sure to use your actual IDs, not the examples.
次に、add-droplets
コマンドを使用して、ターゲットドロップレットをロードバランサーに追加します。 前の手順で作成したロードバランサーのIDを指定します。
doctl compute load-balancer add-droplets
ae3fa042-bfd1-4e94-b564-c352fc6874ef \
--droplet-ids 48463543,48463544
これで、get
コマンドを使用して、ロードバランサーの更新された情報を取得できます。
doctl compute load-balancer get ae3fa042-bfd1-4e94-b564-c352fc6874ef
OutputID IP Name Status Created At Algorithm Region Tag Droplet IDs SSL Sticky Sessions Health Check Forwarding Rules
ae3fa042-bfd1-4e94-b564-c352fc6874ef 111.111.111.555 load-balancer-1 active 2017-05-10T19:28:30Z round_robin nyc1 48603683,48603684 false type:none,cookie_name:,cookie_ttl_seconds:0 protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3 entry_protocol:http,entry_port:80,target_protocol:http,target_port:80,certificate_id:,tls_passthrough:false
ステータスがactive
になり、IPが割り当てられ、ターゲットの液滴がリストされていることに注意してください。 ブラウザでこの新しい負荷分散IPに移動し、test.html
ページを再度ロードします。 URLは次のようになります。
http://load-balancer-1_ip_address/test.html
ブラウザは、web-1またはweb-2のいずれかからメッセージをロードします。 ページを更新すると、他のサーバーのメッセージが表示されます。 ロードバランサーはround robinモードです。つまり、リクエストごとにリストの次のドロップレットに接続を送信します。 別の方法はleast connectionsモードで、ロードバランサーはアクティブな接続が最も少ないターゲットに新しいトラフィックを送信します。
Load Balancerが機能していることがわかったので、サーバーを無効にして、中断の処理方法を見てみましょう。
[[step-4 -–- testing-fail-over]] ==ステップ4–フェイルオーバーのテスト
ロードバランサーの大きな利点の1つは、個々のバックエンドWebサーバーの問題に対する耐性が向上することです。 Load Balancerは、事前に定義された間隔(デフォルトでは10秒ごと)でヘルスチェックを実行します。 デフォルトのヘルスチェックでは、ターゲットサーバー上のWebページを取得します。 このチェックが連続して数回失敗すると、ターゲットはローテーションから除外され、回復するまでトラフィックは送信されません。
ヘルスチェックに失敗してフェイルオーバー機能をテストしましょう。 SSHでweb-2に戻します:
doctl compute ssh web-2
次に、Apache Webサーバーをシャットダウンします。
systemctl stop apache2
ブラウザに戻って、負荷分散されたページを数回更新します。 最初は、いくつかの503 Service Unavailableエラーが発生する可能性があります。 デフォルトでは、Load Balancerは、プールからサーバーを削除する前に、3つのヘルスチェックが失敗するのを待ちます。 これには約30秒かかります。 その後、web-1からの応答のみが表示されます。
web-2でApacheバックアップを開始します。
systemctl start apache2
この場合も、しばらくすると、ロードバランサーはweb-2が稼働していることを検出し、プールに追加されます。 ページを更新すると、web-2の応答が表示されるようになります。
これで、ロードバランサーは完全な状態に戻りました。
Load Balancerを実稼働に対応させるために実行できる次の手順をお読みください。
結論
このチュートリアルでは、doctl
を使用してDigitalOceanロードバランサーといくつかのバックエンドウェブサーバーを作成し、バックエンドサーバーにHTTPトラフィックを送信するようにロードバランサーを構成し、ロードバランサーのヘルスチェック機能をテストしました。 Load Balancerを実動用に準備するために実行できるステップがいくつかあります。
-
ロードバランサーでドメイン名を指定すると、ユーザーがわかりにくいIPアドレスを入力することがなくなります。 チュートリアルHow To Set Up a Host Name with DigitalOceanでそれを行う方法を学ぶことができます。
-
DigitalOceanを使用すると、ドロップレットにタグを付けることができるため、ドロップレットを整理し、ドロップレットのセット全体をグループとして扱うことができます。 ドロップレットを個別に追加する代わりに、特定のタグ内のすべてのドロップレットにトラフィックを送信するようにロードバランサーを構成できます。 これにより、新しいバックエンドサーバーをより動的にプールに追加できます。 DigitalOceanタグについてはHow To Tag DigitalOcean Dropletsで学ぶことができます。
-
負荷分散されたWebサイトにHTTPSセキュリティを追加する必要がある場合は、これを実現する2つの異なる方法(SSL passthroughとSSL termination)に関するチュートリアルがあります。