Ubuntu14.04でハートビートと予約済みIPを使用して高可用性セットアップを作成する方法
序章
Heartbeatは、クラスターインフラストラクチャ機能(クラスターメンバーシップとメッセージング)をクライアントサーバーに提供するオープンソースプログラムです。これは、高可用性(HA)サーバーインフラストラクチャの重要なコンポーネントです。 ハートビートは通常、Pacemakerなどのクラスターリソースマネージャー(CRM)と組み合わせて使用され、完全なHAセットアップを実現します。 ただし、このチュートリアルでは、HeartbeatとDigitalOceanReservedIPを使用して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_reserved_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:メンバーノードを含むハートビートクラスターのグローバル構成
- authkeys:ノードにクラスターへの認証方法を提供するセキュリティキーが含まれています
- haresources:クラスターによって管理されるサービスと、サービスの優先所有者であるノードを指定します。 このファイルは、PacemakerのようなCRMを使用するセットアップでは使用されないことに注意してください
また、プライマリDropletの可用性が変更された場合に、予約済みIPの再割り当てを実行するスクリプトを提供する必要があります。
ノード情報を収集する
設定する前に ha.cf
、各ノードの名前を検索する必要があります。 ハートビートでは、各ノード名がそれぞれのノード名と一致する必要があります uname -n
出力。
両方のサーバーで、次のコマンドを実行して適切なノード名を検索します。
- uname -n
コマンドの出力に注意してください。 ノード名の例は「primary」と「secondary」で、これはドロップレットの名前と一致します。
また、各ノードがクラスターの他の部分との通信に使用するネットワークインターフェイスとIPアドレスを調べて、使用可能なノードを特定する必要があります。 各ノードがクラスター内の他のノードに到達できる限り、任意のネットワークインターフェイスを使用できます。 ドロップレットのパブリックインターフェイスを使用します。 eth0
.
両方のサーバーで、このコマンドを使用して、 eth0
インターフェイス(または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アドレスを前に調べた値に置き換えます。 この例では、primaryの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ファイルを作成する
The haresources
ファイルは、クラスターが管理するサービスとペアになっている優先ホストを指定します。 優先ホストは、ノードが使用可能な場合に関連するサービスを実行する必要があるノードです。 優先ホストが利用できない場合、つまり クラスタからは到達できず、他のノードの1つが引き継ぎます。 つまり、プライマリサーバーがダウンした場合、セカンダリサーバーが引き継ぎます。
両方のサーバーで、 haresources
お気に入りのエディタでファイルします。 使用します vi
:
- sudo vi /etc/ha.d/haresources
次に、この行をファイルに追加し、プライマリノードの名前に置き換えます。
- primary floatip
保存して終了。 これにより、primaryサーバーが floatip
現在未定義のサービス。 を設定しましょう floatip
次のサービス。
予約済みIP再割り当てサービスの作成
ハートビートクラスターは、 floatip
サービス。ノードがそれ自体に予約済みIPを割り当てるために使用できますが、それでもサービスを作成する必要があります。 ただし、サービス自体を設定する前に、DigitalOceanAPIを介して予約済みIPをそれを実行するノードに割り当てるスクリプトを作成しましょう。 次に、を作成します floatip
予約済みIP再割り当てスクリプトを実行するサービス。
割り当て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
サービス、私たちがする必要があるのは、を呼び出すinitスクリプトを作成することです assign-ip
以前に作成したスクリプトで、 start
と stop
サブコマンド。 このinitスクリプトは、Dropletメタデータサービスを介してサーバーのDropletIDを検索する役割を果たします。 また、再割り当てされる予約済みIPと、DigitalOcean APIトークン(前提条件のセクションに記載されているパーソナルアクセストークン)が必要になります。
両方のサーバーで、オープンを追加します /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にアクセスすると、プライマリサーバーのインデックスページが表示されます。 サンプルのユーザーデータスクリプトを使用した場合、次のようになります。
Reserved 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コントロールパネルを介して、プライマリドロップレットの電源を入れることができます。 ハートビートはプライマリドロップレットを優先ホストとして構成され、予約済みIP再割り当てスクリプトを実行するため、予約済みIPは、再び使用可能になるとすぐにプライマリサーバーを自動的に指し示します。
結論
おめでとう! これで、HeartbeatとDigitalOcean予約済みIPを使用した基本的なHAサーバーのセットアップが完了しました。
より堅牢なHAセットアップを作成する場合は、CorosyncおよびPacemakerまたはKeepalivedの使用を検討してください。
Heartbeatセットアップを拡張する場合、次のステップは、サンプルのNginxセットアップをリバースプロキシロードバランサーに置き換えることです。 この目的のためにNginxまたはHAProxyを使用できます。 ロードバランサーをアンカーIPアドレスにバインドして、ユーザーが予約済みIPアドレスを介してのみ(各サーバーのパブリックIPアドレスを介してではなく)サーバーにアクセスできるようにする必要があることに注意してください。 。