小規模なブログ、大規模なアプリケーション、APIのどれを実行しているかは関係ありません。オフラインにしたいことはありません。
単一障害点とは、障害が発生した場合にダウンタイムを引き起こすインフラストラクチャの任意の部分です。 たとえば、1つのサーバーを使用して、Webサーバーとデータベースの両方をホストすることができます。 多くの場合、停止はこれらの単一障害点によって引き起こされるため、これらの状況を回避するためにインフラストラクチャを設計する必要があります。
高可用性インフラストラクチャには、単一障害点はありません。 通常、これは、インフラストラクチャがサービスごとに分割され、各サービスを複数のサーバーで実行することを意味します。 1つのサーバーに障害が発生した場合、要求を処理するために他のサーバーを使用できます。 可用性の高い構成は、冗長性にとって重要であるだけでなく、インフラストラクチャを拡張する方が高速で費用対効果が高くなります。
ファイルをホストするWebサービスを想像してください。 ここで、3つの独立したサーバーで実行されていることを想像してください。 差し迫った問題がいくつかあります。 ユーザーはこれらのサーバーにどのようにアクセスできますか? 各独立サーバーにDNSレコードを追加できます。 残念ながら、ユーザーはサーバーにランダムにルーティングされ、オフラインのサーバーに送信される可能性があります。
インフラストラクチャにロードバランサーを追加することで、これらの落とし穴を回避できます。 ロードバランサーは、構成内にある各サーバーのヘルスチェックを実行します。 サーバーがオフラインの場合、ロードバランサーはユーザー要求を送信しません。 ロードバランサーは、利用可能な最適なサーバーにユーザーをより効果的にルーティングすることにより、パフォーマンスを向上させます。
この追加を実行する際のもう1つの懸念は、ロードバランサー自体が単一障害点にならないようにすることです。 私たちはそのことを考えており、ロードバランサーレイヤーとバックエンドサーバーで可用性の高い2つの完全なソリューションを用意しています。
私たちのセットアップ
この章では、いくつかのWebサーバーで負荷分散ソリューションを展開する2つの方法について説明します。 このセクションの終わり(4〜6章)までに、Webサービスとデータベースサービスの前に複数のロードバランサーを設定し、単一障害点がないようにします。
負荷分散を設定するには、さまざまな方法があります。 バックエンドでNginx Webサービスを提供する2つの設定例を見ていきます。
最初のソリューションでは、https://www.digitalocean.com/docs/networking/load-balancers/ [DigitalOcean Load Balancers]を使用します。これは、フェイルオーバーリカバリを自動的に処理する高可用性サービスです。 また、手動リストの代わりにhttps://www.digitalocean.com/docs/droplets/how-to/tag/[tags]に基づいてトラフィックをDropletsに転送する機能も含まれているため、スケーリングが簡単になります。
2番目のソリューションは、HAProxyおよびhttps://www.digitalocean.com/docs/networking/floating-ips/[DigitalOcean Floating IPs]を使用した、よりカスタムの負荷分散ソリューションです。コントロールパネルまたはAPIのいずれかを使用して自動的に領域を設定します。 これらを使用して、メインのロードバランサーに障害が発生した場合に、トラフィックをスタンバイロードバランサーに再ルーティングできます。
この本でTerraformとAnsibleを使用するのはこれが初めてなので、このセクションを手動で行って、手動で独自のプロジェクトを作成する経験を提供します。 次の章でより複雑なセットアップに進むと、ほとんどの構成が自動化されます。
DigitalOceanロードバランサーの使用
DigitalOceanロードバランサーのセットアップ
コントローラーのドロップレットで、https://github.com/digitalocean/navigators-guide/tree/master/example-code/02-scale/ch04/digitalocean_loadbalancer [リポジトリのこの章のディレクトリ]に移動します。
cd /root/navigators-guide/example-code/02-scale/ch04/digitalocean_loadbalancer
このディレクトリには、https://github.com/digitalocean/navigators-guide/blob/master/example-code/02-scale/ch04/digitalocean_loadbalancer/terraform.tfvars.sample [a `+ terraform.tfvars.sample + `ファイル]。 このサンプルファイルには、必要な情報を見つけるのに役立つコメントとメモが含まれています。 コメントがない場合、ファイルは次のようになります。
do_token = ""
project = "DO-LB"
region = "sfo2"
image_slug = "debian-9-x64"
keys = ""
private_key_path = ""
ssh_fingerprint = ""
public_key = ""
これにより、Nginxを実行するいくつかのドロップレットとともにDigitalOceanロードバランサーが作成されます。 各Webサーバーは、個々のDropletのホスト名を含む簡単なウェルカムメッセージを表示します。
コメントの指示に従って変数を入力し、ファイルの名前を `+ terraform.tfvars +`に変更します。
mv terraform.tfvars.sample terraform.tfvars
この構成ではTLS証明書は必要ありませんが、DigitalOceanロードバランサーに追加できます。 DigitalOceanロードバランサー機能には、無料で証明書を提供するLet’s Encryptも統合されています。 Lets Encryptでは、登録してDigitalOceanアカウントに追加するドメイン名が必要です。
次に、Terraformデプロイメントを準備して実行します。 最初に、 `+ terraform init `を使用して計画ファイルとモジュールを解析します。 オプションで、 ` terraform plan `を実行して、実際のスクリプトを実行したときに何が起こるかを確認できます。 準備ができたら、 ` terraform apply +`を実行して、DigitalOcean APIを介して作成リクエストを実行します。
terraform init
terraform apply
「+ yes +」と入力して実行を確認する必要があります。適用が完了すると通知されます。
この時点で、ブラウザでロードバランサーのパブリックIPアドレス(「+ terraform show +」で取得できます)にアクセスして、Webサーバーからサンプルコンテンツを表示できます。
Terraformは、 `+ destroy `オプションを使用してクラスターを自動的に削除することもできます。 このワークフローを使用して迅速なテストを行うことができますが、クラスターに保存されたデータはすべて削除されることを知っています。 * ` destroy `オプションはクラスターを削除します。*これは、この章で行っている作業をクリーンアップする最も速い方法です。 「 apply +」を再実行して、新しいクラスターを生成できます。
このサンプルクラスターを分解する前に、実際に可用性が高いことをテストしてみましょう。
クラスターの可用性のテスト
バックエンドWebサーバーの可用性をテストするために、ロードバランサーからの接続を継続的に要求しながら、1つのサーバーをオフラインにすることができます。 接続が継続して行われる場合、サーバーに障害が発生してもサービスがオンラインのままであることがわかります。 (ロードバランサーはサービスとして実行されるため、ロードバランサー自体のフェールオーバーをテストすることはできません。つまり、個々のコンポーネントに直接アクセスする必要はありません。)
ターミナルで次のコマンドを実行します。これは、1秒に1回ロードバランサーに接続します。
while true; do curl -k load_balancer_ip; sleep 1; done
次のような連続出力が表示されます。
Welcome to DO-LB-backend-01!
Welcome to DO-LB-backend-02!
Welcome to DO-LB-backend-03!
Welcome to DO-LB-backend-01!
Welcome to DO-LB-backend-02!
Welcome to DO-LB-backend-03!
バックエンドドロップレットのいずれかの電源をオフにしてみてください。 ドロップレットをオフラインにしても、他のロードバランサーのバックエンドから有効な応答を返すテストが表示されるはずです。 オフにしたドロップレットが応答しなくなっていることがわかります。 電源を再投入すると、ロードバランサーの設定済みのチェックに合格すると、自動的にローテーションに追加されます。
(実行中のテストを停止するのに助けが必要な場合、 `+ CTRL-C +`キーボードコマンドでループを終了できます)
クラスターのスケーリング
初期クラスタセットアップでは、3つのバックエンドドロップレットを使用します。 バックエンドドロップレットの数の設定は、variables.tfファイルのデフォルトの変数宣言にあります。 変数 `+ node_count `を5に設定して ` terraform.tfvars +`に行を追加することでオーバーライドできます。 行を追加したら、Terraform計画を再適用する必要があります。
terraform apply
Terraformはここで本当に輝いています。 この変数に基づいてドロップレットの数を変更するロジックを処理するため、 `+ node_count +`変数が増減するときに自動的にドロップレットを作成または破棄します。
Load Balancerに対して「+ curl +」を実行しているターミナルで、出力を確認します。 新しいドロップレットがプロビジョニングされると、それらが自動的に応答を開始します。
Welcome to DO-LB-backend-02!
Welcome to DO-LB-backend-03!
Welcome to DO-LB-backend-01!
Welcome to DO-LB-backend-02!
Welcome to DO-LB-backend-03!
Welcome to DO-LB-backend-04!
Welcome to DO-LB-backend-05!
Welcome to DO-LB-backend-01!
Welcome to DO-LB-backend-02!
Welcome to DO-LB-backend-03!
Welcome to DO-LB-backend-04!
Welcome to DO-LB-backend-05!
Welcome to DO-LB-backend-01!
先に進む前に、このテストプロジェクトを破棄する必要があります。 Terraformは、現在の作業ディレクトリに計画の現在の状態を保持します。 Terraformを介してリソースを破棄すると、自動的に状態がクリアされます。
terraform destroy
HAProxyとDigitalOceanフローティングIPアドレスの使用
カスタムの負荷分散ソリューションを展開するのが正しい選択かもしれません。 DigitalOcean Load Balancerが現在サポートしていないオプションがいくつかあります。 これの例は、複数のサイトまたはアプリケーションをバックエンドとしてホストすること、複数のTLS証明書、プロキシプロトコルのサポート、または特定のTCPパラメーターの調整です。
この例では、フェイルオーバーにDigitalOcean Floating IPを使用してクラスター化されたHAProxy v1.8ロードバランサーを使用します。
HAProxyのセットアップ
コントローラーのドロップレットで、https://github.com/digitalocean/navigators-guide/tree/master/example-code/02-scale/ch04/haproxy_loadbalancer [リポジトリのこの章のディレクトリ]に移動します。
cd /root/navigators-guide/example-code/02-scale/ch04/haproxy_loadbalancer
このディレクトリには、https://github.com/digitalocean/navigators-guide/blob/master/example-code/02-scale/ch04/haproxy_loadbalancer/terraform.tfvars.sample [a `+ terraform.tfvars.sample + `ファイル]。 このサンプルファイルには、必要な情報を見つけるのに役立つコメントとメモが含まれています。 コメントがない場合、ファイルは次のようになります。
do_token = ""
project = "HAPROXY-LB"
region = "sfo2"
image_slug = "debian-9-x64"
keys = ""
private_key_path = ""
ssh_fingerprint = ""
public_key = ""
コメントの指示に従って変数を入力し、ファイルの名前を `+ terraform.tfvars +`に変更します。
mv terraform.tfvars.sample terraform.tfvars
次に、Terraformデプロイメントを準備して実行します。 最初に、 `+ terraform init `を使用して計画ファイルとモジュールを解析します。 オプションで、 ` terraform plan `を実行して、実際のスクリプトを実行したときに何が起こるかを確認できます。 準備ができたら、 ` terraform apply +`を実行して、DigitalOcean APIを介して作成リクエストを実行します。
terraform init
terraform apply
「+ yes +」と入力して実行を確認する必要があります。適用が完了すると通知されます。
ここで「+ terraform show 」を実行すると、デプロイしたリソースを確認できます。 リソースの各セット(つまり、 ドロップレット)は、Terraform構成ファイルのリソース名に従ってグループ名に配置されます。 この例では、https://github.com/digitalocean/navigators-guide/blob/master/example-code/02-scale/ch04/haproxy_loadbalancer/haproxy.tf [the ` haproxy.tf +` file] 's resourceこれらのグループは宣言によって決まります。
3つのグループは、HAProxyの場合は「+ load_balancer 」、Nginxの場合は「 web_node 」、フローティングIPの場合は「 fip 」です。 ` terraform-inventory -inventory `で見て、AnsibleインベントリをINI形式で取得するか、 ` -list`オプションでJSONを出力できます。
この時点で、必要なドロップレットが作成されて実行されていますが、まだ設定する必要があります。
Ansibleでのドロップレットの構成
Ansibleを使用して、ドロップレットの構成を自動化します。 Ansibleのいくつかのロールをダウンロードするように事前構成されたAnsible Playbookがあります。 これらのAnsibleロールはhttps://github.com/digitalocean/navigators-guide/blob/master/example-code/02-scale/ch04/haproxy_loadbalancer/requirements.yml[the `+ requirements.yml +`ファイルにリストされています]。 1つずつインストールする必要はありません。 Ansible Galaxyで必要な役割をダウンロードできます。
このコマンドは、ロールを `+ roles +`ディレクトリに配置します。
ansible-galaxy install -r requirements.yml
このロールに設定する必要のある変数がいくつかあります。/ root / navigators-guide / example-code / 02-scale / ch04 / haproxyloadbalancer / groupvars / load_balancer / _ディレクトリに戻ります。 既存の* vars.yml *ファイルを表示すると、「+ do_token 」と「 ha_auth_key 」にそれぞれ「 vault_do_token 」と「 vault_ha_auth_key 」の値が割り当てられていることがわかります。 * vault.yml *というセカンダリファイルを作成し、 ` vault +`変数を初期化します。
変数を設定する前に、2つのことが必要です。 フェールオーバーシナリオのフローティングIP割り当ての処理に使用されるDigitalOcean APIトークン、およびクラスターメンバーの認証に使用されるSHA-1ハッシュ。 これを作成するためのツールがあります。
cd /root/navigators-guide/example-code/02-scale/ch04/haproxy_loadbalancer/
./gen_auth_key
authkeyが作成されたら、先に進み、 groupvars / load_balancer / vault.yml