Ubuntu 14.04でハートビートとフローティングIPを使用して高可用性セットアップを作成する方法

前書き

ハートビートは、高可用性(HA)サーバーインフラストラクチャの重要なコンポーネントであるクライアントサーバーにクラスターインフラストラクチャ機能(クラスターメンバーシップとメッセージング)を提供するオープンソースプログラムです。 ハートビートは通常、Pacemakerなどのクラスターリソースマネージャー(CRM)と組み合わせて使用​​して、完全なHAセットアップを実現します。 ただし、このチュートリアルでは、HeartbeatとDigitalOcean Floating IPを使用するだけで2ノードHAサーバーのセットアップを作成する方法を示します。

より堅牢なHAセットアップを作成する場合は、Corosync and PacemakerまたはKeepalivedの使用を検討してください。

Goal

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

Active/passive Diagram

[.note]#Note:このチュートリアルでは、ゲートウェイレベルでのアクティブ/パッシブ高可用性の設定についてのみ説明します。 つまり、フローティングIPと、load balancerサーバー(プライマリおよびセカンダリ)が含まれます。 さらに、デモンストレーションの目的で、各サーバーでリバースプロキシロードバランサーを構成する代わりに、それぞれのホスト名とパブリックIPアドレスで応答するように構成するだけです。

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

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

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

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

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

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

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

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

前提条件

フローティングIPの再割り当てを自動化するには、DigitalOcean APIを使用する必要があります。 つまり、Personal Access Token(PAT)を生成する必要があります。これは、DigitalOceanアカウントへの認証に使用できるAPIトークンであり、readおよびwriteアクセスで%(t2 )APIチュートリアルのセクション。 PATはクラスター内の両方のサーバーに追加されるスクリプトで使用されるため、参照用にDigitalOceanアカウントへのフルアクセスを許可するため、安全な場所に保管してください。

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

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

液滴を作成する

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

このbashスクリプトをユーザーデータとして使用して、2つのUbuntu 14.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 > /usr/share/nginx/html/index.html

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

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

DigitalOceanコントロールパネルで、トップメニューのNetworkingをクリックし、次にサイドメニューのFloating IPsをクリックします。

No Floating IPs

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

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

http://your_floating_ip

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

DNSの構成(オプション)

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

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

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出力と一致する必要があります。

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

uname -n

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

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

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

ip addr show eth0
ip addr show eth0 output:2: eth0:  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 104.236.6.11/18 brd 104.236.63.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ファイルを作成する

both serversで、お気に入りのエディターで/etc/ha.d/ha.cfを開きます。 viを使用します:

sudo vi /etc/ha.d/ha.cf

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

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

node primary
ucast eth0 104.236.6.11
node secondary
ucast eth0 104.236.6.22

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

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 example:auth1
1 sha1 d1e6557e2fcb30ff8d4d3ae65b50345fa46a2faa

ファイルがルートでのみ読み取り可能であることを確認します。

sudo chmod 600 /etc/ha.d/authkeys

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

secondaryサーバーで、必ずauthkeysファイルのアクセス許可を設定してください。

sudo chmod 600 /etc/ha.d/authkeys

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

haresourcesファイルを作成する

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

both serversで、お気に入りのエディターでharesourcesファイルを開きます。 viを使用します:

sudo vi /etc/ha.d/haresources

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

/etc/ha.d/haresources

primary floatip

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

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

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

assign-ipスクリプトを作成します

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

both serversで、assign-ipPythonスクリプトをダウンロードします。

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

both serversで、実行可能にします。

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

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

  • Floating IP:スクリプトの最初の引数、割り当てられているフローティングIP

  • Droplet ID:スクリプトの2番目の引数、フローティングIPを割り当てる必要のあるドロップレットID

  • DigitalOcean PAT (API token):環境変数DO_TOKENとして渡され、読み取り/書き込みDigitalOcean PAT

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

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

floatipサービスを作成する

floatipサービスを作成するには、前に作成したassign-ipスクリプトを呼び出し、startおよびstopサブコマンドに応答するinitスクリプトを作成するだけです。 この初期化スクリプトは、Dropletメタデータサービスを介して、サーバーのDroplet IDを検索する役割を果たします。 また、再割り当てされるフローティングIP、およびDigitalOcean APIトークン(前提条件セクションで言及されている個人アクセストークン)が必要です。

both serversで、エディターで開いている/etc/init.d/floatipを追加します。

sudo vi /etc/init.d/floatip

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

/etc/init.d/floatip

#!/bin/bash

param=$1

export DO_TOKEN='b7d03a6947b217efb6f3ec3bd3504582'
IP='45.55.96.8'
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サーバーに障害が発生した場合に、フローティングIPをそれ自体に再割り当てするためにsecondaryサーバーによって呼び出されるスクリプトです。 同様に、同じスクリプトがprimaryサーバーによって使用され、クラスターに再参加すると、フローティングIPを再利用します。

ハートビートを開始

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

both serversで、次のコマンドを実行してハートビートを開始します。

sudo service heartbeat start

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

Heartbeat output:Starting High-Availability services: Done.

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

高可用性のテスト

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

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

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

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

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

while true; do curl http://example.com; sleep 1; done

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

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

sudo poweroff

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

curl loop output:Droplet: primary, IP Address: 104.236.6.11
...
curl: (7) Failed to connect to example.com port 80: Connection refused
Droplet: secondary, IP Address: 104.236.6.22
Droplet: secondary, IP Address: 104.236.6.22
...

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

Connection refusedエラーが表示される場合と表示されない場合があります。これは、プライマリサーバーの障害とフローティングIPの再割り当ての完了の間にフローティングIPにアクセスしようとした場合に発生する可能性があります。

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

結論

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

より堅牢なHAセットアップを作成する場合は、Corosync and PacemakerまたはKeepalivedの使用を検討してください。

Heartbeatセットアップを拡張する場合、次のステップは、例のNginxセットアップをリバースプロキシロードバランサーに置き換えることです。 この目的でNginxまたはHAProxyを使用できます。 ロードバランサーをanchor IP addressにバインドして、ユーザーが(各サーバーのパブリックIPアドレスではなく)フローティングIPアドレスを介してのみサーバーにアクセスできるようにする必要があることに注意してください。

Related