###序章

Corosyncは、アプリケーション内に高可用性を実装するために使用されるオープンソースのクラスターエンジンです。 一般にメッセージングレイヤーと呼ばれるCorosyncは、複製されたステートマシンを作成するためのクラスターメンバーシップとクローズドコミュニケーションモデルを提供し、その上でPacemakerなどのクラスターリソースマネージャーを実行できます。 Corosyncは、クラスターノードを相互に接続する基盤となるシステムと見なすことができますが、Pacemakerはクラスターを監視し、障害が発生した場合にアクションを実行します。

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

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

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

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

##ステップ1—Nginxを設定する

処理を高速化するために、Nginxをインストールし、その特定のサーバーに関する情報を含む基本的なWebページを設定する単純なシェルスクリプトを使用します。 このようにして、フローティングIPセットアップで現在アクティブになっているサーバーを簡単に識別できます。 スクリプトは、DigitalOceanのメタデータサービスを使用して、ドロップレットのIPアドレスとホスト名をフェッチします。

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

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

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

このチュートリアルの複雑さを軽減するために、クラスターノードとして単純なWebサーバーを使用します。 実稼働環境では、ノードは通常、冗長ロードバランサーとして機能するように構成されます。 ロードバランサーの詳細については、HAProxyの概要と負荷分散の概念ガイドをご覧ください。

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

次のようなページが表示されます。

Floating IPs Control Panel

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

http://your_floating_ip

プライマリドロップレットのインデックスページが表示されます。 ##ステップ3— IP再割り当てスクリプトの作成このステップでは、DigitalOceanAPIを使用してフローティングIPを別のドロップレットに再割り当てする方法を示します。 後で、クラスターがノードの1つで障害を検出したときに、このスクリプトを実行するようにPacemakerを構成します。

この例では、指定されたドロップレットにフローティングIPを割り当てるために、引数としてフローティングIPアドレスとドロップレットIDを受け取る基本的なPythonスクリプトを使用します。 ドロップレットのIDは、メタデータサービスを使用してドロップレット自体から取得できます。

assign-ipスクリプトをダウンロードして、実行可能にすることから始めましょう。 ダウンロードする前に、スクリプトの内容を確認してください。

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

  1. sudo curl -L -o /usr/local/bin/assign-ip http://do.co/assign-ip
  2. 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アドレスにアクセスできます。

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

  1. while true; do curl floating_IP_address; sleep 1; done

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

Output
Droplet: primary, IP Address: primary_IP_address Droplet: primary, IP Address: primary_IP_address Droplet: primary, IP Address: primary_IP_address ...

次に、assign-ipスクリプトを実行して、フローティングIPをセカンダリドロップレットに再割り当てします。 DigitalOceanのメタデータサービスを使用して現在のドロップレットIDを取得し、それをスクリプトの引数として使用します。 メタデータサービスからのドロップレットのIDの取得は、次の方法で実行できます。

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

ここで、169.254.169.254はメタデータサービスによって使用される静的IPアドレスであるため、変更しないでください。 この情報は、Droplet自体からのみ入手できます。

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

  1. export DO_TOKEN=your_api_token

引き続きセカンダリサーバーで、assign-ipスクリプトを実行してfloating_IP_addressをフローティングIPアドレスに置き換えます。

  1. assign-ip floating_IP_address `curl -s http://169.254.169.254/metadata/v1/id`
Output
Moving IP address: in-progress

ローカル端末でcurlコマンドによって生成された出力を監視すると、フローティングIPが割り当てられたIPアドレスを変更し、数秒後にセカンダリドロップレットをポイントし始めることがわかります。

Output
Droplet: primary, IP Address: primary_IP_address Droplet: primary, IP Address: primary_IP_address Droplet: secondary, IP Address: secondary_IP_address

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

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

  1. export DO_TOKEN=your_api_token
  2. assign-ip floating_IP_address `curl -s http://169.254.169.254/metadata/v1/id`

数秒後、フローティングIPはプライマリドロップレットを再び指しているはずです。 ##ステップ4— Corosync、Pacemaker、およびPCSをインストールする次のステップは、Corosync、Pacemaker、およびPCSをドロップレットにインストールすることです。 CorosyncはPacemakerに依存しているため、通常はPacemakerをインストールして、インストールするCorosyncのバージョンをシステムに決定させることをお勧めします。

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

  1. sudo yum install pacemaker pcs

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

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

  1. passwd hacluster

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

ユーザーhaclusterには、アカウントに関連付けられた対話型シェルまたはホームディレクトリがありません。つまり、その資格情報を使用してサーバーにログインすることはできません。

##ステップ5—クラスターのセットアップ両方のサーバーにCorosync、Pacemaker、およびPCSがインストールされたので、クラスターをセットアップできます。 ### PCSの有効化と起動PCSデーモンを有効にして起動するには、両方のサーバーで次を実行します。

  1. sudo systemctl enable pcsd.service
  2. sudo systemctl start pcsd.service

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

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

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

次の手順のために、両方のドロップレットからプライベートネットワークのIPアドレスを収集します。 ###クラスターノードの認証ユーザー名haclusterと、手順3で定義したものと同じパスワードを使用してクラスターノードを認証します。 各ノードにプライベートネットワークのIPアドレスを指定する必要があります。 primary サーバーから、次のコマンドを実行します。

  1. sudo pcs cluster auth primary_private_IP_address secondary_private_IP_address

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

Output
Username: hacluster Password: primary_private_IP_address: Authorized secondary_private_IP_address: Authorized

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

  1. sudo pcs cluster setup --name webcluster \
  2. primary_private_IP_address secondary_private_IP_address

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

Output
Shutting 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... primary_private_IP_address: Succeeded secondary_private_IP_address: Succeeded Synchronizing pcsd certificates on nodes primary_private_IP_address, secondary_private_IP_address... primary_private_IP_address: Success secondary_private_IP_address: Success Restaring pcsd on the nodes in order to reload the certificates... primary_private_IP_address: Success secondary_private_IP_address: Success

これにより、pcs cluster setupコマンドに指定されたパラメーターに基づいて、/etc/corosync/corosync.confにある新しい構成ファイルが生成されます。 この例では、クラスター名として webcluster を使用しましたが、任意の名前を使用できます。 ###クラスターの開始セットアップしたクラスターを開始するには、primaryサーバーから次のコマンドを実行します。

  1. sudo pcs cluster start --all
Output
primary_private_IP_address: Starting Cluster... secondary_private_IP_address: Starting Cluster...

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

  1. sudo pcs status corosync
Output
Membership information ---------------------- Nodeid Votes Name 2 1 secondary_private_IP_address 1 1 primary_private_IP_address (local)

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

  1. sudo pcs cluster status

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

Output
Cluster 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 (primary_private_IP_address): Online secondary (secondary_private_IP_address): Online

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

  1. sudo systemctl enable corosync.service
  2. sudo systemctl enable pacemaker.service

### STONITHの無効化STONITH(Shoot The Other Node In the Head)は、応答しないがアプリケーションデータにアクセスしているクラスター内の障害のあるノードによって引き起こされるデータ破損を防ぐことを目的としたフェンシング手法です。 その構成は、このガイドの範囲外の多くの要因に依存するため、クラスターのセットアップでSTONITHを無効にします。

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

  1. sudo pcs property set stonith-enabled=false

##ステップ6—フローティングIP再割り当てリソースエージェントの作成あとは、クラスターノードの1つで障害が検出されたときに、IP再割り当てスクリプトを実行するリソースエージェントを構成するだけです。 リソースエージェントは、クラスターとリソース自体の間のインターフェイスを作成する責任があります。 この場合、リソースはassign-ipスクリプトです。 クラスタは、開始、停止、または監視コマンドが与えられたときに、リソースエージェントに依存して適切な手順を実行します。 リソースエージェントにはさまざまな種類がありますが、最も一般的なのはOCF(Open Cluster Framework)標準です。

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

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

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

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

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

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

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

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

  1. sudo pcs resource create FloatIP ocf:digitalocean:floatip \
  2. params do_token=your_api_token \
  3. floating_ip=floating_IP_address

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

  1. 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の再割り当てを監視しましょう。 ローカルターミナルから、次のコマンドを実行します。

  1. while true; do curl floating_IP_address; sleep 1; done

primary サーバーから、再起動コマンドを実行します。

  1. sudo reboot

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

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

「接続が拒否されました」エラーは、IPの再割り当てが行われる直前または同時に要求が行われた場合に発生します。 出力に表示される場合と表示されない場合があります。

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

  1. sudo reboot

##結論

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