序章

Heartbeatは、クラスターインフラストラクチャ機能(クラスターメンバーシップとメッセージング)をクライアントサーバーに提供するオープンソースプログラムです。 これらの機能は、高可用性(HA)サーバーインフラストラクチャの重要なコンポーネントです。 このチュートリアルでは、Heartbeatと DigitalOcean FloatingIPを使用して2ノードのHAサーバーセットアップを作成する方法を示します。

ハートビートは通常、完全なHAセットアップを実現するために、Pacemakerなどのクラスターリソースマネージャー(CRM)と組み合わせて使用されます。 より堅牢なHAセットアップを作成する場合は、CorosyncおよびPacemakerまたはKeepalivedの使用を検討してください。

ゴール

完了すると、HAセットアップはアクティブ/パッシブ構成の2台のUbuntu16.04サーバーで構成されます。 これは、障害が検出されない限り、ユーザーがサービスまたはWebサイトにアクセスする方法であるフローティングIPをポイントして、プライマリサーバーまたはアクティブサーバーをポイントすることによって実現されます。 Heartbeatサービスがプライマリサーバーが利用できないことを検出した場合、セカンダリサーバーは自動的にスクリプトを実行して、DigitalOceanAPIを介してフローティングIPを自身に再割り当てします。 したがって、フローティングIPへの後続のネットワークトラフィックはセカンダリサーバーに転送されます。セカンダリサーバーは、プライマリサーバーが再び使用可能になるまでアクティブサーバーとして機能します(その時点で、プライマリサーバーはフローティングIPをそれ自体に再割り当てします)。

Active/passive Diagram

注:このチュートリアルはデモンストレーションを目的としており、信頼性の高いHAソリューションのセットアップの一部の側面のみをカバーしています。 このドキュメントの主なポイントは、ゲートウェイレベルでアクティブ/パッシブノードをインストールし、それらをフローティングIPに接続する方法の詳細です。 チュートリアルを簡単にするために、各サーバーでリバースプロキシロードバランサーを構成する代わりに、それぞれのホスト名とパブリックIPアドレスで応答するように構成します。

この目標を達成するために、次の手順に従います。

  • トラフィックを受信する2つのドロップレットを作成します
  • フローティングIPを作成し、ドロップレットの1つに割り当てます
  • フローティングIPを指すDNSAレコードを作成する(オプション)
  • ドロップレットにハートビートをインストールする
  • フローティングIP再割り当てサービスを実行するようにハートビートを構成する
  • フローティングIP再割り当てサービスを作成する
  • フェイルオーバーのテスト

この目標を念頭に置いて、HAセットアップのセットアップに取り掛かることができます。

前提条件

フローティングIPの再割り当てを自動化するには、DigitalOceanAPIを使用する必要があります。 これは、読み取りおよび書き込みアクセスでDigitalOceanアカウントへの認証に使用できるAPIトークンであるパーソナルアクセストークン(PAT)を生成する必要があることを意味します。 これは、APIチュートリアルのパーソナルアクセストークンの生成方法セクションに従うことで実現できます。 PATは、クラスター内の両方のサーバーに追加されるスクリプトで使用されます。 DigitalOceanアカウントへのフルアクセスが可能になるため、参照用に安全な場所に保管しておくことが重要です。

APIに加えて、このチュートリアルでは次のDigitalOcean機能を利用します。

それらについてもっと知りたい場合は、リンクされたチュートリアルを読んでください。

ドロップレットを作成する

最初のステップは、同じデータセンターに2つのUbuntuドロップレットを作成することです。これは、上記のプライマリサーバーとセカンダリサーバーとして機能します。 セットアップ例では、簡単に参照できるように「プライマリ」と「セカンダリ」という名前を付けます。 両方のドロップレットにNginxをインストールし、それらのインデックスページをそれらを一意に識別する情報に置き換えます。 これにより、HAセットアップが機能していることを簡単に示すことができます。 本番環境のセットアップでは、サーバーで選択したWebサーバーまたはロードバランサーを実行する必要があります。

次のbashスクリプトをユーザーデータとして使用して、2つのUbuntu16.04ドロップレットprimarysecondaryを作成します。

ユーザーデータの例
#!/bin/bash

apt-get -y update
apt-get -y install nginx
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, IP Address: $PUBLIC_IPV4 > /var/www/html/index.html

これにより、Nginxがインストールされ、index.htmlの内容がドロップレットのホスト名とIPアドレスに置き換えられます(メタデータサービスを参照することにより)。 パブリックIPアドレスを介していずれかのドロップレットにアクセスすると、ドロップレットのホスト名とIPアドレスが記載された基本的なWebページが表示されます。これは、フローティングIPが任意の時点で指しているドロップレットをテストするのに役立ちます。

フローティングIPを作成する

DigitalOceanコントロールパネルで、トップメニューのネットワークをクリックし、次にサブメニューのフローティングIPをクリックします。

No Floating IPs

プライマリドロップレットにフローティングIPを割り当て、フローティングIPボタンをクリックします。

フローティングIPが割り当てられたら、Webブラウザーでドロップレットにアクセスして、割り当てられたドロップレットに到達できることを確認します。

http://your_floating_ip

プライマリドロップレットのインデックスページが表示されます。

DNSの構成(オプション)

ドメイン名を介してHAセットアップにアクセスできるようにする場合は、先に進んで、ドメインがフローティングIPアドレスを指すAレコードをDNSに作成します。 ドメインでDigitalOceanのネームサーバーを使用している場合は、DigitalOceanチュートリアルでホスト名を設定する方法のステップ3に従ってください。 それが伝播すると、ドメイン名を介してアクティブなサーバーにアクセスできます。

使用するドメイン名の例はexample.comです。 現在ドメイン名をお持ちでない場合は、代わりにフローティングIPアドレスを使用する必要があります。

Heartbeatをインストールする

次のステップは、両方のサーバーにHeartbeatをインストールすることです。 Heartbeatをインストールする最も簡単な方法は、apt-getを使用することです。

sudo apt-get update
sudo apt-get install heartbeat

これでハートビートがインストールされましたが、何かを実行する前に構成する必要があります。

ハートビートを構成する

目的のクラスターを起動して実行するには、両方のサーバーの/etc/ha.dディレクトリにこれらのハートビート構成ファイルを同じように作成して設定する必要があります。

  1. ha.cf —メンバーノードを含むハートビートクラスターのグローバル構成
  2. authkeys —ノードにクラスターへの認証方法を提供するセキュリティキーが含まれています
  3. haresources —クラスターおよびサービスの優先所有者であるノードによって管理されるサービスを指定します。 このファイルは、PacemakerのようなCRMを使用するセットアップでは使用されないことに注意してください

また、プライマリドロップレットの可用性が変更された場合にフローティングIPの再割り当てを実行するスクリプトを提供する必要があります。

ノード情報を収集する

ha.cfを構成する前に、各ノードの名前を調べる必要があります。 ハートビートでは、各ノード名がそれぞれのuname -n出力と一致する必要があります。

両方のサーバーで、次のコマンドを実行して適切なノード名を検索します。

  1. uname -n

コマンドの出力に注意してください。 ノード名の例は「primary」と「secondary」で、これはドロップレットの名前と一致します。

使用可能なノードを判別するには、各ノードがクラスターの他の部分との通信に使用するネットワークインターフェイスとIPアドレスも検索する必要があります。 各ノードがクラスター内の他のノードに到達できる限り、任意のネットワークインターフェイスを使用できます。 ドロップレットのパブリックインターフェイスを使用します。これはたまたまeth0です。

両方のサーバーで、次のコマンドを使用してeth0インターフェイスのIPアドレスを検索します(またはDigitalOceanコントロールパネルで検索します)。

  1. ip addr show eth0
ip addr show eth0 output:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 04:01:76:a5:45:01 brd ff:ff:ff:ff:ff:ff inet 198.51.100.5/24 brd 198.51.100.255 scope global eth0 valid_lft forever preferred_lft forever inet 10.17.0.28/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::601:76ff:fea5:4501/64 scope link valid_lft forever preferred_lft forever

ネットワークインターフェイスのIPアドレスに注意してください(例で強調表示されています)。 必ず両方のサーバーのIPアドレスを取得してください。

ha.cfファイルを作成します

両方のサーバーで、お気に入りのエディターで/etc/ha.d/ha.cfを開きます。 nanoを使用します:

  1. sudo nano /etc/ha.d/ha.cf

ファイルは新しく、空である必要があります。 クラスタ内の各ノードのネットワークインターフェイスと名前を追加する必要があります。

この構成をコピーしてファイルに貼り付けてから、それぞれのノード名とIPアドレスを前に調べた値に置き換えます。 この例では、プライマリのIPアドレスは198.51.100.5であり、セカンダリのIPアドレスは198.51.100.6です。

/etc/ha.d/ha.cf
node primary
ucast eth0 198.51.100.5
node secondary
ucast eth0 198.51.100.6

ファイルを保存して終了します。 次に、クラスターの認証キーを設定します。

authkeysファイルを作成する

認証キーは、クラスターメンバーがクラスターに参加できるようにするために使用されます。 この目的のために、ランダムなキーを簡単に生成できます。

primary ノードで、次のコマンドを実行して、AUTH_KEYという名前の環境変数に適切な認証キーを生成します。

if [ -z "${AUTH_KEY}" ]; then
  export AUTH_KEY="$(command dd if='/dev/urandom' bs=512 count=1 2>'/dev/null' \
      | command openssl sha1 \
      | command cut --delimiter=' ' --fields=2)"
fi

次に、次のコマンドを使用して/etc/ha.d/authkeysファイルを書き込みます。

sudo bash -c "{
  echo auth1
  echo 1 sha1 $AUTH_KEY
} > /etc/ha.d/authkeys"

authkeysファイルの内容を次のように確認します。

  1. sudo cat /etc/ha.d/authkeys

次のようになります(別の認証キーを使用)。

/etc/ha.d/authkeys
auth1
1 sha1 d1e6557e2fcb30ff8d4d3ae65b50345fa46a2faa

ファイルがrootユーザーのみが読み取れるようにします。

  1. sudo chmod 600 /etc/ha.d/authkeys

次に、/etc/ha.d/authkeysファイルをプライマリノードからセカンダリノードにコピーします。 これは手動で行うことも、scpを使用して行うこともできます。

セカンダリサーバーで、必ずauthkeysファイルの権限を設定してください。

  1. sudo chmod 600 /etc/ha.d/authkeys

この時点で、両方のサーバーに同一の/etc/ha.d/authkeysファイルが必要です。

haresourcesファイルを作成する

haresourcesファイルは、クラスターが管理するサービスとペアになっている優先ホストを指定します。 優先ホストは、ノードが使用可能な場合に関連するサービスを実行する必要があるノードです。 優先ホスト利用できない場合、つまり クラスタからは到達できず、他のノードの1つが引き継ぎます。 つまり、プライマリサーバーがダウンした場合、セカンダリサーバーが引き継ぎます。

両方のサーバーで、haresourcesファイルをお気に入りのエディターで開きます。 nanoを使用します:

  1. sudo nano /etc/ha.d/haresources

次に、この行をファイルに追加し、プライマリノードの名前が異なる場合はその名前に置き換えます。

/etc/ha.d/haresources
primary floatip

ファイルを保存して終了します。 これにより、 primary サーバーが、現在未定義のfloatipサービスの優先ホストとして構成されます。 次に、floatipサービスを設定しましょう。

フローティングIP再割り当てサービスを作成する

ハートビートクラスターは、floatipサービスを維持するように構成されています。このサービスを使用して、ノードはフローティングIPを自身に割り当てることができますが、それでもサービスを作成する必要があります。 ただし、サービス自体を設定する前に、DigitalOceanAPIを介してフローティングIPをそれを実行するノードに割り当てるスクリプトを作成しましょう。 次に、フローティングIP再割り当てスクリプトを実行するfloatipサービスを作成します。

割り当てIPスクリプトを作成する

この例では、DigitalOcean APIを使用して、特定のドロップレットIDにフローティングIPを割り当てる基本的なPythonスクリプトをダウンロードします。

両方のサーバーで、assign-ipPythonスクリプトをダウンロードします。

  1. sudo curl -L -o /usr/local/bin/assign-ip http://do.co/assign-ip

両方のサーバーで、実行可能にします。

  1. sudo chmod +x /usr/local/bin/assign-ip

スクリプトはAPIにリクエストを送信しているため、Python Requestsライブラリをインストールする必要があります。

sudo apt-get install python-requests

assign-ipスクリプトを使用するには、次の詳細が必要です。

  • フローティングIP:スクリプトの最初の引数、割り当てられているフローティングIP
  • ドロップレットID:スクリプトの2番目の引数、フローティングIPを割り当てる必要のあるドロップレットID
  • DigitalOcean PAT(APIトークン):環境変数DO_TOKENとして渡され、読み取り/書き込みDigitalOcean PAT

続行する前に、スクリプトの内容を確認してください。

これで、floatipサービスを作成する準備が整いました。

floatipサービスを作成する

floatipサービスを作成するには、前に作成したassign-ipスクリプトを呼び出し、start[に応答するinitスクリプトを作成するだけです。 X169X]サブコマンド。 このinitスクリプトは、Dropletメタデータサービスを介してサーバーのDropletIDを検索する役割を果たします。 また、再割り当てされるフローティングIPと、DigitalOcean APIトークン(前提条件のセクションに記載されているパーソナルアクセストークン)が必要になります。

両方のサーバーで、エディターで開いている/etc/init.d/floatipを追加します。

  1. sudo nano /etc/init.d/floatip

次に、このinitスクリプトをコピーして貼り付け、強調表示された部分をDigitalOceanAPIキーと再割り当てする必要のあるフローティングIPに置き換えます。

/etc/init.d/floatip
  1. #!/bin/bash
  2. param=$1
  3. export DO_TOKEN='your_DO_API_token'
  4. IP='your_floating_IP_address'
  5. ID=$(curl -s http://169.254.169.254/metadata/v1/id)
  6. if [ "start" == "$param" ] ; then
  7. python /usr/local/bin/assign-ip $IP $ID
  8. exit 0
  9. elif [ "stop" == "$param" ] ; then
  10. exit 0;
  11. elif [ "status" == "$param" ] ; then
  12. exit 0;
  13. else
  14. echo "no such command $param"
  15. exit 1;
  16. fi

ファイルを保存して終了します。

スクリプトを実行可能にします。

  1. sudo chmod u+x /etc/init.d/floatip

このfloatipサービスが開始されると、assign-ip Pythonスクリプトが呼び出され、指定されたフローティングIPがスクリプトを実行したドロップレットに割り当てられます。 これは、セカンダリ