前書き

DigitalOceanロードバランサーは、複数のバックエンドサーバー間でHTTP、HTTPS、およびTCPトラフィックを分散する簡単な方法です。 このチュートリアルでは、DigitalOcean APIの公式コマンドラインクライアントである `+ doctl +`を使用して、複数のバックエンドWebサーバーのロードバランサーを作成および構成します。

前提条件

このチュートリアルを開始する前に、 `+ doctl +`とDigitalOceanロードバランサーに慣れる必要があります。 次の記事が役立ちます。

続行する前に、 `+ 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ターミネーション]。