前書き
ハートビートは、高可用性(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を自身に再割り当てします)。
[.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ドロップレット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アドレスを介していずれかのDropletにアクセスすると、Dropletのホスト名とIPアドレスを含む基本的なWebページが表示されます。これは、Floating IPがどのDropletを指すかをテストするのに役立ちます。
フローティングIPを作成する
DigitalOceanコントロールパネルで、トップメニューのNetworkingをクリックし、次にサイドメニューの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
で、両方のサーバーで同じようにセットアップする必要があります。
-
ha.cf:メンバーノードを含むハートビートクラスターのグローバル構成
-
authkeys:ノードにクラスターへの認証方法を提供するセキュリティキーが含まれています
-
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-ip
Pythonスクリプトをダウンロードします。
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アドレスを介してのみサーバーにアクセスできるようにする必要があることに注意してください。