前書き

Heartbeatは、クライアントサーバーにクラスターインフラストラクチャ機能(クラスターメンバーシップとメッセージング)を提供するオープンソースプログラムです。 これらの機能は、高可用性(HA)サーバーインフラストラクチャの重要なコンポーネントです。 このチュートリアルでは、Heartbeatとhttps://www.digitalocean.com/community/tutorials/how-to-use-floating-ips-on-digitaloceanを使用するだけで2ノードHAサーバーセットアップを作成する方法を示します[DigitalOcean Floating IP]。

ハートビートは通常、Pacemakerなどのクラスターリソースマネージャー(CRM)と組み合わせて使用​​して、完全なHAセットアップを実現します。 より堅牢なHAセットアップを作成する場合は、https://www.digitalocean.com/community/tutorials/how-to-create-a-high-availability-setup-with-corosync-pacemaker-andの使用を検討してください。 -floating-ips-on-ubuntu-14-04 [Corosync and Pacemaker]またはhttps://www.digitalocean.com/community/tutorials/how-to-set-up-highly-available-web-servers-with- keepalived-and-floating-ips-on-ubuntu-14-04 [Keepalived]。

Goal

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

image:https://assets.digitalocean.com/articles/high_availability/ha-diagram-animated.gif [アクティブ/パッシブ図]

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

  • トラフィックを受信する2つのドロップレットを作成します

  • フローティングIPを作成し、それをドロップレットの1つに割り当てます

  • フローティングIPを指すDNS Aレコードを作成します(オプション)

  • ハートビートをドロップレットにインストールする

  • フローティングIP再割り当てサービスを実行するようにハートビートを構成する

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

  • フェールオーバーをテストする

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

前提条件

フローティングIPの再割り当てを自動化するには、DigitalOcean APIを使用する必要があります。 つまり、Personal Access Token(PAT)を生成する必要があります。PATは、_read_および_write_アクセスを使用して、DigitalOceanアカウントの認証に使用できるAPIトークンです。 https://www.digitalocean.com/community/tutorials/how-to-use-the-digitalocean-api-v2#how-to-generate-a-personal-access-token[How APIチュートリアルの「パーソナルアクセストークンを生成するには」セクション。 PATは、クラスター内の両方のサーバーに追加されるスクリプトで使用されます。 DigitalOceanアカウントに完全にアクセスできるため、参照用に安全な場所に保管することが重要です。

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

詳細については、リンクされたチュートリアルをご覧ください。

液滴を作成する

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

このbashスクリプトをユーザーデータとして、2つのUbuntu 16.04ドロップレット、* primary および secondary *を作成します。

ユーザーデータの例

#!/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アドレスを介していずれかのDropletにアクセスすると、Dropletのホスト名とIPアドレスを含む基本的なWebページが表示されます。これは、Floating IPがどのDropletを指すかをテストするのに役立ちます。

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

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

image:https://assets.digitalocean.com/articles/heartbeat_1604/assign_floating_ip.png [フローティングIPなし]

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

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

http://

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

DNSの構成(オプション)

ドメイン名を使用してHAセットアップにアクセスできるようにする場合は、DNSに* Aレコード*を作成して、ドメインがフローティングIPアドレスを指すようにします。 ドメインでDigitalOceanのネームサーバーを使用している場合は、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-host-name-with-digitalocean#step-three%E2%80%94configureに従ってください-DigitalOceanを使用してホスト名を設定する方法のチュートリアルの-your-domain [ステップ3]。 伝播すると、ドメイン名を介してアクティブなサーバーにアクセスできます。

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

Heartbeatをインストールする

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

sudo apt-get update
sudo apt-get install heartbeat

これでハートビートがインストールされましたが、何もしない前に設定する必要があります。

ハートビートを構成する

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

  1. * + ha.cf + *-メンバーノードを含むHeartbeatクラスターのグローバル構成

  2. * + authkeys + *-ノードがクラスターに対して認証する方法を提供するセキュリティキーが含まれています

  3. * + haresources + *-クラスターおよびサービスの優先所有者であるノードによって管理されるサービスを指定します。 このファイルは、PacemakerなどのCRMを使用するセットアップでは使用されないことに注意してください。

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

ノード情報の収集

`+ ha.cf `を設定する前に、各ノードの名前を検索する必要があります。 Heartbeatでは、各ノード名がそれぞれの「 uname -n +」出力と一致する必要があります。

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

uname -n

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

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

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

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 /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を使用します。

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

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

この構成をコピーしてファイルに貼り付け、それぞれのノード名とIPアドレスを以前に検索した値に置き換えます。 この例では、* primary *のIPアドレスは `+ 198.51.100.5 `で、* secondary *のIPアドレスは ` 198.51.100.6 +`です。

/etc/ha.d/ha.cf

node
ucast eth0
node
ucast eth0

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

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 +`ファイルの内容を確認します。

sudo cat /etc/ha.d/authkeys

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

/etc/ha.d/authkeys

auth1
1 sha1

ファイルがrootユーザーのみによって読み取り可能であることを確認します。

sudo chmod 600 /etc/ha.d/authkeys

ここで、プライマリノードからセカンダリノードに「+ / etc / ha.d / authkeys 」ファイルをコピーします。 これは手動で、または ` scp +`で実行できます。

*セカンダリ*サーバーで、 `+ authkeys +`ファイルのパーミッションを必ず設定してください:

sudo chmod 600 /etc/ha.d/authkeys

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

haresourcesファイルを作成する

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

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

sudo nano /etc/ha.d/haresources

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

/etc/ha.d/haresources

floatip

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

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

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

assign-ipスクリプトを作成

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

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

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

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

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

スクリプトはAPIにリクエストを行っているため、Python https://www.digitalocean.com/community/tutorials/how-to-work-with-web-data-using-requests-and-beautifulが必要です。 -soup-with-python-3 [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 `および ` stop +`サブコマンドに応答するinitスクリプトを作成するだけです。 この初期化スクリプトは、Dropletメタデータサービスを介して、サーバーのDroplet IDを検索する役割を果たします。 また、再割り当てされるフローティングIP、およびDigitalOcean APIトークン(前提条件セクションで言及されている個人アクセストークン)が必要です。

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

sudo nano /etc/init.d/floatip

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

/etc/init.d/floatip

#!/bin/bash

param=$1

export DO_TOKEN=''
IP=''
ID=$(curl -s http://169.254.169.254/metadata/v1/id)

if [ "start" == "$param" ] ; then
 python /usr/local/bin/assign-ip $IP $ID
 exit 0
elif [ "stop" == "$param" ] ; then
 exit 0;
elif [ "status" == "$param" ] ; then
 exit 0;
else
 echo "no such command $param"
 exit 1;
fi

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

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

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

この + floatip +`サービスが開始されると、 `+ assign-ip + Pythonスクリプトを呼び出し、指定されたフローティングIPをスクリプトを実行したドロップレットに割り当てます。 これは、* primary サーバーに障害が発生した場合に、Floating IPを自分自身に再割り当てするために、 secondary *サーバーによって呼び出されるスクリプトです。 同様に、*プライマリ*サーバーが同じスクリプトを使用して、クラスターに再参加すると、フローティングIPを再利用します。

ハートビートを開始

Heartbeatが設定され、Heartbeatが依存するすべてのスクリプトが設定されたので、Heartbeatクラスタを開始する準備ができました!

*両方のサーバー*で、次のコマンドを実行してハートビートを開始します。

sudo systemctl start heartbeat

HAのセットアップが完了しました! 次に進む前に、意図したとおりに機能することをテストしましょう。

高可用性のテスト

高可用性セットアップが機能することをテストすることが重要です。それでは、それを実行しましょう。

現在、フローティングIPは* primary *ノードに割り当てられています。 IPアドレスまたはそれを指しているドメイン名を使用して、フローティングIPにアクセスすると、*プライマリ*サーバーのインデックスページが表示されます。 サンプルのユーザーデータスクリプトを使用した場合、次のようになります。

Floating IP is pointing to primary serverDroplet: , IP Address:

これは、実際にはフローティングIPがプライマリドロップレットに割り当てられていることを示しています。

次に、ローカル端末を開いて、「+ curl +」を使用して1秒のループでフローティングIPにアクセスします。 これを行うにはこのコマンドを使用しますが、必ずURLをドメインまたはフローティングIPアドレスに置き換えてください。

while true; do curl http://; sleep 1; done

現在、これはプライマリサーバーの同じドロップレット名とIPアドレスを出力します。 プライマリサーバーの電源を切るか、ハートビートサービスを停止することでプライマリサーバーに障害が発生した場合、フローティングIPがセカンダリサーバーに再割り当てされるかどうかがわかります。

ここで*プライマリ*サーバーを再起動しましょう。 これを行うには、DigitalOceanコントロールパネルを使用するか、プライマリサーバーで次のコマンドを実行します。

sudo reboot

しばらくすると、プライマリサーバーが使用できなくなります。 ターミナルで実行されている `+ curl +`ループの出力に注意してください。 次のような出力が表示されるはずです。

curl loop output:Droplet: , IP Address:
...
curl: (7) Failed to connect to  port 80: Connection refused
Droplet: , IP Address:
Droplet: , IP Address:
...

つまり、*セカンダリ*サーバーのIPアドレスを指すように、フローティングIPアドレスを再割り当てする必要があります。 これは、正常な自動フェールオーバーが発生したため、HAセットアップが機能していることを意味します。

プライマリサーバーの障害とフローティングIPの再割り当てが完了するまでの間にフローティングIPにアクセスしようとすると、「接続拒否」エラーが表示される場合と表示されない場合があります。

これで、DigitalOceanコントロールパネルから*プライマリ*ドロップレットの電源を入れることができます。 ハートビートは、プライマリIPアドレスを*優先ホスト*として設定してフローティングIP再割り当てスクリプトを実行するため、フローティングIPは、プライマリサーバーが再び使用可能になるとすぐに自動的にポイントします。

結論

おめでとうございます。 これで、HeartbeatとDigitalOcean Floating IPを使用した基本的なHAサーバーのセットアップが完了しました。

より堅牢なHAセットアップを作成する場合は、https://www.digitalocean.com/community/tutorials/how-to-create-a-high-availability-setup-with-corosync-pacemaker-andの使用を検討してください。 -floating-ips-on-ubuntu-14-04 [Corosync and Pacemaker]またはhttps://www.digitalocean.com/community/tutorials/how-to-set-up-highly-available-web-servers-with- keepalived-and-floating-ips-on-ubuntu-14-04 [Keepalived]。

この例では、Nginxを基本的なロードバランサーとしてインストールしましたが、リバースプロキシロードバランサーを使用してハートビートのセットアップを改善したい場合は、https://www.digitalocean.com/community/ tutorials / how-to-configure-nginx-as-a-a-a-web-server-and-reverse-proxy-for-apache-on-one-ubuntu-14-04-droplet [Nginx]を1つとして使用するか、HAProxyを使用します。

どちらの選択肢を使用する場合でも、ロードバランサー/リバースプロキシを*アンカーIPアドレス*にバインドして、ユーザーがサーバーにアクセスできるのはフローティングIPアドレスのみであることに注意してください。各サーバーのパブリックIPアドレス)。