CentOS 7でPacemaker、Corosync、Floating IPを使用して高可用性セットアップを作成する方法

前書き

Corosyncは、アプリケーション内に高可用性を実装するために使用されるオープンソースのクラスターエンジンです。 一般的に* messaging layer *と呼ばれるCorosyncは、Pacemakerなどのクラスターリソースマネージャーを実行できる複製ステートマシンを作成するためのクラスターメンバーシップと閉じた通信モデルを提供します。 Corosyncはクラスターノードを相互に接続する基盤システムと見なすことができますが、Pacemakerはクラスターを監視し、障害発生時にアクションを実行します。

このチュートリアルでは、CorosyncとPacemakerを使用して、CentOS 7サーバーとフローティングIPを備えたDigitalOcean上に高可用性(HA)インフラストラクチャを作成する方法を示します。 クラスターノードのセットアップと管理のプロセスを容易にするために、CorosyncとPacemakerの両方と対話するコマンドラインインターフェイスであるPCSを使用します。

前提条件

このガイドに従うには、次のものが必要です。

  • https://www.digitalocean.com/community/tutorials/how-to-set-up-and-use-digitalocean-private-networking [プライベートネットワーク]が有効になっている同じデータセンターにある2つのCentOS 7ドロップレット

  • 非ルートsudoユーザー。https://www.digitalocean.com/community/tutorials/initial-server-setup-with-centos-7 [Initial Server Setup]チュートリアルに従って設定できます。

  • DigitalOcean APIへのパーソナルアクセストークン。チュートリアルhttps://www.digitalocean.com/community/tutorials/how-to-use-the-digitalocean-api-v2[DigitalOceanの使用方法]に従って生成できます。 API V2]

これらのドロップレットを作成するときは、説明的なホスト名を使用してそれらを一意に識別します。 このチュートリアルでは、これらのドロップレットを* primary および secondary *と呼びます。

次に進む準備ができたら、 `+ sudo +`ユーザーで両方のサーバーにログインしていることを確認してください。

ステップ1-Nginxのセットアップ

速度を上げるために、Nginxをインストールし、その特定のサーバーに関する情報を含む基本的なWebページをセットアップする単純なhttp://do.co/nginx-centos [シェルスクリプト]を使用します。 この方法により、フローティングIPセットアップで現在アクティブなサーバーを簡単に識別できます。 スクリプトは、DigitalOceanのhttps://www.digitalocean.com/community/tutorials/an-introduction-to-droplet-metadata [メタデータサービス]を使用して、ドロップレットのIPアドレスとホスト名を取得します。

スクリプトを実行するには、両方のサーバーで次のコマンドを実行します。

sudo curl -L -o install.sh http://do.co/nginx-centos
sudo chmod +x install.sh
sudo ./install.sh

スクリプトの実行が完了したら、ブラウザからパブリックIPアドレスを介していずれかのDropletにアクセスすると、Dropletのホスト名とIPアドレスを示す基本的なWebページが表示されます。

ステップ2-フローティングIPを作成して割り当てる

最初のステップは、フローティングIPを作成し、それを* primary サーバーに割り当てることです。 DigitalOceanコントロールパネルで、トップメニューの[*ネットワーク]をクリックし、サイドメニューで[*フローティングIP *]をクリックします。

次のようなページが表示されるはずです。

image:https://assets.digitalocean.com/site/ControlPanel/fip_no_floating_ips.png [フローティングIPコントロールパネル]

*プライマリ*サーバーを選択し、「Assign Floating IP」ボタンをクリックします。 フローティングIPが割り当てられたら、ブラウザからフローティングIPアドレスにアクセスして、*プライマリ*ドロップレットに到達できることを確認します。

http://

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

手順3-IP再割り当てスクリプトの作成

この手順では、DigitalOcean APIを使用して、フローティングIPを別のドロップレットに再割り当てする方法を示します。 後で、クラスターがノードの1つで障害を検出したときにこのスクリプトを実行するようにPacemakerを構成します。

この例では、Floating IPアドレスとDroplet IDを引数として使用して、Floating IPを特定のDropletに割り当てる基本的なPythonスクリプトを使用します。 ドロップレットのIDは、メタデータサービスを使用してドロップレット自体から取得できます。

まず、 `+ assign-ip +`スクリプトをダウンロードして実行可能にします。 スクリプトをダウンロードする前に、スクリプトの内容を自由に確認してください。

次の2つのコマンドは、両方のサーバー(プライマリおよびセカンダリ)で実行する必要があります。

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 APIトークン*:環境変数DO_TOKENとして渡され、読み取り/書き込みDigitalOceanパーソナルアクセストークン

IP再割り当てスクリプトのテスト

発生しているIPの再割り当てを監視するために、 `+ curl +`コマンドを使用して、各リクエストの間隔が1秒のループでフローティングIPアドレスにアクセスできます。

新しいローカル端末を開き、次のコマンドを実行して、実際のフローティングIPアドレスに置き換えてください。

while true; do curl ; sleep 1; done

このコマンドは、 `+ CTRL + C +`で中断されるまでアクティブなターミナルで実行し続けます。 フローティングIPが現在割り当てられているサーバーによってホストされているWebページを取得するだけです。 出力は次のようになります。

OutputDroplet: primary, IP Address:
Droplet: primary, IP Address:
Droplet: primary, IP Address:
...

次に、「+ assign-ip +」スクリプトを実行して、フローティングIPを* secondary *ドロップレットに再割り当てします。 DigitalOceanのメタデータサービスを使用して現在のドロップレットIDを取得し、スクリプトへの引数として使用します。 メタデータサービスからDropletのIDを取得するには、次のようにします。

curl -s http://169.254.169.254/metadata/v1/id

ここで、「+ 169.254.169.254+」はメタデータサービスで使用される静的IPアドレスであるため、変更しないでください。 この情報は、ドロップレット内からのみ利用できます。

スクリプトを実行する前に、DigitalOcean APIトークンを含む_DO_TOKEN_環境変数を設定する必要があります。 *セカンダリ*サーバーから次のコマンドを実行し、DigitalOcean APIへの読み取り/書き込みパーソナルアクセストークンに置き換えることを忘れないでください:

export DO_TOKEN=

まだ* secondary *サーバーで、フローティングIPアドレスに置き換えて `+ assign-ip +`スクリプトを実行します:

assign-ip  `curl -s http://169.254.169.254/metadata/v1/id`
OutputMoving IP address: in-progress

ローカル端末で `+ curl +`コマンドによって生成された出力を監視することで、Floating IPが割り当てられたIPアドレスを変更し、数秒後に* secondary *ドロップレットを指すようになります。

OutputDroplet: primary, IP Address:
Droplet: primary, IP Address:
Droplet: secondary, IP Address:

ブラウザからフローティングIPアドレスにアクセスすることもできます。 *セカンダリ*ドロップレット情報を示すページが表示されます。 これは、再割り当てスクリプトが期待どおりに機能したことを意味します。

フローティングIPをプライマリサーバーに再割り当てするには、2段階のプロセスを繰り返しますが、今回は* primary *ドロップレットから:

export DO_TOKEN=
assign-ip  `curl -s http://169.254.169.254/metadata/v1/id`

数秒後、フローティングIPはプライマリドロップレットを再度指すようになります。

ステップ4-Corosync、PacemakerおよびPCSをインストールする

次のステップでは、Corosync、Pacemaker、PCSをドロップレットにインストールします。 CorosyncはPacemakerの依存関係であるため、通常はPacemakerをインストールし、インストールするCorosyncバージョンをシステムに決定させる方が良いでしょう。

*両方のサーバー*にソフトウェアパッケージをインストールします。

sudo yum install pacemaker pcs

PCSユーティリティは、インストール時に* hacluster *という名前の新しいシステムユーザーを作成し、パスワードを無効にします。 両方のサーバーでこのユーザーのパスワードを定義する必要があります。 これにより、PCSは、複数ノードでのCorosync構成の同期、クラスターの開始および停止などのタスクを実行できます。

*両方のサーバー*で、次を実行します。

passwd hacluster

両方のサーバーで*同じパスワード*を使用する必要があります。 次のステップで、このパスワードを使用してクラスターを構成します。

ステップ5-クラスターのセットアップ

両方のサーバーにCorosync、Pacemaker、およびPCSがインストールされたので、クラスターをセットアップできます。

PCSの有効化と起動

PCSデーモンを有効にして起動するには、*両方のサーバー*で次を実行します。

sudo systemctl enable pcsd.service
sudo systemctl start pcsd.service

各ノードのプライベートネットワークIPアドレスの取得

ネットワークのパフォーマンスとセキュリティを向上させるには、*プライベートネットワーク*を使用してノードを接続する必要があります。 DropletのプライベートネットワークIPアドレスを取得する最も簡単な方法は、メタデータサービスを使用することです。 各サーバーで、次のコマンドを実行します。

curl http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address && echo

このコマンドは、ログインしているDropletのプライベートネットワークIPアドレスを出力するだけです。 この情報は、DropletのページのDigitalOceanコントロールパネル([設定]タブの下)にもあります。

次の手順のために、両方のドロップレットからプライベートネットワークIPアドレスを収集します。

クラスターノードの認証

ユーザー名* hacluster *と手順3で定義した同じパスワードを使用して、クラスターノードを認証します。 各ノードのプライベートネットワークIPアドレスを提供する必要があります。 * primary *サーバーから、次を実行します。

sudo pcs cluster auth

次のような出力が得られるはずです。

OutputUsername: hacluster
Password:
: Authorized
: Authorized

Corosync設定の生成

まだ* primary *サーバーで、次のコマンドを使用してCorosync構成ファイルを生成します。

sudo pcs cluster setup --name  \

出力は次のようになります。

OutputShutting down pacemaker/corosync services...
Redirecting to /bin/systemctl stop  pacemaker.service
Redirecting to /bin/systemctl stop  corosync.service
Killing any remaining services...
Removing all cluster configuration files...
: Succeeded
: Succeeded
Synchronizing pcsd certificates on nodes , ...
: Success
: Success

Restaring pcsd on the nodes in order to reload the certificates...
: Success
: Success

これにより、 `+ pcs cluster setup `コマンドに提供されたパラメーターに基づいて、 ` / etc / corosync / corosync.conf +`にある新しい設定ファイルが生成されます。 この例では、クラスター名として* webcluster *を使用しましたが、任意の名前を使用できます。

クラスターの開始

セットアップしたクラスターを開始するには、* primary *サーバーから次のコマンドを実行します。

sudo pcs cluster start --all
Output: Starting Cluster...
: Starting Cluster...

これで、いずれかのサーバーで次のコマンドを実行して、両方のノードがクラスターに参加したことを確認できます。

sudo pcs status corosync
OutputMembership information
----------------------
   Nodeid      Votes Name
        2          1
        1          1  (local)

クラスタの現在のステータスに関する詳細情報を取得するには、次を実行できます。

sudo pcs cluster status

出力は次のようになります。

OutputCluster Status:
Last updated: Fri Dec 11 11:59:09 2015     Last change: Fri Dec 11 11:59:00 2015 by hacluster via crmd on secondary
Stack: corosync
Current DC: secondary (version 1.1.13-a14efad) - partition with quorum
2 nodes and 0 resources configured
Online: [ primary secondary ]

PCSD Status:
 primary (): Online
 secondary (): Online

これで、 `+ corosync `および ` pacemaker +`サービスを有効にして、システムの起動時に確実に開始できるようになりました。 両方のサーバーで以下を実行します

sudo systemctl enable corosync.service
sudo systemctl enable pacemaker.service

STONITHを無効にする

STONITH(ヘッドのもう一方のノードを撃つ)は、応答しないがまだアプリケーションデータにアクセスしているクラスター内の障害のあるノードによって引き起こされるデータ破損を防ぐためのフェンシング手法です。 その構成は、このガイドの範囲外のいくつかの要因に依存するため、クラスターのセットアップでSTONITHを無効にします。

STONITHを無効にするには、プライマリまたはセカンダリのいずれかのドロップレットで次のコマンドを実行します。

sudo pcs property set stonith-enabled=false

ステップ6-フローティングIP再割り当てリソースエージェントの作成

あとは、クラスタノードの1つで障害が検出されたときにIP再割り当てスクリプトを実行するリソースエージェントを設定するだけです。 リソースエージェントは、クラスターとリソース自体の間にインターフェイスを作成する役割を果たします。 この場合、リソースはassign-ipスクリプトです。 クラスターは、start、stop、またはmonitorコマンドが与えられたときに、リソースエージェントに依存して適切な手順を実行します。 リソースエージェントにはさまざまな種類がありますが、最も一般的なものはOCF(Open Cluster Framework)標準です。

両方のサーバーで* assign-ip *サービスを管理する新しいOCFリソースエージェントを作成します。

最初に、リソースエージェントを含むディレクトリを作成します。 ディレクトリ名は、このカスタムエージェントの識別子としてPacemakerによって使用されます。 両方のサーバーで以下を実行します

sudo mkdir /usr/lib/ocf/resource.d/digitalocean

次に、FloatIPリソースエージェントスクリプトをダウンロードし、*両方のサーバー*で新しく作成したディレクトリに配置します。

sudo curl -L -o /usr/lib/ocf/resource.d/digitalocean/floatip http://do.co/ocf-floatip

*両方のサーバー*で次のコマンドを使用してスクリプトを実行可能にします。

sudo chmod +x /usr/lib/ocf/resource.d/digitalocean/floatip

PCSユーティリティを使用して、クラスター内にリソースエージェントを登録する必要があります。 次のコマンドは、* one *のノードから実行する必要があります(DigitalOcean APIトークンと実際のフローティングIPアドレスで置き換えることを忘れないでください):

sudo pcs resource create FloatIP ocf:digitalocean:floatip \
   params do_token= \
   floating_ip=

これで、リソースがクラスターに登録され、アクティブになります。 `+ pcs status`コマンドを使用して、任意のノードから登録されたリソースを確認できます。

sudo pcs status
Output...
2 nodes and 1 resource configured

Online: [ primary secondary ]

Full list of resources:

FloatIP    (ocf::digitalocean:floatip):    Started primary

...

手順7-フェールオーバーのテスト

これで、クラスターはノード障害を処理する準備ができました。 フェールオーバーをテストする簡単な方法は、フローティングIPセットアップで現在アクティブなサーバーを再起動することです。 このチュートリアルのすべての手順を実行した場合、これは「プライマリ」サーバーになります。

繰り返しますが、ループで「+ curl +」コマンドを使用して、IPの再割り当てを監視しましょう。 ローカル端末から、次を実行します。

while true; do curl ; sleep 1; done
  • primary *サーバーから、再起動コマンドを実行します。

sudo reboot

しばらくすると、プライマリサーバーが使用できなくなります。 これにより、セカンダリサーバーがアクティブノードを引き継ぎます。 `+ curl +`を実行しているローカル端末で次のような出力が表示されるはずです。

Output...
Droplet: primary, IP Address:
Droplet: primary, IP Address:
curl: (7) Failed connect to floating_IP_address; Connection refused
Droplet: secondary, IP Address:
Droplet: secondary, IP Address:
…

セカンダリノードでフェールオーバーをテストしながら、フローティングIPをプライマリノードに戻す場合、今回は* secondary *ドロップレットからプロセスを繰り返します。

sudo reboot

結論

このガイドでは、フローティングIPをCorosync、Pacemaker、PCSとともに使用して、CentOS 7サーバー上で高可用性Webサーバー環境を作成する方法を説明しました。 フローティングIPの使用法を示すためにかなり単純なインフラストラクチャを使用しましたが、このセットアップを拡張して、アプリケーションスタックのどのレベルでも高可用性を実装できます。