前書き
DigitalOceanロードバランサーは、複数のバックエンドサーバー間でHTTP、HTTPS、およびTCPトラフィックを分散する簡単な方法です。 このチュートリアルでは、DigitalOcean APIの公式コマンドラインクライアントである `+ doctl +`を使用して、複数のバックエンドWebサーバーのロードバランサーを作成および構成します。
前提条件
このチュートリアルを開始する前に、 `+ doctl +`とDigitalOceanロードバランサーに慣れる必要があります。 次の記事が役立ちます。
-
https://www.digitalocean.com/community/tutorials/how-to-use-doctl-the-official-digitalocean-command-line-client [公式のDigitalOceanコマンドラインクライアントであるDoctlの使用方法]
続行する前に、 `+ doctl `バージョン1.6.0以降がインストールされ、認証されていることを確認する必要があります。 ` doctl version `を実行して、 ` doctl +`バージョンを確認します。 また、DigitalOceanアカウントにSSHキーを追加する必要があります。
ステップ1-バックエンドWebサーバーのセットアップ
最初に、 `+ doctl +`を使用して、Load Balancerがトラフィックを転送する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
使用する地域に応じてスラッグを選択します。
SSHキーフィンガープリントを見つけるには、再び `+ doctl +`を使用します。
doctl compute ssh-key list
OutputID Name FingerPrint
7738555 sammy@host
出力で、使用するSSHキーのフィンガープリントに注意してください。 次のコマンドで必要になります。
Ubuntu 16.04を実行するワンクリックLAMPスタックイメージを使用し、これを512MBのドロップレットに配置します。 `+ list `コマンドを使用して、画像と液滴サイズで利用できるさまざまなオプションを ` doctl +`でリストすることもできます。 詳細については、https://www.digitalocean.com/community/tutorials/how-to-use-doctl-the-official-digitalocean-command-line-client#creating,-deleting,-and-をご覧ください。前提条件記事のinspecting-droplets [ドロップレットの作成、削除、および検査セクション]。
すべての情報が揃ったので、1つのコマンドで2つのサーバーを作成できます。
doctl compute droplet create \
--region \
--image lamp-16-04 \
--ssh-keys \
--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
512 1 20 Ubuntu LAMP on 16.04 new
512 1 20 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
512 1 20 Ubuntu LAMP on 16.04 active
512 1 20 Ubuntu LAMP on 16.04 active
ドロップレットにIPv4アドレスが割り当てられ、「+ active +」としてリストされていることに注意してください。 ウェブブラウザでDropletsのいずれかのパブリックアドレスに移動すると、デフォルトのApacheプレースホルダーページが読み込まれます。 それぞれに新しい一意のページを追加して、* web-2 とは別に web-1 *を識別できるようにします。
`+ doctl +`を介してサーバーにSSH接続できます。
doctl compute ssh
これにより、作成時に指定したSSHキーを使用して接続し、* root *としてログインします。 サーバーで新しいHTMLファイルを開きます。 `+ nano`テキストエディターを使用します。
nano /var/www/html/test.html
次のHTMLスニペットに貼り付けます。
/var/www/html/test.html
<h1 style="color:blue">Hello from !</h1>
ファイルを保存し、テキストエディターを終了します。 これは完全なHTMLファイルではありませんが、ブラウザは寛容であり、目的には十分です。
次のアドレスに移動して、新しいページが適切に配信されていることを確認します。 強調表示された部分を正しいIPに置き換えてください:
http:///test.html
このページには、作成したばかりの見出し* Hello from web-1!*が表示されます。
SSHセッションを終了します。
exit
次に、2番目のサーバーにSSHで接続し、HTMLページで別のメッセージを使用してプロセスを繰り返します。
doctl compute ssh
新しいHTMLファイルを開きます。
nano /var/www/html/test.html
コンテンツに貼り付けます:
/var/www/html/test.html
<h1 style="color: orange">Hello from !</h1>
テキストエディターを保存して終了し、SSHセッションを終了します。
exit
ブラウザを使用して、**が新しいWebページも適切に配信していることを確認します。 その場合、2台のサーバー間で負荷を分散するロードバランサーを作成する準備が整いました。
ステップ2-ロードバランサーの作成
-
nyc1 *リージョンに新しいロードバランサーを作成します。 ロードバランサーとそのターゲットドロップレットは同じ領域にある必要があるため、ドロップレットが配置されている領域を使用するようにしてください。
doctl compute load-balancer create \
--name \
--region \
--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
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をメモします。これは、次のステップでターゲットドロップレットを追加するために使用します。 ヘルスチェックルールやスティッキーセッションなど、設定しなかった一部のデフォルト構成に関する情報もあります。 これらのオプションの詳細については、https://www.digitalocean.com/community/tutorials/an-introduction-to-digitalocean-load-balancers [前提条件のロードバランサーの記事]を参照してください。 `+ doctl `を使用してこれらのオプションを設定する方法の詳細を調べるには、常に `-help `フラグを指定して ` create +`コマンドを実行できます。 ロードバランサーの作成の場合、次のようになります。
doctl compute load-balancer create --help
これにより、使用可能なすべてのコマンドラインフラグとオプションのリストが出力されます。 任意の `+ doctl `コマンドでこの `-help +`フラグを使用できます。
ロードバランサーが作成されたので、ターゲットドロップレットを追加する必要があります。 次のセクションでそれを行います。
ステップ3-ロードバランサーにドロップレットを追加する
2つのDropletの情報をもう一度リストして、IDを取得できるようにします。
doctl compute droplet list
OutputID Name Public IPv4 Private IPv4 Public IPv6 Memory VCPUs Disk Region Image Status Tags
web-1 111.111.111.111 111.111.111.333 512 1 20 nyc1 Ubuntu LAMP on 16.04 active
web-2 111.111.111.222 111.111.111.444 512 1 20 nyc1 Ubuntu LAMP on 16.04 active
上記の出力例では、IDが強調表示されています。 例ではなく、実際のIDを使用してください。
次に、 `+ add-droplets +`コマンドを使用して、ターゲットのドロップレットをロードバランサーに追加します。 前の手順で作成したロードバランサーのIDを指定します。
doctl compute load-balancer add-droplets
\
--droplet-ids ,
`+ get +`コマンドを使用して、ロードバランサーの更新された情報を取得できます。
doctl compute load-balancer get
OutputID IP Name Status Created At Algorithm Region Tag Droplet IDs SSL Sticky Sessions Health Check Forwarding Rules
active 2017-05-10T19:28:30Z round_robin , 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:///test.html
ブラウザは、* web-1 または web-2 *からメッセージをロードします。 ページを更新すると、他のサーバーのメッセージが表示されます。 ロードバランサーは_round robin_モードにあります。つまり、リクエストごとにリスト上の次のドロップレットに接続を送信します。 代替方法は_least connections_モードです。このモードでは、Load Balancerは、アクティブな接続が最も少ないターゲットに新しいトラフィックを送信します。
Load Balancerが機能していることがわかったので、サーバーを無効にして、中断の処理方法を見てみましょう。
ステップ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ロードバランサーといくつかのバックエンドWebサーバーを作成し、バックエンドサーバーにHTTPトラフィックを送信するようにロードバランサーを設定し、ロードバランサーのヘルスチェック機能をテストしました。 Load Balancerを実動用に準備するために実行できるステップがいくつかあります。
-
ロードバランサーでドメイン名を指定すると、ユーザーがわかりにくいIPアドレスを入力することがなくなります。 チュートリアルhttps://www.digitalocean.com/community/tutorials/how-to-set-up-a-host-name-with-digitalocean [ホスト名を設定するにはDigitalOcean]。
-
DigitalOceanを使用すると、ドロップレットにタグを付けることができるため、ドロップレットを整理し、ドロップレットのセット全体をグループとして扱うことができます。 ドロップレットを個別に追加する代わりに、特定のタグ内のすべてのドロップレットにトラフィックを送信するようにロードバランサーを構成できます。 これにより、新しいバックエンドサーバーをより動的にプールに追加できます。 DigitalOceanタグについては、https://www.digitalocean.com/community/tutorials/how-to-tag-digitalocean-droplets [DigitalOcean Dropletsにタグを付ける方法]で学習できます。
-
負荷分散されたWebサイトにHTTPSセキュリティを追加する必要がある場合、これを実現する2つの異なる方法に関するチュートリアルがあります:https://www.digitalocean.com/community/tutorials/how-to-configure-ssl-passthrough- on-digitalocean-load-balancers [SSLパススルー]およびhttps://www.digitalocean.com/community/tutorials/how-to-configure-ssl-termination-on-digitalocean-load-balancers[SSLターミネーション]。