Ubuntu14.04でハートビートとフローティングIPを使用して高可用性セットアップを作成する方法
序章
Heartbeatは、クラスターインフラストラクチャ機能(クラスターメンバーシップとメッセージング)をクライアントサーバーに提供するオープンソースプログラムです。これは、高可用性(HA)サーバーインフラストラクチャの重要なコンポーネントです。 ハートビートは通常、完全なHAセットアップを実現するために、Pacemakerなどのクラスターリソースマネージャー(CRM)と組み合わせて使用されます。 ただし、このチュートリアルでは、HeartbeatとDigitalOceanFloatingIPを使用して2ノードのHAサーバーセットアップを作成する方法を示します。
より堅牢なHAセットアップを作成する場合は、CorosyncおよびPacemakerまたはKeepalivedの使用を検討してください。
ゴール
完了すると、HAセットアップはアクティブ/パッシブ構成の2台のUbuntu14.04サーバーで構成されます。 これは、障害が検出されない限り、ユーザーがサービスまたはWebサイトにアクセスする方法であるフローティングIPをポイントして、プライマリサーバーまたはアクティブサーバーをポイントすることによって実現されます。 Heartbeatサービスがプライマリサーバーが利用できないことを検出した場合、セカンダリサーバーは自動的にスクリプトを実行して、DigitalOceanAPIを介してフローティングIPを自身に再割り当てします。 したがって、フローティングIPへの後続のネットワークトラフィックはセカンダリサーバーに転送されます。セカンダリサーバーは、プライマリサーバーが再び使用可能になるまでアクティブサーバーとして機能します(その時点で、プライマリサーバーはフローティングIPをそれ自体に再割り当てします)。
注:このチュートリアルでは、ゲートウェイレベルでのアクティブ/パッシブ高可用性の設定についてのみ説明します。 つまり、フローティングIPと、ロードバランサーサーバー(プライマリおよびセカンダリ)が含まれます。 さらに、デモンストレーションの目的で、各サーバーでリバースプロキシロードバランサーを構成する代わりに、それぞれのホスト名とパブリックIPアドレスで応答するようにサーバーを構成するだけです。
この目標を達成するために、次の手順に従います。
- トラフィックを受信する2つのドロップレットを作成します
- フローティングIPを作成し、ドロップレットの1つに割り当てます
- DNSの作成フローティングIPを指すレコード(オプション)
- ドロップレットにハートビートをインストールする
- フローティングIP再割り当てサービスを実行するようにハートビートを構成する
- フローティングIP再割り当てサービスを作成する
- フェイルオーバーのテスト
前提条件
フローティングIPの再割り当てを自動化するには、DigitalOceanAPIを使用する必要があります。 つまり、Personal Access Token(PAT)を生成する必要があります。これは、DigitalOceanアカウントへの認証に使用できるAPIトークンであり、次の方法で読み取りおよび書き込みアクセスが可能です。 APIチュートリアルのパーソナルアクセストークンの生成方法セクション。 PATは、クラスター内の両方のサーバーに追加されるスクリプトで使用されるため、参照用に、DigitalOceanアカウントへのフルアクセスを許可するため、安全な場所に保管してください。
APIに加えて、このチュートリアルでは次のDigitalOcean機能を利用します。
それらについてもっと知りたい場合は、リンクされたチュートリアルを読んでください。
ドロップレットを作成する
最初のステップは、同じデータセンターに2つのUbuntuドロップレットを作成することです。これは、上記のプライマリサーバーとセカンダリサーバーとして機能します。 セットアップ例では、簡単に参照できるように「プライマリ」と「セカンダリ」という名前を付けます。 両方のドロップレットにNginxをインストールし、それらのインデックスページをそれらを一意に識別する情報に置き換えます。 これにより、HAセットアップが機能していることを簡単に示すことができます。 実際のセットアップでは、サーバーで選択したWebサーバーまたはロードバランサーを実行する必要があります。
次のbashスクリプトをユーザーデータとして使用して、2つのUbuntu14.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 > /usr/share/nginx/html/index.html
これにより、Nginxがインストールされ、index.html
の内容がドロップレットのホスト名とIPアドレスに置き換えられます(メタデータサービスを参照することにより)。 パブリックIPアドレスを介していずれかのドロップレットにアクセスすると、ドロップレットのホスト名とIPアドレスが記載された基本的なWebページが表示されます。これは、フローティングIPが任意の時点で指しているドロップレットをテストするのに役立ちます。
フローティングIPを作成する
DigitalOceanコントロールパネルで、トップメニューのネットワークをクリックし、次にサイドメニューのフローティングIPをクリックします。
プライマリドロップレットにフローティング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
で、両方のサーバーで同じようにセットアップする必要があります。
- ha.cf:メンバーノードを含むHeartbeatクラスターのグローバル構成
- authkeys:ノードにクラスターへの認証方法を提供するセキュリティキーが含まれています
- haresources:クラスターによって管理されるサービスと、サービスの優先所有者であるノードを指定します。 このファイルは、PacemakerのようなCRMを使用するセットアップでは使用されないことに注意してください
また、プライマリドロップレットの可用性が変更された場合にフローティングIPの再割り当てを実行するスクリプトを提供する必要があります。
ノード情報を収集する
ha.cf
を構成する前に、各ノードの名前を調べる必要があります。 ハートビートでは、各ノード名がそれぞれのuname -n
出力と一致する必要があります。
両方のサーバーで、次のコマンドを実行して適切なノード名を検索します。
- uname -n
コマンドの出力に注意してください。 ノード名の例は「primary」と「secondary」で、これはドロップレットの名前と一致します。
また、各ノードがクラスターの他の部分との通信に使用するネットワークインターフェイスとIPアドレスを調べて、使用可能なノードを特定する必要があります。 各ノードがクラスター内の他のノードに到達できる限り、任意のネットワークインターフェイスを使用できます。 ドロップレットのパブリックインターフェイスを使用します。これはたまたま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 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ファイルを作成します
両方のサーバーで、お気に入りのエディターで/etc/ha.d/ha.cf
を開きます。 vi
を使用します:
- sudo vi /etc/ha.d/ha.cf
ファイルは新しく、空である必要があります。 クラスタ内の各ノードのネットワークインターフェイスと名前を追加する必要があります。
この構成をコピーしてファイルに貼り付けてから、それぞれのノード名とIPアドレスを前に調べた値に置き換えます。 この例では、プライマリのIPアドレスは104.236.6.11
であり、セカンダリの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
ファイルが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
ファイルをお気に入りのエディターで開きます。 vi
を使用します:
- sudo vi /etc/ha.d/haresources
次に、この行をファイルに追加し、プライマリノードの名前に置き換えます。
- primary floatip
保存して終了。 これにより、 primary サーバーが、現在未定義のfloatip
サービスの優先ホストとして構成されます。 次に、floatip
サービスを設定しましょう。
フローティングIP再割り当てサービスを作成する
ハートビートクラスターは、floatip
サービスを維持するように構成されています。このサービスを使用して、ノードはフローティングIPを自身に割り当てることができますが、それでもサービスを作成する必要があります。 ただし、サービス自体を設定する前に、DigitalOceanAPIを介してフローティングIPをそれを実行するノードに割り当てるスクリプトを作成しましょう。 次に、フローティングIP再割り当てスクリプトを実行するfloatip
サービスを作成します。
割り当て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
assign-ip
スクリプトを使用するには、次の詳細が必要です。
- フローティングIP:スクリプトの最初の引数、割り当てられているフローティングIP
- ドロップレットID:スクリプトの2番目の引数、フローティングIPを割り当てる必要のあるドロップレットID
- DigitalOcean PAT(APIトークン):環境変数
DO_TOKEN
として渡され、読み取り/書き込みDigitalOcean PAT
続行する前に、スクリプトの内容を確認してください。
これで、floatip
サービスを作成する準備が整いました。
floatipサービスを作成する
floatip
サービスを作成するには、前に作成したassign-ip
スクリプトを呼び出し、start
と
両方のサーバーで、エディターで開いている/etc/init.d/floatip
を追加します。
- sudo vi /etc/init.d/floatip
次に、このinitスクリプトをコピーして貼り付け、強調表示された部分をDigitalOceanAPIキーと再割り当てする必要のあるフローティングIPに置き換えます。
- #!/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がスクリプトを実行したドロップレットに割り当てられます。 これは、プライマリサーバーに障害が発生した場合に、フローティングIPをそれ自体に再割り当てするためにセカンダリサーバーによって呼び出されるスクリプトです。 同様に、 primary サーバーは、クラスターに再参加すると、同じスクリプトを使用してフローティングIPを再利用します。
ハートビートを開始
Heartbeatが構成され、Heartbeatが依存するすべてのスクリプトが設定されたので、Heartbeatクラスターを開始する準備が整いました。
両方のサーバーで、次のコマンドを実行してハートビートを開始します。
- sudo service heartbeat start
次のような出力が表示されます。
Heartbeat output:Starting High-Availability services: Done.
これでHAのセットアップが完了しました。 先に進む前に、意図したとおりに機能することをテストしましょう。
高可用性のテスト
高可用性セットアップが機能することをテストすることが重要なので、今すぐ実行しましょう。
現在、フローティングIPはprimaryノードに割り当てられています。 IPアドレスまたはそれを指しているドメイン名を介してフローティングIPにアクセスすると、プライマリサーバーのインデックスページが表示されます。 サンプルのユーザーデータスクリプトを使用した場合、次のようになります。
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がセカンダリサーバーに再割り当てされるかどうかを確認します。
プライマリサーバーの電源を切りましょう。 これを行うには、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アドレスを指すように、フローティングIPアドレスを再割り当てする必要があります。 これは、自動フェイルオーバーが成功したため、HAセットアップが機能していることを意味します。
Connection refused
エラーが表示される場合と表示されない場合があります。このエラーは、プライマリサーバーの障害とフローティングIPの再割り当ての完了の間にフローティングIPにアクセスしようとした場合に発生する可能性があります。
これで、DigitalOceanコントロールパネルを介して、プライマリドロップレットの電源を入れることができます。 Heartbeatはプライマリドロップレットを優先ホストとして構成してフローティングIP再割り当てスクリプトを実行するため、フローティングIPは、プライマリサーバーが再び利用可能になるとすぐに自動的にプライマリサーバーを指し示します。
結論
おめでとう! これで、HeartbeatとDigitalOceanFloatingIPを使用した基本的なHAサーバーのセットアップが完了しました。
より堅牢なHAセットアップを作成する場合は、CorosyncおよびPacemakerまたはKeepalivedの使用を検討してください。
Heartbeatセットアップを拡張する場合、次のステップは、サンプルのNginxセットアップをリバースプロキシロードバランサーに置き換えることです。 この目的のためにNginxまたはHAProxyを使用できます。 ロードバランサーをアンカーIPアドレスにバインドして、ユーザーがフローティングIPアドレスを介してのみ(各サーバーのパブリックIPアドレスを介してではなく)サーバーにアクセスできるようにする必要があることに注意してください。 。