序章

このチュートリアルでは、DigitalOcean APIを使用して、 DOProxy を使用してサーバー設定を水平方向にスケーリングする方法を示します。Rubyスクリプトは、構成すると、HTTPアプリケーションサーバー層をスケールアップまたはスケールダウンするためのコマンドラインインターフェイスを提供します。 。

DOProxyは、このチュートリアルのために特別に作成されたもので、DigitalOcean APIを使用してアプリケーションサーバーのドロップレットを作成および削除し、HAProxyロードバランサーのメンバーシップを管理する簡単な方法を提供します。 この基本的なスケーリングモデルにより、ユーザーはHAProxyサーバーを介してアプリケーションにアクセスでき、HAProxyサーバーは負荷分散された方法でバックエンドアプリケーションサーバーに転送します。

DOProxyは、次の3つの主要な機能を実行します。

  • ドロップレットを作成し、ロードバランサーに追加します
  • ドロップレットを削除し、ロードバランサーから削除します
  • 削除されるまで、作成したドロップレットのインベントリを維持します

DOProxy create

注:このチュートリアルの主な目的は、APIを介してDigitalOceanサーバーアーキテクチャをプログラムでスケーリングするために必要な最小限の概念を教えることです。 DOProxyは復元力を考慮して設計されておらず、非常に基本的なエラーチェックしか実行しないため、実稼働環境でDOProxyを実行しないでください。 そうは言っても、このスクリプトに精通することは、DigitalOceanAPIを介した水平スケーリングについて学習するための優れた方法です。

前提条件

このチュートリアルでは、先に進む前に読みたいと思われる次のテクノロジを使用します。

DOProxyはRubyで記述されているため、Rubyの知識が役立つ場合があります。 Rubyに精通するために、Rubyでコーディングする方法のシリーズを読むことができます。 Rubyにあまり詳しくない場合は、DOProxyコードの要点を説明するための擬似コードを提供します。 APIの呼び出しを簡素化するために、公式のDigitalOceanRubyラッパーであるDropletKitを使用しています。

DOProxyの動作の詳細に入る前に、DOProxyをサーバーにインストールして使用します。

今すぐUbuntu16.04ドロップレットにDOProxyをインストールしましょう。

DOProxyをインストールします

まず、DOProxyがデフォルトで使用するリージョンであるNYC3リージョンにUbuntu16.04ドロップレットを作成します。 別のリージョンを使用する場合は、DOProxyをインストールした後、doproxy.ymlファイルでregion変数を構成する必要があります。 このドロップレットは、HAProxyロードバランサーとDOProxyスケーリングスクリプトを実行するため、目的のスケールの可能性に適していると思われるサイズを選択してください。 このチュートリアルは、実際のトラフィックが予想されないスケーリングの基本的なデモンストレーションであるため、512MBのサイズでおそらく適切です。

このドキュメントの長さでは、このドロップレットをDOProxyサーバーと呼びます。

次に、サーバーにログインし、DOProxyのInstallationおよびConfiguration doproxyconfigおよびUserdataを含む)セクションに従います。このサーバーにDOProxyをインストールするためのGitHubリポジトリREADME。 DOproxy構成ファイルのYOUR_DO_API_TOKENYOUR_SSH_KEY_FINGERPRINTの値を必ず置き換えてください。そうしないと、スクリプトが機能しません。

サーバーにDOProxyとHAProxyがインストールされたので、環境を拡張してみましょう。

DOProxyを実行します

root としてDOProxyサーバーにログインし、DOProxyのクローンを作成したディレクトリに移動します。

引数なしでDOProxyを実行します。

  1. ruby doproxy.rb

これにより、使用可能なコマンドが出力されます。

Output
Commands: doproxy.rb print # Print backend Droplets in inventory file doproxy.rb create # Create a new backend Droplet and reload doproxy.rb delete <LINE_NUMBER> # Delete a Droplet and reload doproxy.rb reload # Generate HAProxy config and reload HAProxy doproxy.rb generate # Generate HAProxy config based on inventory

この時点では、DOProxyはまだドロップレットを作成していません。 HTTPサービスをオンラインにしてスケールアップするために、いくつか作成してみましょう。

スケールアップ(作成)

createコマンドを実行して、DOProxyによって管理される最初のドロップレットを作成します。

  1. ruby doproxy.rb create

プロンプトに戻るまでに少し時間がかかります(スクリプトがAPIを介して新しいドロップレットを作成し、起動するのを待つため)。 擬似コードを実行するときにAPI呼び出しがどのように行われるかについて説明します。

スクリプトが完了すると、ドロップレットIDを含む成功メッセージが表示されます。

Output
Success: 4202645 created and added to backend.

userdataスクリプトがまだ実行されていない可能性があり、HAProxyがトラフィックの通過を開始していない可能性があるため、プロンプトが戻ってから数分待ってから次の手順に進むことをお勧めします。

続行する準備ができたら、WebブラウザでDOProxyサーバーのパブリックIPアドレスにアクセスします。 新しいドロップレットのホスト名 id 、およびパブリックIPアドレスを一覧表示するページが表示されます。

DOProxyを使用して、さらに2つのドロップレット、合計3つを作成します。 必要に応じて、さらに作成してください。

  1. ruby doproxy.rb create
  2. ruby doproxy.rb create

次に、WebブラウザでDOProxyサーバーのパブリックIPアドレスに再度アクセスします。 ページを更新すると、作成したドロップレットを循環しているときにページの情報が変化することがわかります。 これは、DOProxyで作成したときに、各ドロップレットを構成に追加したHAProxyによってすべての負荷が分散されているためです。

DigitalOceanコントロールパネルを見ると、これらの新しいドロップレットが(残りのドロップレットとともに)そこに一覧表示されていることがわかります。

Droplets in Control Panel

DOProxyのインベントリを見て作成されたドロップレットを詳しく見てみましょう。

DOProxyは、インベントリの一部であるすべてのドロップレットを出力するprintコマンドを提供します。

  1. ruby doproxy.rb print

次のような出力が表示されます。

Output
0) auto-nginx-0 (pvt ip: 192.0.2.175, status: active, id: 4202645) 1) auto-nginx-1 (pvt ip: 192.0.2.176, status: active, id: 4205587) 2) auto-nginx-2 (pvt ip: 192.0.2.172, status: active, id: 4205675)

出力例では、ホスト名、ステータス、ドロップレットIDなど、作成した3つのドロップレットに関する情報が表示されます。 ホスト名とIDは、(DOProxyのパブリックIPアドレスを介して)HAProxyロードバランサーにアクセスしたときにWebブラウザーに表示されたものと一致する必要があります。

お気づきかもしれませんが、DOProxyは、作成したドロップレットに関する情報のみを印刷しました。 これは、作成するドロップレットのインベントリを維持するためです。

inventoryファイルの内容を今すぐチェックしてください。

  1. cat inventory

各ドロップレットのIDが1行に1つずつ表示されます。 ドロップレットが作成されるたびに、そのIDがこのインベントリファイルに保存されます。

ご想像のとおり、DOProxyのprintコマンドは、インベントリファイル内のドロップレットIDを繰り返し処理し、API呼び出しを実行して各ドロップレットIDに関する情報を取得します。

サーバーインベントリを単一のファイルに保存することは最善の解決策ではなく、簡単に破損または削除される可能性があることに注意してください。ただし、これは機能する単純な実装を示しています。 etcdなどの分散型KeyValueストアがより優れたソリューションになります。 また、インベントリにドロップレットIDだけでなく、それ以上のものを保存することもできます(したがって、特定のドロップレット情報を確認するたびにAPI呼び出しを行う必要はありません)。

スケールダウン(削除)

DOProxyには、インベントリ内のドロップレットを削除できるdeleteコマンドもあります。 deleteコマンドでは、削除するドロップレットの行番号を指定する必要があります(printコマンドで表示されます)。

このコマンドを実行する前に、インベントリを印刷することをお勧めします。

  1. ruby doproxy.rb print

したがって、たとえば、3番目のドロップレットを削除する場合は、行番号として2を指定します。

  1. ruby doprorxy.rb delete 2

しばらくすると、確認メッセージが表示されます。

Output
Success: 4205675 deleted and removed from backend.

deleteコマンドは、APIを介してドロップレットを削除し、HAProxy構成から削除して、インベントリから削除します。 DOProxy印刷コマンドを使用するか、DigitalOceanコントロールパネルをチェックして、ドロップレットが削除されたことを確認してください。 また、ロードバランサーの一部ではなくなったことにも気付くでしょう。

HAProxyの設定

まだ説明していないDOProxyの最後の部分は、HAProxyの構成方法です。

createまたはdeleteDOProxyコマンドを実行すると、インベントリ内の各ドロップレットの情報が取得され、その情報の一部がHAProxy構成ファイルの変更に使用されます。 特に、ドロップレットIDとプライベートIPアドレスは、各ドロップレットをバックエンドサーバーとして追加するために使用されます。

生成されたhaproxy.cfgファイルの最後の数行を次のように見てください。

  1. tail haproxy.cfg

次のように表示されます。

haproxy.cfgのテール
	frontend www-http
	   bind 203.0.113.43:80
	   reqadd X-Forwarded-Proto:\ http
	   default_backend www-backend

	backend www-backend

	   server www-4202645 192.0.2.175:80 check # id:4202645, hostname:auto-nginx-0
	   server www-4205587 192.0.2.176:80 check # id:4205587, hostname:auto-nginx-1

frontendセクションには、DOProxyサーバーのパブリックIPアドレスが含まれている必要があり、backendセクションには、作成された各ドロップレットを参照する行が含まれている必要があります。

注:この時点で、DOProxyで作成された残りのドロップレットを削除することをお勧めします(すべてのサーバーがなくなるまでruby doproxy.rb delete 0)。

DOProxyのスケーリングの動作を確認したので、コードを詳しく見てみましょう。

DOProxyコード

このセクションでは、DOProxyを機能させるための関連ファイルとコード行について説明します。 DOProxyがどのように実装されたかを見ると、APIを使用して独自のサーバーインフラストラクチャを管理および自動化する方法についてのアイデアが得られるはずです。

リポジトリをサーバーに複製したので、そこにあるファイルを確認するか、DOProxyリポジトリ(https://github.com/scanevari/doproxy)にあるファイルを確認できます。

重要なファイル:

  • doproxy.rb :DOProxyRubyスクリプト。 DOProxyの背後にあるコマンドラインインターフェイスとロジックを提供します
  • doproxy.yml :DOProxy構成ファイル。 APIトークンが含まれ、ドロップレット作成オプションを指定します
  • haproxy.cfg.erb :HAProxy構成テンプレート。 適切なバックエンドサーバー情報を使用してロードバランサー構成を生成するために使用されます
  • Inventory :ドロップレットインベントリファイル。 作成したドロップレットのIDを格納します
  • user-data.yml :ユーザーデータファイル。 作成時に新しいドロップレットで実行されるcloud-configファイル

まず、構成ファイルについて詳しく見ていきましょう。

doproxy.yml

これらはdoproxy.ymlの重要な行です。

doproxy.yml
token: YOUR_DO_API_TOKEN
ssh_key_ids:
  - YOUR_SSH_KEY_FINGERPRINT
...
droplet_options:
  hostname_prefix: auto-nginx
  region: nyc3
  size: 1gb
  image: ubuntu-16-04-x64

tokenプロパティは、読み取りおよび書き込みAPIトークンを保持する必要があるプロパティです。

他の行は、DOProxyが新しいドロップレットを作成するときに使用されるオプションを指定します。 たとえば、指定されたSSHキー(IDまたはフィンガープリントによる)をインストールし、ホスト名の前に「auto-nginx」を付けます。

有効なドロップレットオプションの詳細については、DigitalOceanAPIドキュメントを参照してください。

user-data.yml

これは、新しいドロップレットが作成されるたびにcloud-initによって実行されるファイルです。 これは、cloud-configファイルまたはスクリプトを提供して、新しい各ドロップレットにアプリケーションソフトウェアをインストールできることを意味します。

サンプルのuserdataファイルには、UbuntuサーバーにNginxをインストールし、デフォルトの構成ファイルをDropletのホスト名、ID、およびパブリックIPアドレスに置き換える単純なbashスクリプトが含まれています。

user-data.yml
#!/bin/bash

apt-get -y update
apt-get -y install nginx
export DROPLET_ID=$(curl http://169.254.169.254/metadata/v1/id)
export HOSTNAME=$(curl -s http://169.254.169.254/metadata/v1/hostname)
export PUBLIC_IPV4=$(curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address)
echo Droplet: $HOSTNAME, ID: $DROPLET_ID, IP Address: $PUBLIC_IPV4 > /var/www/html/index.html

これらのcurlコマンドは、DigitalOceanメタデータサービスを使用して、ドロップレットに関する情報(ホスト名、ID、およびIPアドレス)を取得しています。

実稼働環境では、このファイルには、たとえば、アプリケーションをインストールして構成するためのコマンドが含まれます。 これを使用して、SSHキーを自動的にインストールしたり、構成管理または監視ツールに接続したりすることで、インフラストラクチャ全体へのドロップレットの統合を自動化することもできます。

userdata、cloud-config、およびメタデータの詳細については、次のリンクを確認してください。

haproxy.cfg.erb

HAProxy構成テンプレートには、ほとんどのロードバランサー構成が含まれており、一部のRubyコードはバックエンドのドロップレット情報に置き換えられます。

バックエンド構成を生成するRubyセクションを見てみましょう。

haproxy.cfg.erb
backend www-backend
   <% @Droplets.each_with_index do |droplet, index| %>
   server www-<%= droplet.id %> <%= droplet.private_ip %>:80 check # id:<%= droplet.id %>, hostname:<%= droplet.name -%>
   <% end %>

このコードは、インベントリ内の各ドロップレットを反復処理し、各ドロップレットに新しいHAProxyバックエンドエントリを追加します(プライベートIPアドレスに基づく)。

たとえば、次のような行が各ドロップレットに対して生成されます。

haproxy.cfg
server www-4202645 192.0.2.175:80 check # id:4202645, hostname:auto-nginx-0

ドロップレットが作成または削除されるたびに、DOProxyは変更を含む新しいHAProxy構成ファイルを生成します。

doproxy.rb

このRubyスクリプトは、主に、ドロップレットの作成と削除、インベントリ管理、およびHAProxy構成の生成を実行するメソッドを含むDOProxyクラスで構成されています。

Rubyを理解している場合は、GitHubのファイルhttps://github.com/scanevari/doproxy/blob/master/doproxy.rbを確認してください。

Rubyがわからない場合は、それぞれの方法を説明する簡略化されたpseudocodeを次に示します。 これを実際のRubyコードと比較して、何が起こっているのかを理解するのに役立つ場合があります。

def initialize

DOProxyが有効な引数で実行されるたびに実行されます。

  • doproxy.yml構成ファイルを読み取り、APIトークンとドロップレットオプションを取得します。
def get\_inventory

インベントリファイル内の各ドロップレットの情報を取得します。 他のメソッドを実行する前に実行する必要があります。

  • インベントリファイル(ドロップレットIDを含む)を読み取ります
  • ドロップレットIDごとに、APIを使用してドロップレット情報を取得します
def print\_inventory

このメソッドは、インベントリファイル内の各ドロップレットIDのドロップレット情報を出力します。 doproxy.rb printコマンドで呼び出されます。

  • インベントリ内の各ドロップレットについて、ホスト名、プライベートIPアドレス、ステータス、およびIDを印刷します
def create\_server

doproxy.rb createコマンドを介して呼び出されると、このメソッドは新しいドロップレットを作成し、それをインベントリファイルに追加します。 次に、reload_haproxyを呼び出して、HAProxy構成ファイルを再生成し、ロードバランサーをリロードします。

  • userdataファイルを読み取る
  • APIを使用して、提供されたユーザーデータとオプションに基づいてドロップレットを作成します
  • ドロップレットのステータスが「アクティブ」になるのを待つ—ステータスが変わるまで15秒ごとにAPIを使用してドロップレット情報を取得します
  • ステータスが「アクティブ」の場合、ドロップレットIDをインベントリファイルに追加します
  • reload_haproxyを呼び出して、HAProxy構成ファイルを再生成し、ロードバランサーをリロードします
def delete\_server(line\_number)

doproxy.rb deleteコマンドを使用すると、このメソッドは指定されたドロップレットを削除し、そのIDをインベントリファイルから削除します。 次に、reload_haproxyを呼び出して、HAProxy構成ファイルを再生成し、ロードバランサーをリロードします。

  • インベントリファイルから指定された行を削除します(ドロップレットIDを削除します)
  • APIを使用して、IDでドロップレットを削除します
  • reload_haproxyを呼び出して、HAProxy構成ファイルを再生成し、ロードバランサーをリロードします
def generate\_haproxy\_cfg

これは、インベントリ内のドロップレットに基づいて新しいHAProxy構成ファイルを作成するサポート方法です。

  • HAProxy構成テンプレートを開きます(haproxy.cfg.erb
  • インベントリ内のドロップレットごとに、対応するバックエンドサーバーエントリを追加します
  • 結果のhaproxy.cfgファイルをディスクに書き込みます
def reload\_haproxy

これは、HAProxy構成ファイルを適切な場所にコピーし、HAProxyをリロードするもう1つのサポート方法です。 これはgenerate_haproxy_cfgに依存しています。

  • HAProxy設定ファイルhaproxy.cfgを、HAProxyがリロード時に検索する場所にコピーします
  • HAProxyをリロードする

これが、DOProxyを機能させる重要なコードのすべてです。 最後に説明するのは、DOProxyで使用したAPIラッパーであるDropletKitです。

DropletKitジェム

DOProxyは、DigitalOceanAPIへの呼び出しを容易にする公式のDigitalOceanAPIv2RubyラッパーであるDropletKitgemを使用します。 DropletKitを使用すると、次のようなことを行うRubyプログラムを簡単に作成できます。

  • 新しい液滴を作成する
  • 既存の液滴を削除する
  • ステータス、IPアドレス、ドロップレットID、地域など、既存のドロップレットに関する情報を取得します

このチュートリアルでは、これらの特定のAPIエンドポイントに焦点を当てましたが、DigitalOceanサーバーインフラストラクチャのプログラムによる管理を容易にするのに役立つ他の多くのエンドポイントがあることに注意してください。

結論

DigitalOcean API、cloud-config、およびメタデータを活用して、単純なスクリプトがサーバー環境のスケーリングにどのように役立つかを確認したので、これらすべての概念を適用して、独自のサーバーセットアップをスケーリングできます。 DOProxyは本番環境での使用を目的としたものではありませんが、独自のスケーリングソリューションを実装するための優れたアイデアを提供するはずです。

ここでDOProxyを使用して説明したスケーリング設定は情報提供ですが、監視システムと組み合わせて使用することで大幅に改善される可能性があることに注意してください。 これにより、サーバーリソースの使用率などの特定の条件に応じて、アプリケーションサーバーの階層を自動的に拡大および縮小できます。